改变std :: endl放弃CR + LF而不是LF

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

现在,将std::endl传递给一个ostream只会为换行产生CR字符。 自然,这些文本文件在MS记事本中看起来是错误的。

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

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

Solutions Collecting From Web of "改变std :: endl放弃CR + LF而不是LF"

在文本模式下打开一个文件应该会导致std::endl被转换为适合你的平台的适当的行。 你的问题是换行符适合你的平台,但你创建的文件不适合你的平台。

我不知道你是如何计划重载或改变endl ,改变它的行为对于任何新开发你的项目的开发者来说肯定是令人惊讶的。 我建议切换到win_endl(应该是一个简单的搜索和替换),或者从一个标准的ostream切换到一个Boost.Iostreams过滤流为您做转换。

std::endl基本上是:

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

所以只需使用"\r\n"而不用刷新。 这样也更快!

从endl的ostream头文件:

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

Windows记事本几乎是唯一的 Windows程序,你会发现不能正确处理纯文件。 几乎所有其他(包括写字板)处理LF文件就好了。

这个问题是记事本中的一个错误。

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

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

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

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

    #define win_endl "\r\n"

  2. 然后我做了一个搜索和替换:

    sheepsimulator@sheep_machine > sed -i 's/std::endl/win_endl' *

并确保我的所有文件都包含win_endl.h