【发布时间】:2019-03-25 21:57:07
【问题描述】:
我正在尝试使用 readfile 读取文件,将其存储到一个宽数组中,然后将其写入另一个文件。问题是,当我将它们并排放在 HxD 中时,一些字节是正确的(例如文本),但其他一切都完全不同。我也运行不了
struct a
{
BYTE* buff;
long siz;
};
int main()
{
HANDLE hFile;
a struct_a;
if (hFile = CreateFileW(L"C:\\Windows\\System32\\notepad.exe", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr))
{
long lFileSize = GetFileSize(hFile, nullptr);
if (lFileSize)
{
struct_a.siz = lFileSize;
struct_a.buff = new BYTE[struct_a.siz];
if (ReadFile(hFile, struct_a.buff, struct_a.siz,
nullptr, nullptr))
{
CloseHandle(hFile);
}
}
}
HANDLE h = CreateFileA("C:\\Users\\USER\\Desktop\\notepad_new.exe", GENERIC_WRITE, FILE_SHARE_WRITE, nullptr,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);
WriteFile(h, struct_a.buff, struct_a.siz, nullptr, nullptr);
return 0;
}
我希望它能够正确读取文件,然后写入并让我能够运行它。
作为奖励,我还尝试在读取文件后在文件末尾写一些字节
struct_a.buff[struct_a.siz - 5] = L'A';
但它从未出现在任何地方。但是当我尝试在开头写它(删除括号)时,它写得很好。
编辑:我后来尝试阅读它,它奇怪地阅读了正确的字母
【问题讨论】:
-
听起来很像您不想将文件作为文本文件处理,而应将其视为二进制数据。
-
解释进一步的伙伴
-
你们能告诉我我的问题是什么,而不是对我投反对票吗?我不是专家,但我尽我所能自己制作所有东西,所以我认为可能会出现一些错误
-
尚未投票。但是,您的代码示例缺少信息可能会让选民灰心。这可能不是您实际程序的真实表示。值得注意的是,我们看不到这些读取和写入是否发生在同一个函数中,或者究竟是在哪里定义了
struct_a。关于您的“奖金”测试,这敲响了警钟。如果您没有看到任何更改,那么您可能从未真正写过(也许文件已经打开?)——打开文件后检查句柄是否有效,如果没有则发出错误。关于二进制模式,有必要避免换行转换。 -
实际上,“奖金”的问题是您分配了一个
wchar_t数组。不要不将您的文件读取为wchar_t值!文件大小以 字节 为单位。当您在wchar_t数组中寻址size-5元素时,这已经超出了文件的末尾。