C++读取缓冲区大小

era*_*ros 3 c++ file-io buffer

假设这个文件长2和1/2块,块大小为1024.

aBlock = 1024;
char* buffer = new char[aBlock];
while (!myFile.eof()) {
    myFile.read(buffer,aBlock);
    //do more stuff
}
Run Code Online (Sandbox Code Playgroud)

它第三次读取时,它将写入缓冲区的一半,而另一半则写入无效数据.有没有办法知道它实际写入缓冲区的字节数?

Nem*_*emo 7

istream :: gcount返回上一次读取读取的字节数.

  • @yasouser OP只是使用了令人困惑的术语.从上下文中可以清楚地看出,他的意思是*read*(如:从文件*读取*并写入`buffer`变量). (2认同)

Kon*_*lph 5

您的代码过于复杂且容易出错.

读取循环并仅检查eof是一个逻辑错误,因为如果在读取时出现错误(无论出于何种原因),这将导致无限循环.

相反,您需要检查流的所有失败状态,这可以通过简单地检查istream对象本身来完成.

由于这已经被read函数返回,你可以(并且实际上应该)构造任何读取器循环,如下所示:

while (myFile.read(buffer, aBlock))
    process(buffer, aBlock);
process(buffer, myFile.gcount());
Run Code Online (Sandbox Code Playgroud)

这同时更短,不会隐藏错误并且更具可读性,因为check-stream-state-in-loop是已建立的C++习惯用法.

  • @Erandros该循环将读取尽可能多的块或直到文件结束,或直到读取文件时出错(例如因为用户同时删除了它,或者设备出现故障). (2认同)