为什么不搜索(0)清除流的eof状态?

时间:2012-04-13 12:43:56

标签: c++ iostream

我想知道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

2 个答案:

答案 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,为什么要自动清除?这样做似乎会导致更多问题。