网上的教程都是告诉我打开一个文件后循环调用 read() 方法,就能将整个文件的内容读取出来。但有个坑,那就是当read结束时,会立即跳出while循环,而不是下次读取时才跳出,因此会导致while循环少执行一次。
假如一个文件是87KB,缓冲区设置为32KB,那么需要3个循环才能读取完。如果打算每次while循环中读取32KB后就发送出去,那么就会导致最后一次不发送,示例代码如下:
ifstream readFile("D:\\xxx.jpg", ios::binary);
if (!readFile)
{
return;
}
const int buferSize = 1024 * 32;
char* tmpBufer = new char[buferSize];
while (readFile.read(tmpBufer, buferSize))
{
// 发送数据代码...
printf("sending");
}
if (readFile.eof() && readFile.gcount() > 0)
{
// 这里还需发送最后的数据
printf("last");
}
delete[] tmpBufer;
虽然所有数据都被读取了,tmpBufer 中也确实被存放了最后一次循环读取的数据,但你猜sending
打印了几次?是2次!而不是预期的3次。我们需要在while循环结束后处理最后一次读取的数据。