使用windows行尾有效地将文件读取到std::string

Read file to std::string efficiently with windows line endings

本文关键字:读取 std 文件 string windows 有效地 使用      更新时间:2023-10-16

在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())应该可以做到这一点。