0

由于性能原因,我不想只使用一次 fstream。使用带有std::string而不是普通 char 数组的WinAPI 函数似乎是一个非常糟糕的主意。总而言之,我希望您告诉我为什么以下代码段不起作用(空的 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;
}
4

2 回答 2

1

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

stBuffer.resize(dwFileSize + 1);
于 2010-09-09T09:27:09.490 回答
1

因为 astd::string可以包含嵌入的'\0'字符,所以它必须以单独的方式跟踪自己的长度。
你的问题是std::string::reserve()不会改变字符串的长度。它只是为要增长的字符串预先分配一些内存。解决方案是使用std::string::resize()并让 WinAPI 函数覆盖字符串内容。

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

于 2010-09-09T10:05:52.083 回答