gpt4 book ai didi

c++ - 使用 std::strings 而不是 char 数组的 WinAPI 文件输入/输出?

转载 作者:行者123 更新时间:2023-11-28 03:55:52 25 4
gpt4 key购买 nike

由于性能原因,我不想只使用一次 fstream。将 WinAPI 函数与 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 使用连续缓冲区,但据我所知,所有当前实现都使用连续缓冲区,这将是一个下一个标准中的要求。

关于c++ - 使用 std::strings 而不是 char 数组的 WinAPI 文件输入/输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3675309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com