istream::seekg() 到达文件末尾时会做什么?

What does istream::seekg() do when it gets to the end of the file?

我正在编写一个扫描文件的程序,并在执行此操作时多次调用 seekg()。它在一个循环中旋转,其条件是 !infile.eof();所以它应该在到达文件末尾时退出循环。但是,由于某种原因,它卡住了。

我怀疑这可能是因为它在 seekg() 中到达文件末尾。换句话说,如果我距离文件末尾 50 个字节,我调用 seekg() 并告诉它移动指针 100 个字节,也许这会导致它卡住(在 seekg() 中或之后)。

那么,当要求将指针移到文件末尾时,seekg() 实际上做了什么?

当您搜索到文件末尾时,不会发生任何特殊情况。当您下次尝试从文件中读取时,您只会注意到您已经过了结尾。这允许一些其他进程在您查找和读取之间添加到文件中——在这种情况下,读取将成功。

搜索结束后,如果尝试从文件中读取将会失败,并设置流的eofbit。之后你下次调用 infile.eof() 时,它将 return true.

一般来说,只有在尝试阅读某些内容后才能使用 infile.eof()。这就是为什么循环像:

while (!infile.eof()) {
    ...
}

总是错误的——它在 尝试读取之前而不是在读取失败之后检查 EOF 。参见