2012-01-06 5 views
2

방금 ​​C++에서 궁금한 상황이 발생했습니다. 나는 다음과 같은 것을하고 있었다 :istream :: peek 호기심 행동 wrt. EOF

istream in; 
// ... 
in.get();  // get a char (which turns out to be the last) 
       // curiously ios::eof bit doesn't get set just yet 

c = in.peek(); // attempt to peek, return EOF and now set ios::eof bit 

if(c == EOF) { 
    // realize shouldn't have gotten the last char for some reason 
    in.unget(): // attempt to unget, *fails* (because ios:eof bit was set) 
} 

나는 왜 peek가 eof 비트를 설정하는지 궁금하다. 나는 이것을 매우 비 직관적이라고 생각한다. 단지 실제로 들여다 보지 않고 스트림 상태를 변경해서는 안됩니다. 또한, unget가 왜 작동하지 않는 이유는 무엇입니까? good()이 거짓 일 때 표준에서 모든 작업을 마칠 수 없습니까?

답변

4
in.get();  // get a char (which turns out to be the last) 
       // curiously ios::eof bit doesn't get set just yet 

이 "호기심"이 아니다. 스트림의 EOF 비트는 이 eof에 도달하여 실패 할 때 설정됩니다. 그것은 이 아닙니다.은 "마지막 읽기가 우리를 eof로 데려갔습니다"라고 의미합니다.

지금처럼
c = in.peek(); // attempt to peek, return EOF and now set ios::eof bit 

.

또한 unget은 왜 작동하지 않습니까? good()이 거짓 일 때 표준에서 모든 작업을 마칠 수 없습니까?

... 무슨 일이 일어나고 있는지. 그렇지 않으면 "작동하지 않는다"는 정의에 실패했습니다.

당신은 EOF에 도달 할 때 당신이 그 문자를 unget하려면 자신이, 당신은 3

istream in; 
// ... 
in.get();  // assume this succeeds (*) 

c = in.peek(); // assume this fails and sets EOF bit 

if (!in) { 
    in.clear(); // clear stream error state for use 
    in.unget(); // "put back" that character (*) 
} 
else { 
    // next char from .get() will be equal to `c` 
} 
+0

당신의 대답은 종류의 복잡하고 불분명 나에게 줄에 검색 스트림의 상태를 취소해야합니다. 나는 (실수로) eof 비트가 스트림의 현재 위치가 * 끝에 있음을 나타내는 것으로 가정합니다. 코드가 eof 비트 만 지우지는 않습니다. 또한'EOF'를 반환 한'peek' 이후'unget'은 의미가 없다고 말하는 근거는 무엇입니까? –

+0

@ 지오 바니 푼샬 : 그렇게 느낀 것에 대해 유감입니다. 'peek'이 스트림에서 캐릭터를 생성하지 못하면 (검색 할 것이 더 이상 없기 때문에),'unget'을 수행하는 것이 어떻게 의미가 있습니까? 탈옥 할 것은 없습니다. 스트림에서 캐릭터를 산출하지 못했습니다. 그리고 스트림 상태 지우기에 대한 귀하의 의견은 ... 나는 그것이 왜 당신에게 문제가 될지 전혀 모릅니다. –

+3

eof() 플래그는 스트림이 마지막 문자를지나 읽으려고했음을 나타냅니다. 마지막 문자를 읽으려고 시도하기 전에 스트림은 마지막 문자임을 알지 못합니다. 이 플래그는 읽기가 실패한 이유를 탐지하는 데 유용합니다. 전체 파일을 소비했기 때문에 오류를보고하고 싶지 않습니다. –