8

我想知道是否以及为什么seekg(0)不应该清除eofbit流。我现在已经阅读了所有流,因此EOF已经到达(但failbit尚未设置)并且想要返回seekg()到有效位置并再次读取一些字符。在这种情况下seekg(0),似乎可以“使用”该eofbit集合,但是一旦我尝试从流中读取,就会设置故障位。这个逻辑是正确的还是我的实施不好?我是否应该识别这种情况并手动清除 eofbit(如果未设置故障位)?

编辑:

读者提供的以下程序在我的实现中给出了不同的结果( 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
4

2 回答 2

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
}
于 2012-04-13T12:52:42.407 回答
0

为什么不手动 clear() 流然后在设置 eofbit 后返回?已达到EOF,为什么要自动清除它?这样做似乎会导致更多问题。

于 2012-04-13T12:49:38.117 回答