第八章 标准IO库
wchar_t 宽字符,是4个字节长度。
流对象是不能复制的,而只有支持复制的对象才可以放入stl的容器中。
流的状态有bad(系统级别故障,如无法恢复的读写错误,基本上该流就不可以继续使用了),fail(这个比较常见,比如要求输入数字但是输入了字符导致的错误),eof(遇到文件结尾才会设置),good(不用解释了)
另外badbit的数值是001。goodbit是000,failbit是010,唯一需要注意的是eofbit是110 。所以如果是ctrl+d出现的eof,那么在检验cin.fail()时也一样成立。
第四版的书,按理说也不应该过时呀,怎么书上的例子却是错的呢。248页的例子代码又2处问题。第一cin.clear(istream::failbit)应该为cin.clear(istream::goodbit)或者直接cin.clear() 。第二在clear后面应该跟上一个cin.ignore()来忽略上一次输入的值,否则在输入字符以后就是死循环了。
clear的名字命名有问题,这个其实是set,就是将目前的状态重置为参数表达的状态。
setstate其实是addstate,就是增加一种状态,也就是把0置成1,但不会修改已经为1的值。
fail()包括eof()
ignore()忽略上次的输入,一般放在恢复状态后用。
正确的写法:
try
{
int ival;
while(cin>>ival,!cin.eof())
{
if(cin.bad())
throw runtime_error("IO stream corrupted");
if(cin.fail())
{
cin.clear(istream::goodbit);
cin.ignore();
continue;
}
}
}
catch(range_error err)//runtime_error err)
{
cout<<err.what()<<endl;
}
输出流的刷新
用流输出屏幕,内容可能在缓冲区里,如果程序崩溃可能不会输出屏幕,这里可以用<<flush(打印缓冲区内容) , <<ends (加一个NULL,打印缓冲区内容), <<endl (加一个换行符,打印缓冲区内容), <<unitbuf<<"123"<<nounitbuf (等同flush)来输出缓冲区里的内容到屏幕。
另外一个方法是用cin.tie(&cout)把输入输出绑在一起,当输入的时候自动刷新缓冲区。
如果是printf也是先写缓冲区,可以用fflush来刷新。
后面提供了来读取文件。流的判断很有趣,可以直接用if(!stream1)来判断打开文件是否成功,但它其实并不是空,可能是重载了等于操作吧。
第九章 顺序容器
1