它是一个不愉快的惊喜, '\n'
被替换用"\r\n"
在Windows上,我不知道。 (我猜测它也换成Mac上的...)
有一个简单的方法,以确保在Linux,Mac和Windows用户可以轻松地交换文本文件?
通过简单的方法我的意思是:不写文件二进制模式或测试和更换结束行字符自己(或与某些第三方程序/代码)。 这个问题影响我的C ++程序做文本文件I / O。
它是一个不愉快的惊喜, '\n'
被替换用"\r\n"
在Windows上,我不知道。 (我猜测它也换成Mac上的...)
有一个简单的方法,以确保在Linux,Mac和Windows用户可以轻松地交换文本文件?
通过简单的方法我的意思是:不写文件二进制模式或测试和更换结束行字符自己(或与某些第三方程序/代码)。 这个问题影响我的C ++程序做文本文件I / O。
对不起,我有其他答案部分重叠,但为了完整起见:
误区二: endl
是“更portable`因为它写入根据平台约定的行结束。
真相: endl
被定义为写“\ N”到流,然后调用flush
。 所以,其实你几乎从来没有想用它。
误解:你应该在文本模式下打开的文件写入文本和二进制模式来写的二进制数据。
真相:文字模式摆在首位的存在是因为前一段时间出现了文件系统的文本文件和二进制文件之间的区别。 这不再是真实的,任何理智的平台,我知道了。 你可以写文字,二进制打开的文件一样好。 其实这是你想要做什么,因为它具有更好的定义语义和更轻便的代码的结果。 需要注意的是POSIX 不二进制和文本模式进行区分。
如何做到文本:打开一切都在二进制模式,并使用纯老“\ n”。 您还需要担心的编码。 在标准化UTF-8 Unicode的正确性。 使用UTF-8编码的窄内部字符串 ,代替wchar_t
是在不同的平台不同。 您的代码将变得更容易端口。
提示:您可以强制MSVC在默认情况下以二进制方式打开所有文件 。 它应该如下:
#include <stdio.h>
#include <iostream>
int main() {
_fmode = _O_BINARY;
std::ofstream f("a.txt"); // opens in binary mode
}
或者使用任何方式在这里描述 。
这个问题是不是与endl
可言,它是根据系统的标准文本流格式化换行符。
如果你不希望出现这种情况,根本就没有使用文本流 - 使用二进制流。 也就是说,打开文件与ios::binary
标志。
这就是说,如果唯一的问题是,用户可以交换文件,我不会与输出模式打扰可言,我宁愿确保您的程序可以读取不同的格式,无需窒息。 也就是说,它应该接受不同的行尾。
这是什么什么像样的文本编辑器做(但话又说回来,默认的方式notepad.exe
在Windows上是没有一件像样的文本编辑器,将不能正确处理Unix的换行符)。
如果你真的只是想一个ASCII LF,最简单的方法就是以二进制方式打开文件:在非二进制模式\ n由线序的平台特定的结束(例如,它可以通过LF / CR或更换更换一个CR / LF序列;上的UNIX其通常只是LF)。 在二进制模式做不到这一点。 关闭更换也二进制模式的唯一效果。
顺便说一句,使用ENDL相当于写入\ n接着冲洗流。 典型的意外冲洗可以成为一个主要的性能问题。 因此,ENDL应该是很少使用,只有当冲洗意。