告诉`endl`不要冲洗

Ric*_*ard 1 c++ iostream newline

我的程序打印了大量的短行cout.

作为一个有点人为的例子,我的线条看起来有点像这样:

cout<<"The variable's value is: "<<variable<<endl;
Run Code Online (Sandbox Code Playgroud)

我希望程序能够快速运行,我相信这会让我感到害怕,endl因为它会在cout每次使用时启动缓冲区刷新.

现在,互联网上的一些人说我可以这样做:

cout<<"The variable's value is: "<<variable<<"\n";
Run Code Online (Sandbox Code Playgroud)

但这似乎不是一个好的解决方案,因为endl抽象特定于系统的特定方式可以指定终止线,而\n不是.这似乎也是一个糟糕的解决方案,因为,如果我将来需要缓冲,那么我将不得不修改整个代码库.

因此,我问,有没有办法禁用缓冲区刷新方面endl

编辑

进一步的挖掘似乎表明了两者endl并且\n尊重OS可能选择的各种方式来结束它的线条.似乎输出流检测它是否处于潜在的交互状态,并相应地缓冲和刷新.因此:问题可以通过手动告诉输出流执行积极缓冲来解决...如果我能弄清楚如何做到这一点.

n. *_* m. 8

endl抽象特定于系统的特定方式,可以指定结束行,其中\n不是".

std::endl定义为输出'\n'后跟刷新.正确抽象系统特定的换行符就是这样'\n'.

为了防止冲洗,人们只是不使用std::endl.此外,如果标准输出是或可能连接到交互设备,则标准输出可以是行缓冲的,在这种情况下,换行符将刷新流.如果这是一个问题,请使用已ofstream连接的命名文件.我认为在类Unix系统上,线路缓冲仅在标准输出是终端时发生.

  • 但这不是真正的问题.他想防止冲洗.如果他们看到换行符,许多平台也会刷新. (4认同)
  • @AlanStokes:无法保证换行不会导致刷新.我乍看之下确实错过了他所得到的东西.我找不到任何防弹方法来做到这一点.也许写信给`cerr`?哈金,但.... (2认同)

Zet*_*eta 5

endl刷新.如果您不想要这种行为,请不要使用endl.如果您想轻松更改代码,请使用您自己的操纵器:

inline std::ostream& myendl( std::ostream& os ){
    os.put(os.widen('\n'));
    return os;
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以轻松地改变您myendl在一个地方的行为.

  • 不需要`os.widen()`,因为字符类型是已知的。 (2认同)