왜 루프 안에 iostream::eof를 쓰면 안 되나요?


조건문 안에서 iostream::eof를 쓰는 건 안 좋은 방법이라고 하던데 저는 보통 while( cin >> n )같이 써서 EOF를 확인하거든요. 근데 왜 iostream::eof를 직접 써서 확인하면 안 되나요?

C에서 scanf("...",...)!=EOF 로 쓰는 거랑은 뭐가 다른 건가요?

  • 2016년 01월 13일에 작성됨

조회수 286


1 답변


좋아요
0
싫어요
채택취소하기

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 는 써도 안전한 방법입니다.

  • 2016년 01월 13일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close