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()
이 거짓 일 때 표준에서 모든 작업을 마칠 수 없습니까?
당신의 대답은 종류의 복잡하고 불분명 나에게 줄에 검색 스트림의 상태를 취소해야합니다. 나는 (실수로) eof 비트가 스트림의 현재 위치가 * 끝에 있음을 나타내는 것으로 가정합니다. 코드가 eof 비트 만 지우지는 않습니다. 또한'EOF'를 반환 한'peek' 이후'unget'은 의미가 없다고 말하는 근거는 무엇입니까? –
@ 지오 바니 푼샬 : 그렇게 느낀 것에 대해 유감입니다. 'peek'이 스트림에서 캐릭터를 생성하지 못하면 (검색 할 것이 더 이상 없기 때문에),'unget'을 수행하는 것이 어떻게 의미가 있습니까? 탈옥 할 것은 없습니다. 스트림에서 캐릭터를 산출하지 못했습니다. 그리고 스트림 상태 지우기에 대한 귀하의 의견은 ... 나는 그것이 왜 당신에게 문제가 될지 전혀 모릅니다. –
eof() 플래그는 스트림이 마지막 문자를지나 읽으려고했음을 나타냅니다. 마지막 문자를 읽으려고 시도하기 전에 스트림은 마지막 문자임을 알지 못합니다. 이 플래그는 읽기가 실패한 이유를 탐지하는 데 유용합니다. 전체 파일을 소비했기 때문에 오류를보고하고 싶지 않습니다. –