我正在写一个Linux平台所生成将上,不可避免地,在Windows平台上看到的文本文件的程序。
眼下,路过std::endl
成ostream
只为新行生成CR字符。 当然,这些文本文件看上去是错误的MS记事本。
- 有没有办法改变
std::endl
使得它使用CR + LF表示换行,而不是LF? - 我知道我可以写我自己的自定义操纵,像
win_endl
,产生我自己换行,但是我用std::endl
符号在很多地方,像很多程序员来说,要做的是需要最少的东西的倾向工作成为可能。 难道我只是重载std::endl
生产CR + LF,或者这是可维护性愚蠢的想法?
注:我检查了这个问题 ,但它问走另一条路,并接受的答案似乎相当不完整的。
在文本模式下打开一个文件应该引起std::endl
转换为您的平台结束了相应的线路。 你的问题是,换行符适合你的平台,但您所创建的文件不适用于您的平台。
我不知道你怎么打算过载或改变endl
,并改变其行为肯定是惊人的任何新的到您的项目开发。 我建议切换到win_endl(应该是一个简单的搜索和替换),或从一个标准的可能切换ostream
到了Boost.Iostreams过滤流做转换为你。
std::endl
是basicly:
std::cout << "\n" << std::flush;
因此,只要使用"\r\n"
来代替,而省略了冲洗。 它的速度更快这样,太!
从ENDL的ostream的头文件:
该机械手在一个简单的换行需要经常错误地使用,从而导致缓冲性能差。
Windows记事本几乎是唯一的Windows程序,你会发现不能正确处理LF-唯一文件。 几乎一切(包括写字板)处理LF-文件只就好了。
这个问题在记事本中的错误。
你不应该使用\ r \ n。 只要使用\ N,但随后打开“文本”模式,这比会做转换为你流。 你可能不关心跨平台的,但是这是做它的正式方式。
这样一来,同样的代码会吐出\ n在UNIX上的窗户,\ r \ n和Mac上的\ r。
这里是我的问题的解决方案。 这一点在答复中提供的所有信息一个混搭的:
我创建了为我想换行一个win_endl.h文件中的宏:
#define win_endl "\r\n"
然后,我做了搜索和替换:
sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
并确保我的所有文件包括win_endl.h
。