有关iostream的bitstate.
#include <iostream>
using namespace std;
int main()
{
cout.clear(ios_base::eofbit);
//or:
//cout.setstate(cin.failbit);
if(cout)
cout << "ok" << endl;
else cout << "fail" << endl;
system("PAUSE");
}
1>为什么io流的位状态是静态定义在ios_base中呢?
我觉得如果istream对象位状态损坏了不会影响ostream对象正常工作呀
反之也是一样.但这样的话cin我让它失败导致cout也无法工作了.这两个类应该不要去关联起来吧?
2>上面的cout.clear(ios_base::eofbit);也会导致cout失败,为什么呢?
我看istream继承的operator void *()是这样定义的:
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
而fail()成功时只会是发生badbit,failbit被设置的情况下呀.在eofbit被设置时不会影响它吧?能解释一下吗?
问题点数:20、回复次数:4Top
1 楼diaoni(三条腿的废柴)回复于 2004-05-04 02:50:50 得分 20
1.goodbit,failbit,eofbit,badbit只是用来表示当前stream对象的状态的一些常量,对由其派生的所有stream对象通用,当然是放在ios_base中啦
“cin我让它失败导致cout也无法工作了”会吗?举个例子,我没试过。
2.cout.clear(ios_base::eofbit);
此时对cout进行条件判定的结果一定为true,与operator void* ()的结果一致
但之后对cout的使用将不会有任何输出(如:cout<<"hello"<<endl;),因为cout已被标志为
eof,所以它将不会执行任何对其缓冲区的读操作
假如这样写:
if(cout)
{
cout.clear();
cout<<"ok"<<endl;
}
就没问题了Top
2 楼THEBEST(你厉害!)回复于 2004-05-04 20:28:02 得分 0
1>
哦第一个问题是我搞错了,不是cin设置失败cout没用.
它是有用,但我想知道它们的状态是静态定义的.不是只有一份实例吗?
怎么又分别在cin,cout中不同呢?
第二个问题我没想到我已经设置了eof.:)
Top
3 楼THEBEST(你厉害!)回复于 2004-05-05 15:49:00 得分 0
能解释一下么?Top
4 楼THEBEST(你厉害!)回复于 2004-05-07 21:13:40 得分 0
没人解释?Top




