19

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

我在想类似的东西std::eol

我知道使用预处理器指令非常容易,但很好奇它是否已经可用。

我感兴趣的是,我的应用程序中通常有一些消息,稍后我会将它们组合成一个字符串,并且我希望将它们与 EOL 分开。我知道我可以使用std::stringstream << endl,但有时它似乎有点过头了,而不是常规的附加。

4

5 回答 5

17

std::endl'\n'被定义为除了写入流并刷新它之外什么都不做(第 27.6.2.7 节)。Flushing 被定义为不为 a 做任何事情stringstream,所以你只剩下一个漂亮的说法mystringstream << '\n'。您的操作系统上的标准库实现\n会适当地转换,所以这不是您关心的问题。

因此endl,这已经是性能和可移植性的终极目标,而您唯一想要的另一件事是<< '\n',如果您正在尝试有效地写入文件(而不是字符串流)。好吧,<< '\n'确实也消除了对stringbuf::flush. 除非分析显示空函数调用需要时间,否则不要考虑它。

于 2010-03-26T07:39:50.630 回答
11

如果要将行分隔符写入流:

std::cout << '\n';

或者

std::cout << "\n";

或者

std::cout << "whatever you were going to say anyway\n";

如果流是文本模式并且操作系统使用 LF 以外的任何分隔符作为分隔符,它将被转换。

如果要编写行分隔符并刷新流:

std::cout << std::endl;

如果出于某种原因您有二进制模式输出,并且您想编写特定于平台的换行符,那么我认为您可能必须间接执行(写入'\n'文本流,然后以二进制模式检查它以查看您的得到)。可能有某种方法可以直接从实现中获取换行符序列,我不知道。无论如何,这不是一个好主意:如果您正在以二进制模式写入或读取文件,那么它应该采用独立于操作系统定义换行符的格式,或者根本没有行。这就是二进制模式的用途

于 2010-03-26T02:58:59.607 回答
2

只需在文本模式下打开文件

FILE *fp = fopen( "your_file.txt", "w+t" );

进而

fprintf( fp, "some string and integer %d\n", i );
fclose(fp);

并且操作系统将根据其标准处理 EOL。

于 2010-03-26T02:55:02.130 回答
1

好吧,STL 有 std::endl,您可以将其用作

std::cout << "Hi five!" << std::endl;

请注意,除了添加 endline 之外,std::endl 还会刷新缓冲区,这可能会产生不良的性能后果。

于 2010-03-26T02:59:50.197 回答
1

文件,甚至是文本文件,经常在机器之间传输,所以“特定于操作系统的换行符”是矛盾的。

确实,操作系统在这件事上有发言权,特别是一个操作系统,即 Windows,尽管许多 Windows 程序会正确读取 \n 间隔的文件,即使 winapi 多行编辑控件不会。我建议您考虑两次什么是适合您的:它不一定是您的操作系统推荐的。如果您的文件要存储在可移动媒体上,请不要使用操作系统标准。使用全球标准,0xA。

于 2010-03-26T03:06:20.417 回答