我正在使用標準檔案處理程式 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);
uj5u.com熱心網友回復:
不能傳入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, '\0');
ReadFile(l_FileHandle, l_FileBuffer.data(), l_FileSize, &lpNumberOfBytesRead, lpOverlapped);
請注意,非常量版本data()需要 C 17 或更高版本。對于 C 11..14,您可以&l_FileBuffer[0]改用。在 C 11 之前,這不能保證有效,但實際上它可以在大多數實作中作業。
有關將檔案讀入 a 的更標準方法string,請參閱如何在 C 中將整個檔案讀入 std::string?
uj5u.com熱心網友回復:
正確的用法是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);
由于標準的矢量確保了專案的連續存盤。
請注意,即使以這種方式,您仍然會隱式分配記憶體,只是向量會在銷毀時自動釋放它。如果已知檔案非常小,那么您可以將其加載到堆疊分配的緩沖區中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428286.html
