便携式终端

时间:2010-03-26 02:51:35

标签: c++ portability eol end-of-line

有没有办法根据所使用的操作系统自动使用正确的EOL字符?

我在考虑std::eol之类的东西?

我知道使用预处理程序指令非常容易,但如果已经可用,那就很好奇。

我感兴趣的是我通常在我的应用程序中有一些消息,后来我将它们组合成一个字符串,我希望用EOL分隔它们。我知道我可以使用std::stringstream << endl,但有时似乎是一种过度杀伤而不是常规追加。

5 个答案:

答案 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。