由于表现原因,我只想使用FSTREAM一次。似乎是一个非常糟糕的主意 std :: string 而不是普通的char阵列。总而言之,我希望您告诉我为什么以下片段无法正常工作(空的stbuffer固定为空),以及我需要做什么才能修复它。

提前致谢!

std::size_t Get(const std::string &stFileName, std::string &stBuffer)
{
    HANDLE    hFile        = ::CreateFileA(stFileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    DWORD    dwBytesRead    = 0;

    if(hFile != INVALID_HANDLE_VALUE)
    {
        DWORD    dwFileSize    = ::GetFileSize(hFile, NULL);

        stBuffer.reserve(dwFileSize + 1);
        ::ReadFile(hFile, &stBuffer[0], dwFileSize, &dwBytesRead, NULL);
        stBuffer[dwFileSize] = '\0';
        ::CloseHandle(hFile);
    }

    return dwBytesRead;
}
有帮助吗?

解决方案

因为 std::string 可以包含嵌入式 '\0' 角色,它必须以单独的方式跟踪自己的长度。
您的问题是 std::string::reserve() 不更改字符串的长度。它只是预先分配了一些记忆,以使字符串成长为。解决方案是使用 std::string::resize() 并让Winapi功能覆盖字符串内容。

作为旁注:目前,不能保证 std::string 使用连续的缓冲区,但据我所知,所有当前的实现都使用连续的缓冲区,这将是下一个标准的要求。

其他提示

考虑之间的差异 reserve()resize() 成员。因此解决方案是:

stBuffer.resize(dwFileSize + 1);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top