有没有办法根据使用的操作系统自动使用正确的EOL字符?
我在想像 std::eol
这样的东西吗?
我知道使用预处理器指令非常容易,但我很好奇是否已经有这个功能。
我感兴趣的是,我通常在我的应用程序中有一些消息,稍后将它们组合成一个字符串,并且我希望它们用 EOL 分隔。我知道我可以使用 std::stringstream << endl
,但有时候似乎相比于常规附加而言有些过度。
有没有办法根据使用的操作系统自动使用正确的EOL字符?
我在想像 std::eol
这样的东西吗?
我知道使用预处理器指令非常容易,但我很好奇是否已经有这个功能。
我感兴趣的是,我通常在我的应用程序中有一些消息,稍后将它们组合成一个字符串,并且我希望它们用 EOL 分隔。我知道我可以使用 std::stringstream << endl
,但有时候似乎相比于常规附加而言有些过度。
std::endl
被定义为除了向流中写入'\n'
并刷新它之外不做任何事情(§27.6.2.7)。对于stringstream
, 刷新被定义为不做任何事情,因此您只能通过这种方式来表达 mystringstream << '\n'
。您所在的操作系统上的标准库实现将适当地转换\n
,所以这不是您要考虑的。
因此,endl
已经是最佳性能和可移植性,您唯一可能需要的是<< '\n'
,如果您想要高效地写入文件(而不是stringstream)。好吧,<< '\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;
'\n'
时,只需写 '\n'
,而不是 std::endl
。我曾经看到过将无用的 std::endl
替换为 '\n'
后加速了8倍的情况。 - sbi即使是文本文件,文件也经常在不同的机器之间传输,因此“特定于操作系统的换行符”是个自相矛盾的说法。
尽管如此,操作系统对此有所规定,特别是Windows这样的操作系统,尽管许多Windows程序可以正确读取\n分隔的文件,但winapi多行编辑控件却不能。我建议您仔细考虑什么才是适合您的:不一定是您的操作系统推荐的。如果您的文件将存储在可移动介质上,请勿使用操作系统标准。请使用全局标准0xA。
os.put(os.widen(’\n’) )
,然后os.flush()
。” - Potatoswattercout
。多线程需要使用互斥锁,刷新可能似乎有助于减轻竞态条件的症状,但这并不是解决方法。 - Potatoswatter