1

ではGetPrivateProfileStringlpReturnedStringini ファイルの特定のセクションのキーに存在する文字列値を返します。

私の質問は、この関数を呼び出す前に大きなチャンクを割り当てるのではなく、どのくらいのメモリを割り当てる必要があるかを正確に知るにはどうすればよいかということです。

DWORD WINAPI GetPrivateProfileString(
  __in   LPCTSTR lpAppName,
  __in   LPCTSTR lpKeyName,
  __in   LPCTSTR lpDefault,
  __out  LPTSTR lpReturnedString,
  __in   DWORD nSize,
  __in   LPCTSTR lpFileName
);
4

3 に答える 3

2

あなたの質問から、、、、またはヒープで動作する他の関数を使用して、ヒープにメモリを割り当てたいと思います。おそらく、できるだけ少ないヒープメモリを使用する必要があります。newmallocLocalAlloc

スタック上のメモリを操作する場合、それほど正確である必要はありません。メモリの割り当ては非常に高速で(ヒープの場合よりも約100倍または1000倍高速)、現在の関数から戻った後、メモリは自動的に解放されます。だからあなたはただ変数を定義することができます

TCHAR szBuffer[16384];

スタック上の16Kはほとんど何もありません。GetPrivateProfileString次に、szBufferとしてで呼び出すことができますlpReturnedString。この関数GetPrivateProfileStringは、バッファにコピーされた文字数を返します。値が16K-1未満の場合、正確なバッファサイズがわかります。これで、ヒープ上のサイズのメモリブロックを割り当て、データをブロックにコピーできszBufferます。の戻り値がGetPrivateProfileString16K-1に等しい場合は、バッファが小さすぎます。バッファサイズを2倍にする(そして今はヒープのバッファを操作する)ことができる場合は、これをiniファイルのエラーとして解釈することをお勧めします。すべて本物以前使用したiniファイルは小さかった。エントリのサイズは、ほとんどの場合260文字未満です。したがって、エントリサイズおろし金は16Kであり、エラーとして解釈できます。

ちなみに、GetFileSizeExに関してINIファイルのサイズを確認できます。エントリのサイズは、INIファイルのサイズよりも小さくする必要があります。

プログラムに含める必要のあるINIサイズに対するいくつかの制限。エントリサイズがGBで測定される場合、問題が発生する可能性があります。たとえば、許可されるエントリのサイズを16Kに制限してみませんか?

于 2010-10-19T01:10:30.540 に答える
2

標準ケース

からの戻り値GetPrivateProfileStringは、ヌル ターミネータを含まない、バッファにコピーされた文字数です。

したがって、(たとえば) 100 秒のバッファから開始して_TCHAR、戻り値を確認できます。99 の場合は、文字列のサイズを正確に推測したか、(可能性が高い) バッファーが小さすぎるため、サイズを大きくして再試行してください。

「列挙」ケース

上記は、.iniファイルから 1 つの文字列値を取得する標準的なケースに適用されます。NULL使用可能なすべての値を列挙するために またはのいずれかのパラメーターとしてlpAppName渡す場合、lpKeyName指定したバッファーが小さすぎると、戻り値はバッファー サイズよりも2少なくなります。

配分戦略

バッファを動的に割り当てる必要があります。std::auto_ptrしたがって、必要に応じてor std::unique_ptr、または astd::vector<_TCHAR>を使用することになるでしょうresize()。文字列の大きさが事前にわからない場合は、250_TCHAR秒などから始めて、バッファーが小さすぎることがわかるたびにサイズを 2 倍にすることをお勧めします。実際には、99.9999% の確率で 250 で十分だと思います。

代替案

に保存されている XML ファイル%APPDATA%。レジストリの下に保存されている JSON ファイル%APPDATA%…</p>

于 2010-10-18T22:54:13.917 に答える
2

これは奇妙です。通常、Windows API 関数を使用すると、NULL を渡して、バッファを作成するためのサイズを返すことができます。この関数はそうではないようです。適度なサイズを選んだほうがいいと思います。十分な大きさでない場合は、それが得られるまでバッファ サイズを 2 倍にし続けます。

于 2010-10-18T22:37:31.143 に答える