C++ Primer -第八章 IO库

C++ Primer IO 库

基本IO库类型及其头文件

  • iostream
    • istream:从流读取数据
    • ostream:向流写入数据
    • iostream:读写流数据
  • fstream
    • ifstream:从文件读取数据
    • ofstream:向文件写入数据
    • fstream:读写文件
  • sstream
    • istringstream:从字符串读取数据
    • ostringstream:向字符串写入数据
    • stringstream:读写字符串

IO类型之间的关系

对应的文件IO流和字符串IO流均继承自iostream中定义的类型,因此在使用时可以忽略不同类型的流之间的差异,使用统一的操作方式。通过继承机制,我们可以将一个派生类(继承类)对象当做其基类(所继承的类)来使用。

IO对象无拷贝或赋值

由于不能拷贝或赋值IO对象,因此也不能将形参或者返回值类型设置为流类型。进行IO操作的函数通常以引用的方式传递和返回流。读写一个IO会改变其状态,因此传递和返回的引用不能是const的。

IO流状态

IO库定义了一个与机器无关的iostate类型,用来表示流状态,并定义了4个iostate类型的constexper值:badbit,failbit,eofbit和goodbit,用来表示特定类型的IO条件,可以通过位运算结合使用,一次性检查一个或多个标志位:

  • badbit:表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流便不能再使用;
  • failbit:表示发生可恢复错误,如期望读取数值但却读出一个字符。这些问题通常是可以修正的,流还可以继续使用;
  • eofbit:表示到达文件末尾,此时eofbit和failbit都会被置位;
  • goodbit:表示没有错误发生。

当对流状态进行检测时,三个错误中任意一个发生,检测状态条件便会失败。

此外IO库还定义了对应的一组函数来查询标志位状态:eof(),fail(),bad()和good()。此外。clear()清除所有标志位,将流状态设置为有效,clear(flag)将对应状态位复位,setstate(flag)将对应状态位置位,rdstate()返回流的当前状态。注意,当badbit被置位时,fail()也会返回true。因此,将流当做条件对流状态进行检测时,相当于使用 !fail() 对状态进行检测。

输出缓冲

何时进行缓冲刷新?

  • 程序正常结束,作为main函数return操作的一部分,缓冲刷新
  • 缓冲区满,需要刷新缓冲,后续数据才能继续写入
  • 使用endl,ends和flush操作符显示刷新缓冲区,其中endl输出内容和换行,ends输出内容和空字符,flush只输出内容
  • 使用unitbuf操作符设置流的内部状态,来清空缓冲区:cout << unitbuf,同时也可以使用nounitbuf重置流,恢复正常刷新机制:cout << nounitbuf。默认情况下,对cerr是设置unitbuf的,因此写入cerr的内容都是立即刷新的
  • 一个输出流可能被关联到另一个流。当读写被关联的流时,关联到流的缓冲区会被刷新。例如,默认情况下,cin和cerr都被关联到cout,因此读cin或写cerr都会刷新cout的缓冲区。使用tie()将istream或ostream关联到ostream,或传入nullptr断开关联。

文件输入输出

文件的打开和关闭

使用open()和close()打开和关闭文件。open调用失败时,failbit被置位。对已经打开的文件流调用open会失败,failbit被置位。当流对象离开作用域而未调用close时,文件会被自动关闭。

文件模式

文件模式包括以下几种:

  • in:读方式打开
  • out:写方式打开
  • app:每次写操作前定位到文件末尾
  • ate:打开文件立即定位到文件末尾
  • trunc:截断文件
  • binary:以二进制方式进行IO

多个模式可以使用位操作符号连接同时使用。指定文件模式有以下限制:

  • 只可以对ofstream或fstream对象设定out模式
  • 只可以对ifstream或fstream对象设定in模式
  • 只有当out也被设定时才可以设定trunc模式
  • 只要trunc模式没有被设定,就可以设定app模式。在app模式下,即使没有显示指定out模式,文件也总以输出方式打开
  • 默认情况下即使没有指定trunc,以out模式打开的文件也会被截断
  • ate和binary可以用于任何类型的文件流对象,且可以与其他任何文件模式组合使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值