使用windows行尾有效地将文件读取到std::string
Read file to std::string efficiently with windows line endings
在C++中将文件读取为字符串的一种更有效的方法如下:
fstream file(filePath);
file.seekg(0, std::ios_base::end);
string fileContents;
fileContents.resize(file.tellg());
file.seekg(0, std::ios_base::beg);
file.read(&fileContents[0], fileContents.size());
如果这是在Windows上,并且文件具有Windows风格的行结尾,则字符串的大小最终将大于其内容,因为tellg()以字节为单位报告文件的大小,而file.read()将\r\n转换为比文件大小小的字符串。
我能想出几种方法来处理这个问题,但没有一种是有效的,也没有一种优雅的。
所以我的第一个问题是:这真的是一个问题吗?还是我在使用这种技术的过程中犯了一个愚蠢的错误?
我的第二个问题是:处理这件事最有效、最优雅的方法是什么?
值得一提的是,我目前处理这一问题的首选方法是,即使在Windows上也使用Unix行尾样式编写文本文件,这是第一个链接中提出的,作为在Windows上使用utf-8进行C++编码策略的一部分,第二个链接似乎暗示微软自己可能会采用
http://utf8everywhere.org/
https://blogs.msdn.microsoft.com/vcblog/2016/02/22/new-options-for-managing-character-sets-in-the-microsoft-cc-compiler/
read()
之后的fileContents.resize(file.gcount())
应该可以做到这一点。
相关文章:
- 使 std::fstream 写入文件末尾,但从头开始读取
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 用 C++20 的给定键读取/写入 std::multimap 的所有值?
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 写入/读取 std::映射到二进制文件需要运算符
- 在二进制文件中写入/读取 std::复杂值
- 如何读取STD ::队列与另一个线程共享
- 如何在C 中的文件中直接读取std :: String中的字符串
- 读取STD :: String Line(带有空格和特殊钥匙支持)
- 读取 std::string,从 std::string 中删除所有特殊字符
- 为什么这段代码最终会进入一个无限循环,读取std::cin
- 读取 std::map<string, string> 使用 ReadProcessMemory
- 如何安全地读取std::istream中的行
- 为什么从文件输入中读取 std::string 会返回空白
- 两次读取std::cin的输入
- 从C++/CLI代码中的std::stringstream读取std::string时出现问题
- 将文件内容读取到动态分配的 char* 数组中 - 我可以读取 std::string 吗?