使用 fopen 读取C++文本文件,无需换行转换

Read text-file in C++ with fopen without linefeed conversion

本文关键字:换行 转换 文件 fopen 读取 C++ 文本 使用      更新时间:2023-10-16

我正在Windows上使用文本文件(UTF-8(,并希望使用C++读取它们。

为了正确打开文件,我使用 fopen。如此处所述,有两个选项可用于打开文件:

  • 文本模式"rt"(回车 + 换行将自动转换为换行;短 "\r" 变为 ""(。
  • 二进制模式"rb"(文件将逐字节读取(。

现在它变得棘手。我不想以二进制模式打开文件,因为我会丢失对 UTF-8 字符的正确处理(并且我的文本文件中有特殊字符,当解释为 ANSI 字符时会损坏(。但我也不希望 fopen 将我所有的 CR+LF 转换为 LF。

有没有办法将这两种模式结合起来,在不篡改换行符的情况下将文本文件读入字符串,同时仍然能够正确读取 UTF-8?

我知道,如果我通过同一个文件写入反向转换,就会发生反向转换,但字符串被发送到另一个需要 Windows 样式行尾的应用程序。

在文本模式下打开文件和二进制模式下打开文件之间的区别恰恰是在文本模式下处理行结束序列或在二进制模式下不触摸它们。仅此而已。由于 ASCII 字符在 Unicode 中使用相同的码位,并且 UTF-8 保留了 ASCII 字符的编码(即,每个 ASCII 文件恰好是 UTF-8 编码的 Unicode 文件(,因此无论您使用二进制还是文本模式都不会影响其他字节。

也许值得一看James McNellis在C++Now 2014上的"Unicode in C++"演讲。