2014-10-14 2 views
2
vector<double> data; 
string content; 
ifstream infile; 
infile.open("test.txt"); 
    while(getline(infile, content, ' ')) 
{ 
    atof(content.c_str()); 
    data.push_back(content); 
} 
infile.close(); 

여기에서 텍스트 파일의 문자열을 가져 와서 두 개로 벡터에 저장하려고합니다. 그러나 그것은 double이 아니기 때문에 'content'를 데이터 벡터로 푸시 할 수 없다는 오류가 발생합니다. 나는 두 가지를 시도해 본 결과 콘텐츠가 이중으로 변환되지 않는다는 일반적인 오류가 발생합니다. 따라서 터널 비전 때문에 간단한 오류를 발견하지 못했는지 또는 내가 누락 된 다른 것이 있는지 확실하지 않습니다. 어떤 도움을 주셔서 감사합니다.문자열을 double로 변환 한 다음 While 루프의 벡터로 푸시

+2

코드에는'atof'의 반환 값이 저장되지 않습니다. 또한 당신은'double d; while (infile >> d) {..}' –

+1

라이브러리 지원에 따라'std :: stod'도 있습니다. 단순히 스트림에서 더블 스트레이트를 읽기 위해서'>>'를 사용할 수도 있습니다. – user657267

답변

4

atofdouble를 반환, 그래서이 줄

atof(content.c_str()); 

는 단순히 결과를 무시합니다. 당신은 이런 식으로 작업을 수행 할 수 있습니다

double tmp = atof(content.c_str()); 
data.push_back(tmp); 

또는 C++에서 벡터로 파일을 읽는의 임시

data.push_back(atof(content.c_str())); 

개성있는 방법이없는

은 다음과 같이

back_insert_iterator< vector<double> > back_it(data); 
copy(istream_iterator<double>(infile) 
, istream_iterator<double>() 
, back_it); 

std::copy를 사용 함수를 입력 반복자와 루프를 숨기기위한 반복자 반복자와 함께 사용합니다. 당신이 벡터 선언과 파일 읽기를 결합 할 때 더욱이 단축 될 수 있습니다 :

vector<double> data(istream_iterator<double>(cin), (istream_iterator<double>())); // C++98 syntax 

또는

vector<double> data { istream_iterator<double>(cin), istream_iterator<double>() }; // C++11 syntax 

는 C++ (98) 구문은 most vexing parse를 파괴하는 괄호의 추가 쌍을 사용합니다.

+2

... 아니면 그냥'ifstream infile ("test.txt"); 벡터 데이터 {istream_iterator (infile), istream_iterator ()}; ' –

+1

@JerryCoffin 좋은 의견에 감사드립니다! – dasblinkenlight

+0

그게 바로 임시 값을 사용해야한다는 사실을 잊어 버렸기 때문에 그것이 왜 문제인지 훨씬 더 이해가됩니다. 나는 너의 것과 다른 모든 사람들에게 정말로 감사한다. – TheOneTrueSign