什么决定了从std :: endl输出的字节数

时间:2011-08-19 22:09:33

标签: c++ windows gcc special-characters iostream

我有一个使用std :: cout生成其输出的大型代码库,它在整个地方使用std :: endl来生成其换行符。这个程序似乎只为endl生成换行符,这本身并不是一个大问题,但无论出于何种原因,都不是我所期望的。

因此,作为现实检查,我构建了一个简单的程序来将endl泵入cout,使用相同的编译器对其进行编译并检查其输出。 程序为endl发出CR和LF。

看起来大型程序看起来不像cout那样改变endl的工作方式,至少不是我能识别的,所以看起来它应该与小程序的行为不同似乎很奇怪。似乎大型程序必须做一些事情来改变默认值。我在这里缺少什么?

两个程序都是在32位窗口上使用MinGW gcc 4.5.2编译的。

3 个答案:

答案 0 :(得分:4)

std::endl由C ++标准定义,用于执行以下操作:

  • 流式传输'\n'字符;
  • 流式传输std::flush I / O操纵器。

如果您在流的另一端看到回车符,那么这发生在文件界面(而不是流功能本身);特别是在Windows上,您可以在文本模式输出到文件期间将"\n"透明地翻译为"\r\n"

因此,请检查您的文件是分别以文本模式还是二进制模式打开。 C ++中没有其他任何东西可以影响这种行为。

This FAQ entry几乎涵盖了我刚才所说的内容。

答案 1 :(得分:3)

要添加Tomalak Geret'kal的回答:endl扩展到特定于平台的终结点的事实是一种流行的误解。

在C / C ++应用程序中,唯一的“官方”换行符(至少就流和流相关函数而言)是'\n'。当在文本模式下打开时,'\n'到特定于平台的换行符在 1 内的中完成(即没有ios::bin标志)。

相反,

endl用于强制'\n'之后的流刷新;这对于控制台输出很有用,但是(1)通常不是这种情况(cout在通过绑定流机制从cin请求输入时自动刷新,并且只浪费CPU时间, (2)你经常发现它也用在文件流上,几乎从来没用过,导致文件写入性能不佳。


  1. 正如评论中所讨论的那样,就标准而言,翻译实际上可能发生在流下面的任何级别(例如,流可以将ios::bin的存在/不存在转换为底层OS的标志。文件管理功能,操作系统负责翻译);实际上,主流操作系统没有特定的标记用于这种翻译,主要是因为他们的文件API与内容无关(你告诉他们要写什么,他们不加修改地写它)。

答案 2 :(得分:1)

在“TEXT”模式下打开文件时(创建文件流时的默认设置)。

当您将'\ n'字符写入文件时,它将转换为特定于平台的“行结束序列”。相反,当您从文件中读取时,“行结束序列”将转换为'\ n'。

请注意,如果您在“BINARY”模式下打开文件,则不会发生此转换。

关于std :: endl

stream << std::endl

相当于:

stream << '\n' << std::flush;

因此,如果您的流是std :: fstream(正常打开),则'\ n'字符将转换为“行结束序列”,在某些平台上为'\ r \ n'