更改std :: endl以输出CR + LF而不是LF

J. *_*fer 10 c++ linux windows stl newline

我正在Linux平台上编写一个程序,该程序生成的文本文件将不可避免地在Windows平台上进行查看.

现在,传入std::endla ostream仅为换行生成CR字符.当然,这些文本文件在MS记事本中看起来不对.

  1. 有没有办法改变std::endl它使用CR + LF换行而不是LF?
  2. 我知道我可以编写自己的自定义操纵器,例如win_endl,用于生成我自己的换行符,但我std::endl在很多地方使用该符号,并且像许多程序员一样,倾向于做需要尽可能少工作的事情.我可以简单地重载std::endl以产生CR + LF,或者这对可维护性来说是一个愚蠢的想法?

注意:我查了一下这个问题,但是它问的是另一种方式,接受的答案似乎相当不完整.

ebo*_*ebo 10

std::endl 基本上是:

std::cout << "\n" << std::flush;
Run Code Online (Sandbox Code Playgroud)

所以只需使用"\r\n"而省略刷新.这样也快!

从endl上的ostream头文件:

当需要简单的换行符时,经常错误地使用该操纵器,导致差的缓冲性能.

  • 如果你这样做,不要忘记以二进制模式打开流 - 否则,如果您将此代码移植到Windows,您将在输出中得到`\ r \n \n \n`(因为`\n`本身将扩展为文本流的"\ r \n". (5认同)
  • 如果您的文件处于文本模式.当您写入文件时,字符'\n'将转换为特定于平台的行结束序列.当您从文件中读取时,行结束序列被转换为'\n'. (2认同)

Jos*_*ley 10

在文本模式下打开文件应该导致std::endl转换为适合您的平台的相应行.你的问题是,换行符适合你的平台,但您所创建的文件不适用于您的平台.

我不确定你计划如何进行重载或更改endl,并且对于任何刚接触项目的开发人员而言,改变其行为肯定会令人惊讶.我建议切换到win_endl(应该是一个简单的搜索和替换)或者可以从标准切换ostreamBoost.Iostreams过滤流来为您进行转换.

  • Boost.IOStreams 解决方案+1。更具体地说,使用 newline_filter:http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/index.html?path=4.2.10.1 (2认同)

Gre*_*ill 6

Windows Notepad几乎是唯一一个不能正确处理LF文件的Windows程序.几乎所有其他东西(包括写字板)都可以正常处理LF文件.

此问题是记事本中的错误.

  • 如果必须使用CRLF行结尾创建文件,请通过独立于程序本身的过滤器运行输出文件.您可以轻松找到这种过滤器,查找`unix2dos`或类似的东西.这将使这个特定于平台的逻辑脱离您的程序. (3认同)
  • 但是,不要忘记 Unix 程序通常不会容忍读取包含“\r\n”行结尾的文本文件——从我对 Unix 的有限经验来看,这似乎是一个更广泛的问题(就不能很好地处理非本地行结尾的程序数量)。 (2认同)