ホームページ >バックエンド開発 >C++ >バイナリ ファイルを符号なし文字のベクトルに効果的に読み取るにはどうすればよいですか?

バイナリ ファイルを符号なし文字のベクトルに効果的に読み取るにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 09:51:30625ブラウズ

How to Effectively Read Binary Files into a Vector of Unsigned Chars?

バイナリ ファイルを符号なし文字のベクトルに読み取る

バイナリ ファイルを符号なし文字のベクトルに読み取るタスクを実行すると、いくつかのオプションが表示されます。

オプション 1: char への明示的なキャスト*

このアプローチは、char* への明示的なキャストを使用してデータをベクトルに読み取ります:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>

機能しますが、明示的なキャストが必要ですが、これが不安の原因になる可能性があります。

オプション 2: char を使用した istreambuf_iterator

テンプレート引数として char を使用して std::istreambuf_iterator を使用すると、簡素化されます。コード:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    return std::vector<BYTE>(std::istreambuf_iterator<char>(file),
                            std::istreambuf_iterator<char>());
}</code>

ただし、ベクトルに unsigned char が含まれていても、イテレータでは引き続き char が使用されます。

オプション 3: BYTE を使用した Basic_ifstream

このオプションは、タイプとして BYTE を使用する入力ファイル ストリームを明示的に宣言し、意図を明確にします。

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
    // ...
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);
    return std::vector<BYTE>(std::istreambuf_iterator<BYTE>(file),
                            std::istreambuf_iterator<BYTE>());
}</code>

basic_ifstream の適合性は、特定の使用例によって異なります。

istreambuf_iterator: シンプルさと効率

std::istreambuf_iterator はシンプルさを提供しますが、バイナリ データにとって最も効率的なオプションではない可能性があります。 >> を使用します。データを解釈するため、不要なオーバーヘッドが発生する可能性があります。 std::copy などの代替アプローチを検討してください。

その他の考慮事項

  • ファイル ストリームが開いていることを確認します。
  • さまざまなパフォーマンスをテストします。バイナリ データのオプション。
  • 改行のスキップを避けるために、バイナリ ファイルの場合は std::ios::skipws を false に設定します。

以上がバイナリ ファイルを符号なし文字のベクトルに効果的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。