C++输出缓冲

来源:互联网 发布:编程的面向对像 编辑:程序博客网 时间:2024/05/01 01:29

c++ primer-IO

概念上,数倍类型和字符大小都不会影响我们要执行的IO操作。

标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。

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

一个流一旦发生错误,其上后续的IO操作都会失败。确定一个流对象的状态的最简单的方法是将它当做一个条件来使用:

while(cin >> word)    //ok:读操作成功

缓冲区是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

导致输出缓冲刷新(即,数据真正写到输出设备或文件)的原因:

  • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
  • 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写人缓冲区。
  • 我们可以使用操纵符endl来显式刷新缓冲区。
  • 在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
  • 一个输出流可能被关联到另一个流,在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到const。因此,读cin或写cerr都会导致cout的缓冲区被刷新。

操作符endl完成换行并刷新缓冲区的工作,flush刷新缓冲区,但不输出任何额外的字符,ends向缓冲区插入一个空字符,然后刷新缓冲区。

cout << endl;//相当于cout << "\n" << flush; 
原创粉丝点击