C++输出缓冲

C++ Primer中的IO操作涉及流的概念,通过继承机制隐藏了不同类型流的差异。IO操作通常通过非const引用传递和返回流对象,因为流的状态会被改变。当流发生错误时,后续IO操作也会失败。缓冲区用于缓存数据,提高CPU与低速设备之间的协调。缓冲刷新可能由程序结束、缓冲区满或使用endl、unitbuf、flush等操纵符触发。endl换行并刷新,flush仅刷新,ends插入空字符后刷新。流之间可以关联,如cin、cerr与cout的关联会影响缓冲区刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值