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

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

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

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.