我想知道是否以及为什么seekg(0)不应该清除eofbit流.我已经阅读了所有的流,因此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
}
Run Code Online (Sandbox Code Playgroud)
以上评论来自在其实施中尝试该程序的用户.我得到了这些结果:
1 0
1 0
1 1
1 1
Run Code Online (Sandbox Code Playgroud)
根据新标准clear()应该重置eofbit(\xc2\xa7 27.7.2.3):
\n\n\n
basic_istream<charT,traits>& seekg(pos_type pos);效果:表现为未格式化的输入函数...,除了函数 \xef\xac\x81rst 清除
\neofbit...
但在旧标准(\xc2\xa7 27.6.1.3)中没有提到清除eofbit!
和一个简单的测试:
\n#include <sstream>\n#include <iostream>\n#include <string>\n\nint main() {\n std::istringstream foo("AAA");\n std::string a;\n foo >> a;\n std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0\n foo.seekg(0);\n std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0\n foo >> a;\n std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0\n foo >> a;\n std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1\n}\nRun Code Online (Sandbox Code Playgroud)\n