我想知道是否以及为什么seekg(0)不应该清除流的eofbit.
我已经阅读了所有流,因此已达到EOF(但尚未设置failbit)并且想要将seekg()返回到有效位置并再次读取一些字符.在这种情况下,seekg(0)似乎与eofbit集合“工作”,但是一旦我尝试从流中读取,就会设置failbit.这是逻辑,正确还是我的实施不好?我是否应该认识到这种情况并手动清除eofbit(如果未设置failbit)?
我已经阅读了所有流,因此已达到EOF(但尚未设置failbit)并且想要将seekg()返回到有效位置并再次读取一些字符.在这种情况下,seekg(0)似乎与eofbit集合“工作”,但是一旦我尝试从流中读取,就会设置failbit.这是逻辑,正确还是我的实施不好?我是否应该认识到这种情况并手动清除eofbit(如果未设置failbit)?
编辑:
读者提供的以下程序在我的实现中给出了不同的结果(mingw32-c .exe(TDM-2 mingw32)4.4.1):
#include <sstream> #include <iostream> #include <string> int main() { std::istringstream foo("AAA"); std::string a; foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 foo.seekg(0); std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 }
1 0 1 0 1 1 1 1
解决方法
根据新标准,clear()应该重置eofbit(第27.7.2.3节):
basic_istream<charT,traits>& seekg(pos_type pos);
Effects: Behaves as an unformatted input function …,except that the function first clears
eofbit
…
但是在旧标准(§27.6.1.3)中没有提到清除eofbit!
还有一个简单的测试:
#include <sstream> #include <iostream> #include <string> int main() { std::istringstream foo("AAA"); std::string a; foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 foo.seekg(0); std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 foo >> a; std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 }