[C++学习笔记] IO

wcin wcout wcerr 是对应标准流cincoutcerr的宽字符版本的流对象

不能对流(IO)对象赋值或拷贝 因此也不能将返回类型或者形参类型设置成流类型

进行IO操作的函数通常用引用方式传递和返回流

IO状态使用3位比特的条件状态表示:

条件状态 二进制码 状态含义
badbit 001 流崩溃 系统级错误 如不可恢复的读写错误 此时流已无法再使用
eofbit 010 文件结束
failbit 100 一个IO操作失败 可恢复错误 如读取了错误类型的数据
goodbit 000 成功 表示流未发生错误

当到达文件结束位置 eofbitfailbit都会被置位(设为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打开的文件中已有数据的唯一方式是显式指定文件模式为appin

当需要处理整行文本时 部分工作需要处理行内的单词
通常可以使用stringistringstream

当我们需要逐步构造输出 希望最后一起打印时 ostringstream很有用 可以将其作为类似缓存用

ostringstream sout;
for(int i=0;i<10;i++){
	sout<<" "<<str(i);
}
cout<<sout.str()<<endl;

像流一样使用它 通过.str()可以访问它的字符串