본문 바로가기

Application-level프로그래밍

(C++) 스트림 클래스의 eof() 의 리턴값


스트림의 끝이면 true를 반환한다.

그러나 이 '끝'에 도달하기 위해서는 
읽을 게 없는 스트림 위치에서 한번 더 읽는 시도를 해야(read() 나 get() 멤버호출) 도달한다.
예를 들어,
10개 레코드가 저장된 이진파일스트림에서 레코드를 10번 순차적으로 읽은 후 eof()호출할 시 false 가 반환되며,
그 다음 읽기 함수를 호출하고 난 뒤에야(물론 이때 읽기 함수는 오류를 반환하면서 리턴될 것이다)
eof() 호출 시 true가 반환된다.

여기에 허접한 예제 코드 하나(나 이외에는 참고하지 말 것).

이 코드에서 반복문의 종료조건은 어떻게든 줘도 되겠지만,  read() 호출 후 eof() 점검을 하는 if문이 없으면
read()호출이 실패했을 때(예를 들면 끝을 만나서 읽을 게 없을 경우)
이전 반복문으로 저장되었던 oneRecord 변수의 값을 이용하게 되므로 오류가 생긴다.
	while(!data.eof())
	{
			data.read((char*)&oneRecord,sizeof(double));
			if(!data.eof())
			{
				dSum+=oneRecord;
				++numRecords;
			}
	}