【发布时间】:2014-12-15 01:55:22
【问题描述】:
我正在尝试读取二进制文件并写入不同的位置。
但代码只显示第一位 - “MZ”。根据 MSDN,“CreateFile 和 ReadFile 不要使用参数来区分文本和二进制文件类型。”但我的代码适用于 txt 文件。
HANDLE hFile = CreateFile( L"C:\\in.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
char lpBuffer[2000] = "";
DWORD dwBytesRead = 0;
DWORD dwBytesWritten = 0;
HANDLE hTest = CreateFile(L"D:\\out.exe", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);
ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL);
WriteFile(hTest, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL);
CloseHandle(hFile);
CloseHandle(hTest);
}
【问题讨论】:
-
the code displays only the first bit - "MZ"是什么意思?可执行文件不可打印,如果您只是想将其发送到cout或其他什么的。 -
@JonathanPotter 我的意思是,当我调试时,“lpbuffer”的值只显示“MZ”
-
二进制文件可以包含零。然而,调试器将缓冲区显示为一个以 null 结尾的字符串,因此它只显示直到第一个零的字符。
-
假设您的调试器是 Visual Studio,您可以添加一个监视并提供其他信息来控制数据的显示。您可以通过输入
lpBuffer,2000查看整个缓冲区。另请注意,lpBuffer是 array,而不是 pointer,因此您的前缀具有误导性。另外,一定要养成检查返回值的习惯。根据您的 Visual Studio 版本和版本,您可以让它分析代码以检查返回值失败。
标签: winapi