0

パフォーマンス上の理由から、fstream を 1 回だけ使用したくはありませんでした。単純な char 配列の代わりにstd::stringで WinAPI 関数を使用するのは非常に悪い考えのようです。全体として、次のスニペットが機能しない理由 (空の 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;
}
4

2 に答える 2

1

reserve()resize()メンバーの違いを考慮してください。したがって、解決策は次のようになります。

stBuffer.resize(dwFileSize + 1);
于 2010-09-09T09:27:09.490 に答える
1

std::stringには埋め込み文字を含めることができるため'\0'、別の方法で独自の長さを追跡する必要があります。
問題はstd::string::reserve()、文字列の長さが変わらないことです。文字列が成長するためのメモリを事前に割り当てるだけです。解決策はstd::string::resize()、WinAPI 関数を使用して文字列の内容を上書きさせることです。

std::string補足として: 現在、連続したバッファを使用することは保証されていませんが、私の知る限り、現在のすべての実装は連続したバッファを使用しており、次の標準では必須になります。

于 2010-09-09T10:05:52.083 に答える