C++에서 파일을 읽을 때 stream.eof()를 반복문 조건으로 사용하는 코드를 종종 볼 수 있습니다. 하지만 이 방식은 잘못된 패턴으로 간주됩니다. 핵심 이유는 간단합니다. 아직 EOF(파일 끝)에 도달하지 않았다고 해서 다음 읽기가 반드시 성공하는 것은 아니기 때문입니다.
eof() 검사의 문제점
ifstream 같은 파일 스트림으로 파일을 읽는 상황을 생각해 봅시다. 반복문에서 myFile.eof()를 조건으로 검사하면, 이는 "이미 파일 끝에 도달했는가?"라는 질문일 뿐입니다. 즉, 읽기 시도가 실제로 실패한 후에야 eof 플래그가 설정되므로, 존재하지 않는 데이터를 한 번 더 처리하게 되는 문제가 발생할 수 있습니다.
그래서 이 방식으로 코드를 작성하면 아래처럼 매번 결과의 유효성을 다시 확인해야 하는 번거로움이 생깁니다.
잘못된 예제
#include<iostream>
#include<fstream>
using namespace std;
int main() {
ifstream myFile("myfile.txt");
string x;
while(!myFile.eof()) {
myFile >> x;
// x가 유효한지, 또는 eof에 도달했는지 다시 확인해야 함
if(x) {
// x로 원하는 작업 수행
}
}
}
올바른 방법: 스트림 자체를 조건으로 사용
반면 스트림 객체를 반복문 조건에 직접 사용하면 이야기가 달라집니다. myFile >> x는 읽기에 성공하면 참으로 평가되는 값을 반환하고, 실패하면 거짓으로 평가됩니다. 따라서 읽기 성공 여부가 곧 조건 판정이 되므로, 이중 검사가 전혀 필요 없습니다.
권장 예제
#include<iostream>
#include<fstream>
using namespace std;
int main() {
ifstream myFile("myfile.txt");
string x;
while(myFile >> x) {
// x로 원하는 작업 수행
// 추가 검사 불필요!
}
}
정리
eof()는 미래의 읽기 성공 여부를 예측하는 함수가 아니라, 이미 발생한 실패를 알려주는 플래그입니다. 따라서 반복문 조건에서는 while(myFile >> x)처럼 읽기 연산 자체를 조건으로 사용하는 것이 가장 안전하고 관용적인 C++ 스타일입니다.