+ -
当前位置:首页 → 问答吧 → 关于IO标准库中的一点不明白

关于IO标准库中的一点不明白

时间:2011-12-05

来源:互联网

看C++Primer中写到对于IO标准库的条件状态查询相关章节时候有以下困惑:

istream::clear()是将所有状态都设置为有效
istream::clear(flag)是将flag位设置有效

书中的例子
[color=#3366FF]
 C/C++ code
int ival;
while(cin >> ival, !cin.eof())
{
      if(cin.bad())
     {
      trhow runtime_error("Io stream corrupt");  
     }
     if(cin.fail())
     {
     cerr << "bad data., try again" << endl;
     cin.clear(istream::failbit); [color=#FF0000]//reset the stream[/color]
     continue;
     }
}
[/color]

看代码上下文以及注释的意思,应该是clear掉failbit的标志位,使得流变得重新可用。随后我模仿写了一个代码验证

C/C++ code
#include <stdexcept>

using namespace std;

std::istream & read2end(std::istream &in)
{
        string input;
        while(in >> input, !in.eof())
        {   
            if(in.bad())
            {   
                throw runtime_error("In stream corrupt\n");
            }   
            if(cin.fail())
            {   
                cerr << "Bad input, retry again\n";
                in.clear(istream::failbit);
                continue;
            }   
            cout << input << endl;
        }   
        if(in.eof())
        {   
            cout << "Enter into " << __func__<< __LINE__ << endl;
#if 0
            in.clear(istream::eofbit);
#else
            in.clear(istream::goodbit);
#endif
            cout << "Enter out " << __func__ << __LINE__ << endl;
        }   
        if(in.good())
        {   
            cout << "Enter into " << __func__<< __LINE__ << endl;
            cout << "Enter out " << __func__ << __LINE__ << endl;
        }   
    return in; 
}

int main(int argc, const char *argv[])
{
    while(1)
    {   
        read2end(cin);
    }   
    return 0;
}


Linux 平台, G++编译
运行时候发现:
如果使用clear(istream::eofbit), 则后面的测试good()无效
如果使用clear(istream::goodbit), 则后面的测试good()有效

这样看来clear应该是置位,那么书中的代码就不对了啊?而且和setstate的作用不是重复了么?

作者: CodindWalker   发布时间: 2011-12-05

楼主,C++流的知识请去寻找《C++标准输入输出流与本地化》
C++ primer在这个方面有很多错误。
另外,永远只用clear()就可以了,别浪费生命讨论其它细节,那个本来就不是给你用的,是库的实现者用的

作者: taodm   发布时间: 2011-12-05

楼主说对了,这还真是书中的一个错误,哈哈

作者: mstlq   发布时间: 2011-12-05

引用 1 楼 taodm 的回复:

楼主,C++流的知识请去寻找《C++标准输入输出流与本地化》
C++ primer在这个方面有很多错误。
另外,永远只用clear()就可以了,别浪费生命讨论其它细节,那个本来就不是给你用的,是库的实现者用的


谢谢,看来经典不意味着就没有错误啊

作者: CodindWalker   发布时间: 2011-12-05