我正在Linux平台上编写一个程序,该程序生成的文本文件将不可避免地在Windows平台上进行查看。
现在,将std::endl
传递给ostream
只会为换行符生成CR字符。当然,这些文本文件在MS Notepad中看起来不对。
std::endl
,使其使用CR + LF代替换行而不是LF?win_endl
,用于生成我自己的换行符,但我在很多地方使用std::endl
符号,并且像许多程序员一样,有一种倾向做需要尽可能少工作的事情。我可以简单地重载std::endl
来生成CR + LF,还是这对可维护性来说是一个愚蠢的想法?注意:我检查了this question,但它问的是另一种方式,接受的答案似乎相当不完整。
答案 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)
这是我解决问题的方法。这是答案中提供的所有信息的混搭:
我在win_endl.h文件中为我想要的换行创建了一个宏:
#define win_endl "\r\n"
然后我进行了搜索和替换:
sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
确保我的所有文件都包含win_endl.h
。