我正在尝试读取二进制文件并写入其他位置。
但代码只显示第一位 - " 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);
}
答案 0 :(得分:0)
当我运行以下代码时,我得到“2000MZÉ0”。
HANDLE hFile = CreateFile(L"C:\\cppConsole.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;
ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL);
CloseHandle(hFile);
std::wcout << dwBytesRead << L' ' << lpBuffer << L' ' << (int)lpBuffer[3] << L'\n';
}
请注意,它表示dwBytesRead是2000,换句话说,读取了2000个字节。它说lpBuffer是“MZÉ”的原因是因为它后面有一个空值。因此,如果您将lpBuffer视为字符串,那么您将只获得一部分数据。
答案 1 :(得分:-3)
这很傻......现在我知道为什么了。
char lpBuffer[2000] = "";
说到二进制文件,缓冲区的大小要大得多。我把2000改为10000,现在它可以了! 尽管lpBuffer只出现在&#34; MZ&#34;,但无论如何都会继续。