2014-04-06 3 views
3

그래서 while 루프를 사용하여 벡터로 텍스트 파일의 데이터를 읽습니다.while 루프를 사용하여 텍스트 파일에서 데이터 읽기

원래 나는이 방법을 설정 코드를했다 :

iftream infile; 
while(infile) // or even if i do while(!infile.eof()) 
    { 
     infile>>data; 
     vector1.push_back(data); //adding data in to the vector 
    } 

을 - 그러나 이것은 어떤 이유로 두 번 텍스트 파일의 마지막 항목에 읽어 하나의 작은 문제가 발생했습니다.

하지만이 방법은 모든 것을 코드 세트가있는 경우 잘 작동 :

iftream infile; 
while(infile>>data) 
{ 
    vector1.push_back(data); //adding data in to the vector 
} 

왜 첫 번째 코드가 두 번 마지막 항목에서 읽고 있는가?

+1

마지막 항목을 두 번 읽지 않습니다. 오히려 * 가장 최근에 읽은 * ** 실패 ** 사실을 무시한 다음 마지막으로 성공한 반복에서 읽기를 맹목적으로 삽입합니다. 추출의 성공 여부를 루프의 조건으로 테스트함으로써 문제를 피할 수 있습니다. 즉, 사용하기 전에 추출물의 유효성을 검사하십시오 (두 번째 코드 단편과 첫 번째 코드 단편은 * 않습니다 *). – WhozCraig

+0

@WhozCraig 첫 번째 스 니펫이 있더라도 .. while 루프는 읽지 않아도 될 것입니다. 반면 while (! infile.eof())는 파일의 끝이 아니라 루프를 수행한다는 것을 의미하지만 파일 끝에는 루프를 건너 뜁니다. .. – psj01

+0

아닙니다. 링크 된 복제본은 솔직히 왜 루프 제어에서 eof 또는 eof-logic을 사용하지 않는지에 대한 가장 좋은 설명입니다. 'inifile'이라는 표현은'! inifile.fail()'과 동의어로 bad-bit 나 fail-bit가 설정되어 있지 않은 한 사실입니다. 어느 것도 아직 설정되지 않았기 때문에 (당신은 * eof를 넘어서서 읽으 려하지 않았고 다른 실패는 없었습니다), 그 표현은 여전히 ​​사실입니다. – WhozCraig

답변

3

data 구조가 파일 내에 완전히 정렬되어 있지 않은 것처럼 보입니다. 즉, 프로그램이 마지막 조각을 읽으려고 시도했지만 아직 파일 끝에 도달하지 않았지만 읽을 데이터가 충분하지 않은 것 같습니다. 따라서 infile >> data이 실패하면 data의 내용이 변경되지 않았으므로 벡터에 다시 추가한다는 의미입니다.

두 번째 경우에는 읽은 결과를 확인하므로 올바르게 읽지 않은 경우 data 내용을 푸시하지 않습니다.

+0

하지만 while (infile)이 참이면 루프에만 들어가야하기 때문에 while 루프 안에 어떻게 들어갈 수 있습니까? 다음에 읽을 내용이 없으면 루프를 건너 뛸 필요가 있습니까? 그건 내 논리였습니다. – psj01

+0

필자는 (데이터 구조체의 내용과 파일 내용을 보지 않고 수행 할 수있는 유일한 방법) 파일 끝에 아직 도달하지 않았 음을 (예 : 거기에 몇 개의 공백이 있거나 뭔가가 있음) 추측합니다. 다음 데이터 청크를 읽으려고 시도하고 실패합니다. – Ashalynd

관련 문제