我一直在尝试从文件中读取,而我正在使用Windows API函数ReadFile()
。我使用了以下代码:
int main()
{
LPDWORD bytesRead = 0;
HANDLE hFile = CreateFile("TestFile.txt", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
char Data[600];
ReadFile(hFile, Data, 10, bytesRead, 0);
cout << Data;
cin.get();
}
当我执行此代码时,它会引发访问冲突!
这是为什么?我觉得我正在使用ReadFile()
- 但我可能错了。如何修复此错误(如何正确使用ReadFile()
?)
答案 0 :(得分:3)
ReadFile
的第四个参数是指向DWORD
的指针。你已经给它一个指针,但它是空的 - 它实际上并没有指向DWORD
。
DWORD bytesRead = 0;
...
ReadFile(hFile, Data, 10, &bytesRead, 0);
答案 1 :(得分:1)
这可能不是你的主要问题,但你应该写:
char Data[600] = {0};
而不是:
char Data[600];
后一个语句使您的数组未初始化。然后,执行后
ReadFile()
,您的字符串可能不会被\0
字符终止。在这种情况下,cout
在10个字节后不会停止打印。在最坏的情况下,你会遇到另一个访问冲突。
如@DavidHeffernan的评论所述,以下解决方案比初始化整个数组更有效:
DWORD bytesRead = 0;
ReadFile(hFile, Data, 10, &bytesRead, 0);
Data[bytesRead] = '\0';
通过在最后一行中使用bytesRead
,您可以确保数据被\0
字符正确终止,即使未读取所有请求的10个字节(例如,因为该文件是短于10个字节)。但是,在您的实际代码中,您还应检查ReadFile()
的返回值,以验证读取是否成功。如果失败,您可能想要进行一些错误处理。