C++读取缓冲区大小

3

假设这个文件的长度是2个半块,块大小为1024。

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

第三次读取时,它将写入缓冲区的一半,留下另一半无效数据。有没有办法知道它实际写入了多少字节到缓冲区?
3个回答

8

引用您提供的链接:“修改此函数返回值的未格式化输入操作是由以下成员函数执行的:get、getline、ignore、peek、read、readsome、putback和unget”。OP询问实际写入了多少字节。 - yasouser
2
@yasouser,OP只是使用了令人困惑的术语。从上下文中可以清楚地看出他的意思是“读取”(即:从文件中读取并写入buffer变量)。 - Konrad Rudolph

5
你的代码过于复杂且容易出错。
只读取并检查 eof 的循环是一个逻辑错误,因为如果在读取时发生错误(无论什么原因),这将导致无限循环。
相反,你需要检查流的所有故障状态,可以通过简单地检查 istream 对象本身来完成。
由于这已经由 read 函数返回,因此你可以(而且确实应该)像这样构造任何读取器循环:
while (myFile.read(buffer, aBlock))
    process(buffer, aBlock);
process(buffer, myFile.gcount());

这种方法更短,不会隐藏错误,并且更易读,因为在循环中检查流状态是一种成熟的C++习惯用法。


好的,我以前从未这样处理过C++文件。那个循环只会读取一个块吗? - Guido Tarsia
2
@Erandros 那个循环将会读取尽可能多的块,直到文件结束或者遇到读取文件错误(例如用户已经删除了文件,或者设备故障)。 - Konrad Rudolph
1
不幸的是,在文件长度不是块大小的倍数的(正常)情况下,您的解决方案会使最后一个小块未经处理。除非您在循环结束后处理它。我曾试图在这里帮助沮丧的提问者(https://dev59.com/zVjUa4cB1Zd3GeqPSYkF#6449509),因为他由于这个问题再次发布了基本相同的问题。 - Bill Forster
@Bill 是的,循环结束后的处理有点隐含。说实话,我没有想那么远;上面循环的好处是你根本不需要在循环内部检查 gcount,所以如果你将实际处理交给一个函数,那么上述代码只需要在结尾调用一个额外的函数即可。我会修改答案的。 - Konrad Rudolph
感谢您进行修改,现在您的答案更加明确易懂,我给您点赞。我已将其链接到另一个主题作为一个很好的替代方案。 - Bill Forster
1
两年半已经过去了。当时我没有看到你发布的代码的价值。现在我明白了,它真的非常简单。 - Guido Tarsia

0

1
然而,这个函数的语义基本上是不同的。它只会读取与流相关联的当前缓冲区。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接