Fstream的tellg / seekg返回的价值高于预期

时间:2010-04-14 23:00:44

标签: c++

为什么这会失败,它应该是简单而有效的?

fisier.seekg(0, ios::end);
long lungime = fisier.tellg();

返回的值大于文件的值,导致错误的

char *continut = new char[lungime];

知道问题可能是什么?

我还尝试一次计数到文件的末尾一个char,它产生相同的结果,比预期的数字更高。但是一旦使用getline()一次读取一行,它就可以工作,没有多余的空格......

2 个答案:

答案 0 :(得分:8)

猜测,你是在翻译模式下打开文件,可能是在Windows下。当您只是寻找文件的末尾时,当前位置不会考虑行端转换。一行(在外部文件中)的末尾标有“\ r \ n”对 - 但是当你读入它时,它只被转换为“\ n”。当您使用getline一次读取一行时,\n也会被丢弃,所以即使在没有从外部到内部表示的转换的系统(例如Unix / Linux)上,你仍然可以期望那些给出不同的尺寸。

然后,你应该忘记new []存在。如果要将整个文件读入字符串,请尝试以下操作:

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

continut.str()std::string,其中包含文件中的数据。

答案 1 :(得分:1)

Jerry Coffin对于线路结束是正确的。

但是,您不必使用stringstream正确读取整个文件。你只需要在std :: ifstream构造函数中使用std :: ios :: binary打开它作为二进制文件。