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