c++ - 可移植行尾(换行)

标签 c++ cross-platform newline portability fstream

'\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/

相关文章:

c++ - 是否有用于 Windows 操作的跨平台库?

c - 如果从文件输入中获取,为什么不\n 生成一个新行字符?

c++ - 找到系统的行终止符

c++ - 使用boost将多个文件解压缩到一个文件中

c++ - Windows 上 C++ 的声音处理 - 朝着正确方向轻推

c++ - Windows 上的 C 编译器之间的实际区别是什么?

C# .net Core - 获取磁盘上的文件大小 - 跨平台解决方案

Python 认为一个 3000 行的文本文件是一行长?

c++ - 在哪里可以找到构建 DirectShow BaseClasses 的项目?

c++ - 如果您不通过引用将对象传递给函数,可能会出现什么问题