17

起動時に定義済みの文字列をファイルに書き込むプログラムを作成しています。ファイルのサイズは約 5 mb であるため、文字列を 16 進数で 5 mb のデータで埋めることは大きな変数です。コンパイルしようとすると、文字列が大きすぎるというエラーが表示されます。5MBってそんなに大きいの?文字列を 4 つのセクションに分割しましたが、各セクションはまだ大きすぎます。:/ この状況を解決するために、すばやく簡単にできることは何ですか。

注: 私は自分自身を初心者のプログラマーだと考えているので、頭を使いすぎないようにしてください :P

文字列をファイルに書き込む方法の例:

string file_hex("huge_a**_string_goes_here_or_in_separate_cpp");

ofstream file_out;
file_out.open("tools\\c.exe", ios::binary | ios::trunc);
string res;
res.reserve(file_hex.size() / 2);
for (int i = 0; i < file_hex.size(); i += 2)
{
    std::istringstream iss(file_hex.substr(i, 2));
    int temp;
    iss >> std::hex >> temp;
    res += static_cast<char>(temp);
}

file_out << res;
file_out.close();
4

3 に答える 3

17

標準は、文字列リテラルの最大制限を指定していませんが、最小サイズを提案しています。附属書 B より - 実装数量

制限により、以下に説明するものやその他のものを含む数量が制限される場合があります。各数量に続く括弧内の数字は、その数量の最小値として推奨されます。ただし、これらの量は単なるガイドラインであり、準拠を決定するものではありません。

  • 文字列リテラルの文字 (連結後) [65 536]。

ただし、標準の同じセクションには、次のようにも記載されています

コンピューターは有限であるため、C++ の実装では、正常に処理できるプログラムのサイズが必然的に制限されます。すべての実装は、既知の場合、それらの制限を文書化する必要があります。このドキュメントでは、固定された制限が存在する場合に引用したり、利用可能なリソースの関数として可変制限を計算する方法を述べたり、固定された制限が存在しないか不明であると述べたりする場合があります。

5MB の文字列リテラルは、コンパイラによって課される最大制限を超えると想定しても安全です。文字列リテラルに適用される制限を判断するには、ツール チェーンのドキュメントを参照してください。

Visual C++ コンパイラを使用している場合、文字列リテラルの最大サイズは 16,384バイトです。MSDNのドキュメントから

文字列リテラルの最大長は 16,384 (16K) バイトです。この制限は、タイプ char[] および wchar_t[] の文字列に適用されます。文字列リテラルが二重引用符で囲まれた部分で構成されている場合、プリプロセッサはそれらの部分を 1 つの文字列に連結し、連結された行ごとに合計バイト数に 1 バイト追加します。

于 2013-06-01T03:36:38.237 に答える