2013-04-30 2 views
0

안녕하세요, 저는 현재 프로그램을 작성했지만 파일을 읽는 데 문제가 있습니다. 결과적으로 동일한 결과를 두 번 생성하는 것은 마지막 줄을 두 번 읽은 것 같습니다.입력 파일 읽기 오류

변수 G에 대한 문자열을 저장하기 위해 getline() 함수를 첫 번째 행을 읽었습니다. 나머지는 클래스 객체의 벡터에 저장했습니다.

는 기본적으로 파일이 열리고 그것은

file.open("bodies1.txt"); 
getline(file, G1); 
.... 


while(!file.eof) 
{ 
    file >> body; 
    bodies.push_back(body); 
} 

이가이 루프를 수행하는 것 같은 텍스트 파일보기 (이것은 단지 샘플입니다.이 아니라 실제 일) 정말

0.02932 
Sun 32 42 53 2 2 
Moon 49 32 4 2 1 
Jupiter 32 53 2 3 2 

내가 마지막 줄을 두 번 읽는 이유가 궁금합니다. 어떤 제안?

+1

@JesseGood 나는 EOF가 문제 라는데 동의한다. 나는이 질문이 그 질문의 중복임을 확신하지 못한다. 그 대답은 그들의 문제를 해결할 것입니다. – AlexLordThorsen

+0

@Rawrgulmuffins : C++ 안티 패턴 'while (! file.eof)'과 관련된 문제는 매우 일반적입니다. 해당 질문에 얼마나 많은 중복이 연결되어 있는지 확인하십시오. –

답변

1
while(!file.eof()) 
{ 
    file >> body; 
    bodies.push_back(body); 
} 

body에 마지막 객체를 읽은 후, eof다음 문자입니다. 그런 다음

file >> body; 

은 읽기를 시도하고 실패합니다. 따라서 body에 있었고 그 전에는 여전히이며 벡터에 푸시됩니다.


대신 당신은

while(file >> body) 
{ 
    bodies.push_back(body); 
} 

당신의 동안은 가능한 빨리 eof()가 발생하고이 벡터에 추가 푸시을하지 않으므로 중단이 방법처럼 읽어야한다.

+0

좋습니다. 그것은 eof를 읽는 방법이 이상합니다. 그것이 문자라는 것을 결코 알지 못했다 – user2188311

+0

@ user2188311 아니, 사실 eof()에 관한 것이 아니다. 그것은 언제 읽을 지에 관한 것입니다. 첫 번째 경우에는 루프 본문에서 읽습니다. 따라서 eof를 치더라도 나머지 루프는 여전히 실행됩니다. 그것에 대해 생각 해봐 :) – stardust

+0

아, 괜찮아. 고맙습니다 – user2188311