使用 fopen 读取C++文本文件,无需换行转换
Read text-file in C++ with fopen without linefeed conversion
我正在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++"演讲。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- C++如何将字符串逐行转换为双精度
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 将缓冲区复制到剪贴板 [换行错误]
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 如何正确转发/换行static_cast?
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 将命令行转换为从 Openssl 到 c++ 的代码
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 使用 fopen 读取C++文本文件,无需换行转换
- CSV 文件转换为带换行符的 2D 数组 CPP
- 将文件的前1000个字符读入缓冲区,将换行符转换为 ,并将字符串的地址位置存储为char*[]
- 流未将"rn"转换为换行符