2

私は C++ を使用しており、予算プログラムを作成しています (多くのプログラムが利用可能であることは承知しています。これは単なる学習プロジェクトです)。

「ページ」などの他のオブジェクトを含む本オブジェクトと呼ぶものを保存したいと思います。ページには、キャッシュフローとエントリも含まれています。問題は、エントリまたはキャッシュフローの量に制限がないことです。

データをテキスト ファイルに保存する方法について多くの情報を見つけましたが、それは私がやりたいことではありません。

シリアル化がこの問題の解決策である可能性があると言われたので、boost ライブラリの使用を検討してみました。どの関数がブーストであるか、またはブーストを使用する適切な方法が何であるかさえ完全にはわかりません。

私が見たバイナリ ファイルのほとんどの例は、固定サイズのメンバを持つオブジェクトです。たとえば、ポイントには、両方とも double である x 値と y 値が含まれる場合があります。これは常に当てはまるため、sizeOf(Point) を使用するのは簡単です。

そのため、この質問に対する直接の回答、または問題の解決方法に関する情報への有用なリンクを探しています。ただし、リンクが質問に固有のものであることを確認してください。

cplusplusにも同じ質問を投稿しました

4

2 に答える 2

3

一般に、可変長レコードを格納するには 2 つの方法があります。

  1. 最初にサイズ整数を格納し、その後にデータを格納します。
  2. データを保存し、末尾にセンチネル文字 (または値) を追加します。

C スタイルの文字列は 2 番目のオプションを使用します。
オプション 1 の場合、数値にはデータのサイズが含まれます。

オプションのフィールド

オプション フィールドのリレーショナル データベース設計を検討している場合、既知のレコードまたは固定レコードを含む 1 つのテーブルと、レコード ID を持つオプション フィールドを含む別のテーブルを作成します。

より単純なルートは、XML に似たもの、つまりフィールド ラベルに移動することです。
オブジェクトを静的フィールドとオプション フィールドの 2 つのセクションに分割します。静的フィールド セクションの後には、オプションのフィールド セクションが続きます。オプションのフィールド セクションには、フィールド名とそれに続くフィールド データが含まれます。フィールド名を読み取り、次に値を読み取ります。

設計を見直して、オプションのフィールドを削除できるかどうかを確認することをお勧めします。また、複雑なフィールドの場合は、独自のデータを読み取らせます。

バイナリ データの格納

プラットフォーム間でデータを共有する場合は、ASCII またはテキスト表現の使用を検討してください。

エンディアンとビットサイズについて調べてください。たとえば、あるプラットフォームでは、バイナリ表現の最下位バイトを最初に格納し、32 ビット (4 バイト) を使用できます。最上位バイトが最初の 64 ビットの受信プラットフォームでは、データを直接読み取るのに問題があり、変換する必要があります。したがって、バイナリ ストレージの利点が失われます。

同様に、浮動小数点はバイナリでもうまく機能しません。また、浮動小数点形式間の変換時に精度が失われます。

オプションのフィールドをバイナリで使用する場合、テキスト名ではなく、フィールド ID にセンチネル バイトまたは数値を使用します。

また、テキスト形式のデータは、バイナリ形式のデータよりもデバッグがはるかに簡単です。

データベースの使用を検討する

データベースを使用する価値があるのはどの時点ですか? を参照してください。

于 2012-06-09T18:28:21.377 に答える
0

boost::serializationドキュメントはこちらです

boost::serializationユーザー作成のクラスと STL コンテナーを処理します: std::dequestd::listなど。

于 2012-06-09T18:27:07.133 に答える