WinAPI ReadFile返回损坏的数据

时间:2019-06-30 06:15:43

标签: c++ winapi visual-c++ readfile createfile

我正在Visual C ++项目中编写一个函数,该函数以2000字节为增量通过WinAPI读取文件的内容,并将其作为std :: string返回。

当文件远大于缓冲区(例如100 KB)时,会出现问题,在有效数据中间,我在文件中的多个位置添加了垃圾。这是一个长0xcccccccc...序列,由3-4个其他字节终止,通常出现在一个单词的中间。否则该功能不会失败,并且不会丢失任何有效数据。

我还没有检查确切的位置,但是似乎这发生在缓冲区大小增加(或缓冲区大小增加的乘数)上。如果我将缓冲区的大小增加到大于测试文件的大小,那么问​​题就消失了。是什么原因导致这种情况发生?我在做什么错了?

std::string read_file(std::string filename) {
    HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        std::string errortext("Error opening " + filename + ", bad handle value: " + to_string((int)hFile));
        MessageBox(hwnd, errortext.c_str(), "Error", 0);
        return "";
    }
    char buffer[2000] = "";
    std::string entire_file = "";
    DWORD dwBytesRead = 0;

    while (ReadFile(hFile, buffer, sizeof(buffer), &dwBytesRead, NULL))
    {
        if (!dwBytesRead)
            break;
        entire_file += buffer;
    }
    CloseHandle(hFile);
    return entire_file;
}

1 个答案:

答案 0 :(得分:5)

entire_file += buffer;

假定缓冲区是一个以nul结尾的字符串,在您的情况下不是。

尝试一下

entire_file.append(buffer, dwBytesRead);

这是一个很好的示例代码,应该已经敲响了警钟,因为您没有使用dwBytesRead变量(终止循环除外)。