wcin
wcout
wcerr
是对应标准流cin
,cout
,cerr
的宽字符版本的流对象
不能对流(IO)对象赋值或拷贝 因此也不能将返回类型或者形参类型设置成流类型
进行IO操作的函数通常用引用方式传递和返回流
IO状态使用3位比特的条件状态表示:
条件状态 | 二进制码 | 状态含义 |
---|---|---|
badbit |
001 |
流崩溃 系统级错误 如不可恢复的读写错误 此时流已无法再使用 |
eofbit |
010 |
文件结束 |
failbit |
100 |
一个IO操作失败 可恢复错误 如读取了错误类型的数据 |
goodbit |
000 |
成功 表示流未发生错误 |
当到达文件结束位置 eofbit
和failbit
都会被置位(设为1)
利用流的函数可以返回状态:
s.eof()
s.fail()
s.bad()
s.good()
s.rdstate()
可以返回完整的条件状态
s.setstate()
可以设置条件状态
通过输出缓冲可以将多个输出操作组合为单一的设备写操作 从而节省大量IO耗时
导致缓冲刷新的原因:
- 程序正常结束 作为
main
函数中return
的一部分 缓冲刷新 - 缓冲区满
- 使用操纵符
- 比如
endl
(额外换行)flush
(无额外字符)ends
(额外空格) - 使用
unitbuf
操纵符会使得接下来每次写操作都执行flush
操作 - 使用
nounitbuf
则重置流恢复正常刷新机制
- 比如
- 读写被关联的流时, 关联到的流的缓冲区会被刷新
当程序崩溃时 输出缓冲区不会刷新 因此需要确认最后输出的数据是否正确 因为可能尚未打印
使用.tie()
函数可以关联流 cin.tie(&cout);
打开文件流
//构造文件流对象时同时打开
fstream sin(str);
//或者先构造流再打开
fstream sin;
in.open(str)
对一个已经打开的 文件流调用open
会失败
文件模式:
in
只读out
只写app
追加模式, 每次写操作时定位至文件末尾ate
打开文件后立刻定位到文件末尾binary
二进制形式trunc
截断文件(即删除原有内容)
保存ofstream打开的文件中已有数据的唯一方式是显式指定文件模式为app
或in
当需要处理整行文本时 部分工作需要处理行内的单词
通常可以使用string
流 istringstream
当我们需要逐步构造输出 希望最后一起打印时 ostringstream
很有用 可以将其作为类似缓存用
ostringstream sout;
for(int i=0;i<10;i++){
sout<<" "<<str(i);
}
cout<<sout.str()<<endl;
像流一样使用它 通过.str()
可以访问它的字符串