ifstream读取文件的反直觉接口

网上的教程都是告诉我打开一个文件后循环调用 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循环结束后处理最后一次读取的数据。

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注