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

时间:2016-07-20 13:21:35

标签: c++ windows

在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样式\ r \ n行结尾,那么由于tellg()报告文件的大小,字符串的大小将最终大于其内容。 file.read()将\ r \ n转换为\ n,导致字符串小于文件大小。

我可以想到几种解决这个问题的方法,但它们都不是有效的,也不是优雅的。

所以我的第一个问题是:这实际上是一个问题还是我在使用这种技术的某个地方犯了一个愚蠢的错误?

我的第二个问题是:处理这个问题最有效和最优雅的方法是什么?

值得注意的是,我目前首选的处理方法是使用Unix行结束样式编写我的文本文件,即使在Windows上也是如此,这在第一个链接中提出,作为C ++编码策略的一部分使用Windows上的utf-8,其中第二个链接似乎暗示微软本身可能会出现这种情况。

http://utf8everywhere.org/

https://blogs.msdn.microsoft.com/vcblog/2016/02/22/new-options-for-managing-character-sets-in-the-microsoft-cc-compiler/

1 个答案:

答案 0 :(得分:0)

<fileContents.resize(file.gcount())之后

read()应该做的伎俩。