带有动态缓冲区的Windows readfile

Windows readfile with dynamic buffer

本文关键字:Windows readfile 动态缓冲区      更新时间:2023-10-16

我试图写一个包装器围绕Windows文件函数,一个人会从文件中读取num字节的数据量并返回它。由于某些原因,我没有正确分配内存,但我就是找不到原因:

PBYTE Read(int num_bytes, HANDLER hFile){
   PBYTE bBuffer;
   DWORD new_size = sizeof(BYTE)*num_bytes;
   //after the allocation the debugger already displays a 16 char wide placeholder
   bBuffer = (PBYTE)malloc(new_size);
   OVERLAPPED o = { 0 };
   o.Offset = 0;
   BOOL bReadDone = ReadFile(hFile, (LPVOID)bBuffer, sizeof(BYTE)*num_bytes, NULL, &o);
   return bBuffer;
}

数据被复制,但是分配的缓冲区总是太宽,并且包含额外的奇怪填充字符。请问我做错了什么?

"我哪里做错了?"

sizeof(BYTE)为1,因此您可以在所有地方删除它并消除冗余的new_size变量。

你标记你的问题c++,但使用malloc分配缓冲区。您的设计使调用者负责释放缓冲区,这是一种糟糕的设计方法,在c++程序中使用malloc/free更是如此。一个好的c++解决方案是返回Astd::向量。

为ReadFile提供lpNumberOfBytesRead参数是至关重要的。没有它,您不知道读取了多少字节。如果不知道读取了多少字节,就无法区分"额外的奇怪填充字符"和缓冲区末尾未使用的内存。如果数据是字符,那么面向字符的输出例程(和调试工具)也不知道其中的区别,因为在实际读取的数据末尾没有空终止符。您可以使用NumberOfBytesRead放入一个空终止符,这样您和调试器就不会读取超出实际数据的内容。