왜 루프 안에 iostream::eof를 쓰면 안 되나요?
조회수 4107회
조건문 안에서 iostream::eof
를 쓰는 건 안 좋은 방법이라고 하던데
저는 보통 while( cin >> n )
같이 써서 EOF
를 확인하거든요.
근데 왜 iostream::eof
를 직접 써서 확인하면 안 되나요?
C
에서 scanf("...",...)!=EOF
로 쓰는 거랑은 뭐가 다른 건가요?
1 답변
-
iostream::eof
는 stream의 end를 읽은 후에(io가 발생한 후에) 설정되기 때문입니다. 이게 무슨 의미인 지는 다음 예제에서 설명해드리겠습니다.iostream::eof
로 조건문을 검사하는 경우while(!inStream.eof()){ //while문에 접근했다는 것은 - 아직 eof가 아님 inStream >> data; // 이제 eof가 set -> data가 올바른 값이 아님 /* data 처리 -> error */ }
반면에 다음과 같은 상황에서는
i/o 발생과 동시에 조건문 검사
while(inStream >> data){ // while안에 진입했다는 의미는, read가 성공적이었다는 것을 의미(eof가 아님) // 만약 실패했다면, operator >>가 false를 return하므로 while에 진입하지 못함 /* data 처리 -> ok */ }
이기 때문에 안전하지요.
그리고 두 번째 질문에 대해서는
if(scanf("...",...)!=EOF)
=if(!(inStream >> data).eof())
!=if(!inStream.eof()) inFile >> data
입니다. 따라서
scanf("...",...)!=EOF
는 써도 안전한 방법입니다.
댓글 입력