使用ReadFile()函数时,为什么会出现访问冲突?

时间:2015-07-12 12:17:08

标签: c++ windows winapi

我一直在尝试从文件中读取,而我正在使用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()?)

2 个答案:

答案 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()的返回值,以验证读取是否成功。如果失败,您可能想要进行一些错误处理。