fstream 의 eof에 관해서 질문합니다.
글쓴이: wjdtlsckfu / 작성시간: 토, 2014/01/11 - 11:02오후
파일 인풋을 받는데 파일의 마지막 라인이 두번 읽힙니다. 왜그런건가요?
std::ifstream files(file); while(!files.eof()) { if(cycle==0) files>>v1>>v2; else { files>>v1>>v2>>w; std::cout<<v1<<" "<<v2<<" "<<w<<std::endl; } ++cycle; }
input.txt는 이렇게 생겼습니다.
7 8
0 1 1
0 2 5
1 3 2
1 4 3
2 5 6
3 6 7
4 6 4
5 6 8
code를 간단하게 옮겨적다보니.. 이해하시기 어려울지도 모르겠네요. 일단 문제는 인풋을 저장해서 처리하는데에 있는게 아니라 인풋자체가 중복되서 들어 온다는것에 있음은 확실합니다.
왜 이러는걸까요 ? 도와주세요.
Forums:
ios::eof()는 해당 stream에 eof
ios::eof()는 해당 stream에 eof state flag이 set되었다면 true를 리턴합니다. eof state flag을 set하는 것은 여러 reading member 함수에서 합니다.
마지막 줄을 "files>>v1>>v2>>w;"로 읽었을때, 원하는 데이터를 다 읽은 상태이기 때문에 eof state flag은 그대로 false입니다. 따라서 loop를 한 번 더 돌게 되며, 이 때 따로 error checking을 안했기 때문에, 이전 loop 돌때 기록되었던 v1, v2, w를 그대로 출력한 상태입니다.
1) 내용을 모르는 파일을 읽을 때에는 계속 에러 check를 해야 합니다. "files >> v1 >> v2 >> w"처럼, 세개의 데이터를 읽는데, 제대로 읽은 것인지 에러 checking을 하지 않았기 때문에, 이런 버그가 발생합니다.
2) 1에서 error check를 했다면, 궃이 eof()를 쓸 필요가 없습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
std::ifstream files(file);
댓글 달기