读取C+中的文本文件+;使用无换行转换的fopen 我正在使用Windows上的文本文件(UTF-8),希望用C++来阅读它们。

读取C+中的文本文件+;使用无换行转换的fopen 我正在使用Windows上的文本文件(UTF-8),希望用C++来阅读它们。,c++,string,utf-8,fopen,linefeed,C++,String,Utf 8,Fopen,Linefeed,要正确打开文件,我使用。如上所述,打开文件有两个选项: 文本模式“rt”(回车+换行符将自动转换为换行符;短“\r\n”变为“\n”) 二进制模式“rb”(文件将逐字节读取) 现在变得很棘手。我不想以二进制模式打开该文件,因为我会丢失对UTF-8字符的正确处理(并且在我的文本文件中有一些特殊字符,在解释为ANSI字符时会损坏这些字符)。但我也不想fopen把我所有的CR+LF转换成LF 有没有一种方法可以将这两种模式结合起来,在不篡改换行符的情况下将文本文件读入字符串,同时仍然能够正确读取U

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

  • 文本模式“rt”(回车+换行符将自动转换为换行符;短“\r\n”变为“\n”)
  • 二进制模式“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上的演示文稿。

以文本模式打开文件和以二进制模式打开文件之间的区别正是在文本模式下处理行尾序列或在二进制模式下不接触它们。不多不少。由于ASCII字符在Unicode中使用相同的代码点,并且UTF-8保留ASCII字符的编码(即,每个ASCII文件恰好是一个UTF-8编码的Unicode文件),因此无论使用二进制还是文本模式,都不会影响其他字节


或许值得一看James McNellis在2014年C++Now上的演示文稿。

为什么您认为二进制nmode会影响UTF8?文件中的行尾不会改变,当您阅读文本时,它们会被翻译。当您写入文件时会发生反向转换。@AlanStokes您完全正确。我只是没有考虑这个事实,问题是二进制流的解释(将字节转换为字符串对象)而不是fopen本身。为什么你认为二进制nmode会影响UTF8?文件中的行尾不会改变,它们在阅读文本时会被翻译。当您写入文件时会发生反向转换。@AlanStokes您完全正确。我只是没有考虑这个事实,问题是二进制流的解释(将字节转换成字符串对象),而不是fopen本身。