Fstream的tellg/seekg返回比预期更高的值

4
为什么这个简单的东西不能运行呢?它应该是简单而有效的。
fisier.seekg(0, ios::end);
long lungime = fisier.tellg();

这将返回比文件中实际值更大的数值,从而导致错误发生。
char *continut = new char[lungime];

你有什么想法问题可能是什么?

我也尝试了逐个字符计算到文件结尾,但结果与预期不同,数字变得更高。但是使用getline()逐行读取时,它有效,没有额外的空格……

2个回答

10

根据猜测,您可能是在Windows下以翻译模式打开文件。当您简单地将文件指针定位到文件末尾时,当前位置未考虑换行符的影响。一行的结尾(在外部文件中)用“\r\n”对标记,但读入后会被转换为“\n”。当您使用getline逐行读取时,所有的\n都会被丢弃,因此即使在不进行外部与内部表示之间的转换的系统上(例如Unix/Linux),您仍然可以期望它们给出不同的大小。

另外,您应该真正忘记new []的存在。如果您想将整个文件读入字符串,请尝试以下方法:

std::stringstream continut;
continut << fisier.rdbuf();

continut.str() 然后是一个包含文件数据的 std::string


1
不错!我一直想知道是否有一种简单的方法来清空std::stream。 - Simon Buchan
1
@Jerry Coffin:Bill因为纯粹的尴尬而替换了所有对他的LoadFileAsString函数的调用... - Billy ONeal

4

Jerry Coffin关于行尾的观点是正确的。

然而,你不必使用stringstream来正确读取整个文件。你只需要在std::ifstream构造函数中使用std::ios::binary将其打开为二进制即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接