Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;读取缓冲区大小_C++_File Io_Buffer - Fatal编程技术网

C++ C++;读取缓冲区大小

C++ C++;读取缓冲区大小,c++,file-io,buffer,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 } 第三次读取时,它将写入缓冲区的一半,而另一半则保留无效数据。有没有办法知道它实际写入缓冲区的字节数?返回上一次读取的字节数。您也可以查看,它实际上返回读取的字节数。您的代码过于复杂且容易出错 在循

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

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

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

返回上一次读取的字节数。

您也可以查看,它实际上返回读取的字节数。

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

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

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

由于这已经由
read
函数返回,因此您可以(实际上应该)这样构造任何读卡器循环:

while (myFile.read(buffer, aBlock))
    process(buffer, aBlock);
process(buffer, myFile.gcount());

这是一个短的时间,不隐藏错误,而且更易于阅读,因为循环中的检查流状态是一个已建立的C++习惯用法。“修改此函数返回值的未格式化输入操作由以下成员函数执行:get、getline、ignore、peek、read、readsome、putback和unget“。OP询问实际写入了多少字节。@yasouser OP只是使用了令人困惑的术语。从上下文中可以清楚地看出,他的意思是读取(如:从文件中读取并写入

缓冲区
变量)。然而,这个函数的语义有根本不同。它只会读取与流相关的当前缓冲区。OK,我以前从未这样处理C++文件。因此,该循环将只读取一个块?@Erandros该循环将读取尽可能多的块,或者直到到达文件末尾,或者直到读取文件时出错(例如,因为用户同时删除了文件,或者出现了设备故障)。不幸的是,(正常)情况下,文件长度不是块大小的倍数,您的解决方案使最后一个小块未经处理。除非在循环结束后处理它。因为这个问题,我试图帮助沮丧的发问者()在他再次发布了基本相同的问题后。@Bill是的,循环结束后的处理有点隐含…老实说,我真的没那么想;上述循环的好处在于,您根本不必在循环中检查
gcount
,因此,如果您将实际处理交给函数,那么上述所需的只是在最后进行一次额外的函数调用。我会修改答案。两年半过去了。当时我没有看到你发布的代码中的值。现在我明白了。这真的很简单。