在寻找文件结束后,文件流在读取时失败

时间:2014-06-27 17:24:52

标签: c++ file-io filestream

我需要从一个大文件中读取最后一个64kb,但在找到文件的末尾然后返回64kb后,文件上的所有读取都会失败。

这是一个片段:

string filename = "test.txt";
ifstream::streampos pos; // used to keep track of position in file
ifstream fs;

fs.open(filename, ios::binary);
fs.seekg(0, ios::end);
pos = fs.tellg();

// ....

fs.seekg(-16, ios::cur);

char buff[16];

fs.read(buff, 16);

// ...

fs.close();

问题出在fs.read() eofbitfailbitbadbit已设置且文件流无法使用。值得注意的是,我正在阅读的文件被连续追加。此外,有时这种方法有效,有时它不会,这使调试变得困难。

为什么会发生这种情况有什么原因吗?

1 个答案:

答案 0 :(得分:0)

您的问题是您在寻找文件结束后致电tellgtellg导致指针提前调用流上的eof状态:问题出在:

fs.open(filename, ios::binary);
fs.seekg(0, ios::end);
pos = fs.tellg();   // <== causes eof on stream

您对fs.seekg的下一次调用应该清除eof状态,但最好是调用fs.clear()并检查返回以确保其成功。