使用fopen在C ++中读取文本文件而不进行换行转换

时间:2014-12-17 16:50:05

标签: c++ string utf-8 fopen linefeed

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

要正确打开文件,我使用fopen。如上所述here,打开文件有两个选项:

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

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

有没有办法将两种模式结合起来,将文本文件读入字符串而不会篡改换行符,同时仍能正确读取UTF-8?

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

1 个答案:

答案 0 :(得分:4)

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

有可能值得一看James McNellis "Unicode in C++"在C ++ Now 2014上的演讲。