Loading

欢乐C++ —— 6. IO概览

简介

看看C++ 的IO 方法,关于C 的 IO 请见 https://www.cnblogs.com/starrys/p/12008562.html

这块只是简单了解一下有个印象,以后用到的时候就知道该查哪个方面。

概览

标准库定义了三种IO类型,分别包含在三个头文件:

image-20200414210211831

后两种IO 流都是继承自 iostream ,所以适用于iostream 的一般也适用后者。IO 类都不可以拷贝和赋值,由于读写一个流会改变其状态,所以通过引用传递一个流时不要将其设为常引用。

流的错误

一旦一个流发生错误,其上的后续 IO 操作都会失败,所以在使用流时通常需要对其检测。最简单的方法就是将其作为条件使用,例如 while(cin>>n);

要能识别常见的错误状态,当badbit 被置位时,意味着发生系统级不可恢复的错误,一般此流不可再使用;当发生可恢复的错误则 failbit 被置位(例如预期输入数字,而流中是字符)。如果到达文件末尾,则 failbit 和 eofbit 都会被置位。

只要badbit failbit eofbit 任意一个被置位,则 good 返回 false

输出流缓冲

每个输出流都管理一个缓冲区,合适的情况下,可以将多次输出合并一次输出。因为设备的写操作可能很耗时,所以这样可以带来很大的效率提升。

缓冲刷新有多种原因,下面是一部分:

  1. 程序正常结束,在main函数return时缓冲被刷新执行。
  2. 缓冲区满。
  3. 使用endl 等显式刷新。 ends 额外输出一个空格并刷新流,endl 额外输出一个换行并刷新流。flush 刷新流。
  4. 设置缓冲状态 :设置unitbuf,所有输出操作会立刻刷新,通过 nonunitbuf 恢复正常缓冲。
cout<<ends;
cout<<endl;
cout<<flush;
cout<<unitbuf;
cout<<nonunitbuf;

格式化输入输出

标准库定义一组 操作符manipulator 来格式化输入输出。

部分定义在 中,这些操作符涉及三个部分:

  1. 控制数值输出形式,包括:bool 输出格式,进制,浮点数记数法,精度等。
  2. 控制空格数量和位置,以及填充字符。
  3. 控制缓冲。

image-20200612094401067

未格式化输入输出

其实就是底层次的IO函数,将流当作无解释的字节序列使用。

涉及几个部分:

  1. 单字节操作 cin.get() cin.get(ch) cout.put(ch)
  2. 将读取的字节放回输入流。
  3. 多字节操作 cin.get(,,) cin.getline() cin.read() cin.ignore() cout.write()

文件流随机访问

tell 定位函数 seek 重定位函数

流的关联

image-20200414210528635

cin.tie(&cout);

posted @ 2020-01-13 21:11  沉云  阅读(133)  评论(0编辑  收藏  举报