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

조회수 4156회

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

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

1 답변

  • 좋아요

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)