'\n'
is replaced 是个令人不快的惊喜在 Windows 上使用 "\r\n"
,我不知道。 (我猜它在 Mac 上也被替换了...)
有没有一种简单的方法可以确保 Linux、Mac 和 Windows 用户可以轻松地交换文本文件?
我的意思是简单的方法:无需以二进制模式编写文件或自行测试和替换行尾字符(或使用某些第三方程序/代码)。此问题会影响我的 C++ 程序执行文本文件 I/O。
最佳答案
对于与其他答案的部分重叠表示歉意,但为了完整起见:
神话: endl
“更便携”,因为它根据平台约定编写行结尾。
真相: endl
定义为写入 \n
到流然后调用flush
.所以实际上你几乎不想使用它。全部\n
写入文本模式流的那些被隐式转换为 \r\n
通过幕后的 CRT,您是否使用 os<<endl
, os<<'\n'
, 或 fputs("\n",file)
.
误解:您应该以文本模式打开文件以写入文本,以二进制模式打开文件以写入二进制数据。
真相: 文本模式首先存在是因为不久前出现了区分文本文件和二进制文件的文件系统。在我所知道的任何理智平台上都不再如此。您也可以将文本写入二进制打开的文件,您只需松开自动 \n
-> \r\n
Windows 上的转换。然而,这种转变弊大于利。其中,它使您的代码在不同平台上表现不同,并且 tell/seek
使用起来有问题。因此最好避免这种自动转换。请注意,POSIX 不区分二进制和文本模式。
How to do text: 以二进制模式打开所有内容并使用普通的 \n
.您还需要担心编码。标准化 UTF-8 以确保 Unicode 正确性。 Use UTF-8 encoded narrow-strings internally , 而不是 wchar_t
这在不同的平台上是不同的。您的代码将变得更容易移植。
提示:您可以强制 MSVC 默认以二进制模式打开所有文件。它应该按如下方式工作:
#include <stdio.h>
#include <iostream>
int main() {
_fmode = _O_BINARY;
std::ofstream f("a.txt"); // opens in binary mode
}
编辑:截至 2021 年,Windows 10 记事本支持 UNIX 行尾。
关于c++ - 可移植行尾(换行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689344/