我想知道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
}
以上评论来自在其实施中尝试该程序的用户。我得到了这些结果:
1 0
1 0
1 1
1 1
答案 0 :(得分:3)
根据新标准clear()
应该重置eofbit
(第27.7.2.3节):
basic_istream<charT,traits>& seekg(pos_type pos);
效果:表现为无格式的输入函数...,除了该函数首先清除
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
}
答案 1 :(得分:0)
为什么不只是手动清除()流然后在设置eofbit后返回?已达到EOF,为什么要自动清除?这样做似乎会导致更多问题。