如何使用字符串而不是 char* 缓冲区将文件数据读入字符串?

How can I use string instead of char* buffer to read the file data into string?

我正在使用标准文件处理程序 API 来读取文件,目前我使用 char* 缓冲区来读取数据,但我想使用 string 所以我可以避免 calloc() 使用。我试图将字符串地址传递给 ReadFile() 函数,但它不起作用。你能帮帮我吗???

l_FileHandle = CreateFileA(inputFilePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   
l_FileSize = GetFileSize(l_FileHandle, NULL);

char * l_FileBuffer = NULL;

l_FileBuffer = (char *)calloc(l_FileSize, sizeof(char));
     
ReadFile(l_FileHandle,(void *)(l_FileBuffer), l_FileSize, &lpNumberOfBytesRead, lpOverlapped);

正确的用法是std::vector

l_FileSize = GetFileSize(l_FileHandle, NULL);
std::vector<char>  l_FileBuffer(l_FileSize);
ReadFile(l_FileHandle,l_FileBuffer.data(), l_FileSize, &lpNumberOfBytesRead, lpOverlapped);

由于 vector by the standard 确保项目连续存储。

请注意,即使采用这种方式,您仍然在隐式分配内存,只是 vector 会在销毁时自动释放它。如果已知文件非常小,那么您可以负担得起将其加载到 stack-allocated 缓冲区。

不能传入string本身的地址,但可以传入其内部字符缓冲区的地址。先确保它已经分配好了。

l_FileHandle = CreateFileA(inputFilePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   
l_FileSize = GetFileSize(l_FileHandle, NULL);

string l_FileBuffer(l_FileSize, '[=10=]');
     
ReadFile(l_FileHandle, l_FileBuffer.data(), l_FileSize, &lpNumberOfBytesRead, lpOverlapped);

请注意,data() 的 non-const 版本需要 C++17 或更高版本。对于 C++11..14,您可以改用 &l_FileBuffer[0]。在 C++11 之前,保证 可以工作,但在实践中它将在大多数实现中工作。

有关将文件读入 string 的更标准方法,请参阅 How do I read an entire file into a std::string in C++?