1

私はC++の初心者です。従業員情報を保持する構造配列があります。値を構造体に入れ、それらの値をバイナリ dat ファイルに書き込み、値をプログラムに読み込んで、コンソールに表示できるようにします。これが私の問題です。プログラムを閉じると、ファイルからデータを読み取ってメモリに戻すことができず、代わりに「ガベージ」が読み取られます。

私はいくつかのことを試してから、私の本でこれを読みました:

: ポインターを含む構造体は、このセクションの手法を使用してディスクに正しく格納することはできません。これは、プログラムの後続の実行時に構造体がメモリに読み込まれる場合、すべてのプログラム変数が同じメモリ位置にあるとは限らないためです。

以前に保存された情報を含む .dat ファイルを開いて、それを構造体配列に読み込もうとしたときに、これが起こっていると確信しています。

質問を明確にするのに役立つ場合は、コード例を送信できます。任意の提案をいただければ幸いです。

4

1 に答える 1

0

一般的に言えば (私はあなたのコードを持っていないので)、一般的に構造体またはクラスのバイトをファイルに書き込むべきではない理由が 2 つあります。

  • あなたの本が述べたように、ディスクへのポインタの書き込みは無意味です。なぜなら、そのアドレスのデータではなく、ランダムなアドレスを保存しているだけだからです。データ自体を書き出す必要があります。

  • 特に、構造体/クラスを一気に書き込もうとしないで くださいfwrite(file, myStruct, sizeof(myStruct))。コンパイラは、プロセッサがそれらをより速く読み取れるようにするために、構造体の変数の間に空のバイトを入れることがあります - これはpaddingと呼ばれます。別のコンパイラを使用したり、別のコンピューター アーキテクチャ用にコンパイルしたりすると、構造が異なる方法でパディングされる可能性があるため、あるコンピューターで正しく開くファイルが別のコンピューターでは正しく開かない可能性があります。

データをファイルに書き出す方法はたくさんあります。バイナリ形式でも、XML のような人間が読める形式でもかまいません。使用する方法に関係なく (それぞれに長所と短所があります)、どの方法でも、保存したいデータを 1 つずつ書き込んでから、1 つずつ読み戻す必要があります。Java や C# などの高水準言語には、オブジェクトに関するメタデータを格納することでこれを自動的に行う方法がありますが、これにはメモリ使用量が増え、プログラムの実行が遅くなります。

于 2012-10-31T03:28:40.370 に答える