有没有办法根据所使用的操作系统自动使用正确的EOL字符?
我在考虑std::eol
之类的东西?
我知道使用预处理程序指令非常容易,但如果已经可用,那就很好奇。
我感兴趣的是我通常在我的应用程序中有一些消息,后来我将它们组合成一个字符串,我希望用EOL分隔它们。我知道我可以使用std::stringstream << endl
,但有时似乎是一种过度杀伤而不是常规追加。
答案 0 :(得分:13)
std::endl
写入流并刷新它(第27.6.2.7节)之外, '\n'
被定义为什么都不做。刷新被定义为对stringstream
什么都不做,所以你可以用一种漂亮的方式说mystringstream << '\n'
。您的操作系统上的标准库实现会相应地转换\n
,因此您不关心。
因此,endl
已经是性能和可移植性的最佳选择,如果您正在尝试有效地写入文件(而不是字符串流),那么您唯一可以想要的是<< '\n'
。好吧,<< '\n'
也消除了对stringbuf::flush
的无意义虚拟调用。除非分析显示空函数调用需要时间,否则不要考虑它。
答案 1 :(得分:11)
如果要为流写入行分隔符:
std::cout << '\n';
或
std::cout << "\n";
或
std::cout << "whatever you were going to say anyway\n";
如果流是文本模式,并且操作系统使用除LF之外的任何其他内容作为分隔符,则它将被转换。
如果你想写一个行分隔符并刷新流:
std::cout << std::endl;
如果由于某种原因你有二进制模式输出,并且你想编写特定于平台的换行符,那么我认为你可能必须间接地做(将'\n'
写入文本流然后检查它以二进制模式看你得到了什么)。可能有一些方法可以直接从实现中获取换行序列,这是我不知道的。无论如何,这不是一个好主意:如果你是以二进制模式编写或读取文件,那么它应该采用一种格式,它独立于操作系统定义换行符,或者根本没有行。这就是 for 的二进制模式。
答案 2 :(得分:2)
只需以文字模式打开文件
FILE *fp = fopen( "your_file.txt", "w+t" );
然后
fprintf( fp, "some string and integer %d\n", i );
fclose(fp);
并且操作系统将根据其标准处理EOL。
答案 3 :(得分:1)
好吧,STL有std :: endl,可以用作
std::cout << "Hi five!" << std::endl;
请注意,除了添加结束之外,std :: endl还会刷新缓冲区,这可能会产生不良的性能后果。
答案 4 :(得分:1)
文件,甚至文本文件,经常在机器之间传输,因此“特定于操作系统的新行字符”是矛盾的。
虽然操作系统在这方面有发言权,但特别是一个操作系统即Windows,尽管许多Windows程序将正确读取\ n间隔文件,即使winapi多行编辑控件不能。我建议您考虑两次适合您的权利:它不一定是您的操作系统推荐的内容。如果您的文件永远存储在可移动媒体上,请不要使用OS标准。使用全局标准0xA。