【发布时间】:2010-09-09 09:22:45
【问题描述】:
由于性能原因,我不想只使用一次 fstream。使用带有 std::string 而不是普通 char 数组的 WinAPI 函数似乎是一个非常糟糕的主意。总而言之,我想让你告诉我为什么下面的 sn-p 不起作用(空的 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::strings 与 winAPI 一起使用的问题。我正在我的项目中这样做。
-
虽然对于 VC(我认为是所有主要的编译器)标准库
std::string有一个连续的缓冲区,但 C++03 不能保证这一点。 C++0x 将保证在此之前std::vector<char>将是 "clean" 解决方案。
标签: c++ winapi file stdstring readfile