欢乐C++ —— 6. IO概览
简介
看看C++ 的IO 方法,关于C 的 IO 请见 https://www.cnblogs.com/starrys/p/12008562.html
这块只是简单了解一下有个印象,以后用到的时候就知道该查哪个方面。
概览
标准库定义了三种IO类型,分别包含在三个头文件:
![image-20200414210211831](https://img2020.cnblogs.com/blog/1512048/202006/1512048-20200618160330562-841356266.png)
后两种IO 流都是继承自 iostream ,所以适用于iostream 的一般也适用后者。IO 类都不可以拷贝和赋值,由于读写一个流会改变其状态,所以通过引用传递一个流时不要将其设为常引用。
流的错误
一旦一个流发生错误,其上的后续 IO 操作都会失败,所以在使用流时通常需要对其检测。最简单的方法就是将其作为条件使用,例如 while(cin>>n);
![](https://img2020.cnblogs.com/blog/1512048/202006/1512048-20200618160331389-555799320.png)
![](https://img2020.cnblogs.com/blog/1512048/202006/1512048-20200618160332207-1687367508.png)
要能识别常见的错误状态,当badbit 被置位时,意味着发生系统级不可恢复的错误,一般此流不可再使用;当发生可恢复的错误则 failbit 被置位(例如预期输入数字,而流中是字符)。如果到达文件末尾,则 failbit 和 eofbit 都会被置位。
只要badbit failbit eofbit 任意一个被置位,则 good 返回 false
输出流缓冲
每个输出流都管理一个缓冲区,合适的情况下,可以将多次输出合并一次输出。因为设备的写操作可能很耗时,所以这样可以带来很大的效率提升。
缓冲刷新有多种原因,下面是一部分:
- 程序正常结束,在main函数return时缓冲被刷新执行。
- 缓冲区满。
- 使用endl 等显式刷新。 ends 额外输出一个空格并刷新流,endl 额外输出一个换行并刷新流。flush 刷新流。
- 设置缓冲状态 :设置unitbuf,所有输出操作会立刻刷新,通过 nonunitbuf 恢复正常缓冲。
cout<<ends;
cout<<endl;
cout<<flush;
cout<<unitbuf;
cout<<nonunitbuf;
格式化输入输出
标准库定义一组 操作符manipulator 来格式化输入输出。
部分定义在
- 控制数值输出形式,包括:bool 输出格式,进制,浮点数记数法,精度等。
- 控制空格数量和位置,以及填充字符。
- 控制缓冲。
未格式化输入输出
其实就是底层次的IO函数,将流当作无解释的字节序列使用。
涉及几个部分:
- 单字节操作 cin.get() cin.get(ch) cout.put(ch)
- 将读取的字节放回输入流。
- 多字节操作 cin.get(,,) cin.getline() cin.read() cin.ignore() cout.write()
文件流随机访问
tell 定位函数 seek 重定位函数
流的关联
![image-20200414210528635](https://img2020.cnblogs.com/blog/1512048/202006/1512048-20200618160334251-1165223962.png)
cin.tie(&cout);