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

时间:2009-10-30 19:50:03

标签: c++ windows linux stl newline

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

现在,将std::endl传递给ostream只会为换行符生成CR字符。当然,这些文本文件在MS Notepad中看起来不对。

  1. 有没有办法更改std::endl,使其使用CR + LF代替换行而不是LF?
  2. 我知道我可以编写自己的自定义操纵器,如win_endl,用于生成我自己的换行符,但我在很多地方使用std::endl符号,并且像许多程序员一样,有一种倾向做需要尽可能少工作的事情。我可以简单地重载std::endl来生成CR + LF,还是这对可维护性来说是一个愚蠢的想法?
  3. 注意:我检查了this question,但它问的是另一种方式,接受的答案似乎相当不完整。

5 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:9)

std::endl基本上是:

std::cout << "\n" << std::flush;

所以只需使用"\r\n"而省略刷新。这种方式也更快!

来自endl上的ostream头文件:

  

当需要简单的换行符时,通常会错误地使用此操纵器,从而导致缓冲性能不佳。

答案 2 :(得分:5)

Windows Notepad几乎是唯一的 Windows程序,您将找不到正确处理仅LF文件的程序。几乎所有其他东西(包括写字板)都可以正常处理LF文件。

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

答案 3 :(得分:2)

你不应该使用\ r \ n。只需使用\ n,然后以“文本”模式打开流,这将为您进行转换。您可能不关心跨平台,但这是正式的做法。

这样,相同的代码将在unix上吐出\ n,在windows上吐出\ r \ n,在mac上吐出\。

答案 4 :(得分:0)

这是我解决问题的方法。这是答案中提供的所有信息的混搭:

  1. 我在win_endl.h文件中为我想要的换行创建了一个宏:

    #define win_endl "\r\n"
    
  2. 然后我进行了搜索和替换:

    sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
    
  3. 确保我的所有文件都包含win_endl.h