带有动态缓冲区的Windows readfile
Windows readfile with dynamic buffer
我试图写一个包装器围绕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放入一个空终止符,这样您和调试器就不会读取超出实际数据的内容。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 无法在windows控制台中为C++程序提供必要的输入
- Windows 文件:同时使用 ReadFile 和映射
- 无法在COM端口上正确使用windows.h ReadFile.WriteFile似乎工作正常
- 程序员思维过程:确定将ReadFile与Windows API一起使用时要读取的最大字节数
- windows ReadFile() 直到读取 sizeToRead 值才返回
- 带有动态缓冲区的Windows readfile
- 设备驱动程序:Windows ReadFile函数超时
- C++(使用 <windows.h> 的串行通信) - 我如何事先知道 ReadFile() 方法将读取多少个字符