更改的std :: ENDL扑灭CR + LF代替LF的(Changing std::endl to

2019-09-02 20:04发布

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

眼下,路过std::endlostream只为新行生成CR字符。 当然,这些文本文件看上去是错误的MS记事本。

  1. 有没有办法改变std::endl使得它使用CR + LF表示换行,而不是LF?
  2. 我知道我可以写我自己的自定义操纵,像win_endl ,产生我自己换行,但是我用std::endl符号在很多地方,像很多程序员来说,要做的是需要最少的东西的倾向工作成为可能。 难道我只是重载std::endl生产CR + LF,或者这是可维护性愚蠢的想法?

注:我检查了这个问题 ,但它问走另一条路,并接受的答案似乎相当不完整的。

Answer 1:

在文本模式下打开一个文件应该引起std::endl转换为您的平台结束了相应的线路。 你的问题是,换行符适合你的平台,但您所创建的文件不适用于您的平台。

我不知道你怎么打算过载或改变endl ,并改变其行为肯定是惊人的任何新的到您的项目开发。 我建议切换到win_endl(应该是一个简单的搜索和替换),或从一个标准的可能切换ostream到了Boost.Iostreams过滤流做转换为你。



Answer 2:

std::endl是basicly:

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

因此,只要使用"\r\n"来代替,而省略了冲洗。 它的速度更快这样,太!

从ENDL的ostream的头文件:

该机械手在一个简单的换行需要经常错误地使用,从而导致缓冲性能差。



Answer 3:

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

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



Answer 4:

你不应该使用\ r \ n。 只要使用\ N,但随后打开“文本”模式,这比会做转换为你流。 你可能不关心跨平台的,但是这是做它的正式方式。

这样一来,同样的代码会吐出\ n在UNIX上的窗户,\ r \ n和Mac上的\ r。



Answer 5:

这里是我的问题的解决方案。 这一点在答复中提供的所有信息一个混搭的:

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

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

     sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' * 

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



文章来源: Changing std::endl to put out CR+LF instead of LF