由于性能原因,我不想使用fstream一次。使用带有 std :: string 的WinAPI函数而不是普通的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;
}
答案 0 :(得分:1)
考虑reserve()
和resize()
成员之间的差异。所以解决方案是:
stBuffer.resize(dwFileSize + 1);
答案 1 :(得分:1)
由于std::string
可以包含嵌入的'\0'
字符,因此必须以单独的方式跟踪自己的长度。
您的问题是std::string::reserve()
不会更改字符串的长度。它只是预先为字符串增加了一些内存。解决方案是使用std::string::resize()
并让WinAPI函数覆盖字符串内容。
作为旁注:目前,不能保证std::string
使用连续的缓冲区,但据我所知,所有当前的实现都使用连续的缓冲区,这将是下一个标准的要求。