为什么这会失败,它应该是简单而有效的?
fisier.seekg(0, ios::end);
long lungime = fisier.tellg();
返回的值大于文件的值,导致错误的
char *continut = new char[lungime];
知道问题可能是什么?
我还尝试一次计数到文件的末尾一个char,它产生相同的结果,比预期的数字更高。但是一旦使用getline()一次读取一行,它就可以工作,没有多余的空格......
答案 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打开它作为二进制文件。