-2

オブジェクトをファイル (*.txt) に書き込みたい

class MyCircle{
      double x; 
      double y; 
      double radius;
      char index; 
      int check;}

class Question{
      int index;
      int quantityOfAnswers; 
      MyCircle [] arrCircles; 
      char solution;}

class answersShee{
    int answersSheetID;
    string answersSheetName;
    int quantityOfCandidateID; 
    int quantityOfCodeExamination;
    int quantityOfQuestion;
    Question arrCandidateIDs[quantityOfCandidateID];
    Question arrCodeExaminations[quantityOfCodeExamination]; 
    Question arrQuestions[quantityOfQuestion];}

クラスanswerSheetをファイル(* .txt)に読み書きしたいのですが、C++ではJavaのようにオブジェクトを書く必要はありません:(

4

1 に答える 1

0

本当にわかりません。インターネット上には多くのソリューションが存在します。「c++ オブジェクトのシリアライゼーション」を検索してください。

ファイル内のバイナリまたはテキスト表現。

ファイルへのオブジェクトの書き込みを開始する前に、バイナリ表現とテキスト表現のどちらを書き込むかを決定する必要があります。

バイナリ表現は、プラットフォームの表現のビットとバイトを反映しています。数値やその他の構造は、テキスト エディターで表示すると読みにくい場合があります。これは通常、最も効率的ですが、移植性が最も低いソリューションです。ポインターはうまく機能しません。また、マルチバイト整数もうまく機能しません (「エンディアン」または「リトル エンディアン」を調べてください)。可変長フィールドでは、バイナリ フィールド (長さフィールドやセンチネル値など) により多くの構造が必要です。

テキスト表現は、人間が読める形式です。テキスト形式は移植性が高く、人間にとって読みやすいものです。この形式は読み書きが遅くなります (テキスト形式への変換とテキスト形式からの変換のため)。また、ポインター値はこの形式では移植されません (数値リンク値を使用しない限り)。

テキスト表現をファイルに書き込みます。

インターネット上にはたくさんの例があります。要約すると、この機能には通常、operator <<と のオーバーロードが含まれoperator >>ます。これは、クラスと構造に機能を追加することを意味します (または、独立した関数を作成することもできます)。

シリアライゼーション ライブラリ

多くの人がこれらを使用しています。私はそれらを使用していないので、これらを推奨することも推奨しないこともできません. 要約すると、これらのライブラリは、ファイルとの間でのオブジェクトの読み取りと書き込みを簡素化します。

バイナリ形式の書き込み

繰り返しますが、これにはクラスと構造に機能を追加する (または独立した関数を作成する) 必要があります。std::istream::readメソッドとメソッドを使用する典型的なケースを拡張するのが好きstd::ostream::writeです。

私は次のテクニックを使用し
ます。 1. オブジェクトがバッファ内で占有するサイズを各オブジェクトに尋ね、値を合計します。
1.1。これは再帰的で、各オブジェクトは各メンバーにそのサイズを尋ねます。2.サイズ
のバッファを割り当てます。 3. バッファへのポインタを各オブジェクトに渡し、バッファ ポインタが指す位置にその内容を書き込むように各オブジェクトに指示します (オブジェクトはそれに応じてポインタをインクリメントします)。 4. バイナリ変換を使用して、バッファを 1 つの大きなブロックとしてファイルに書き込みます。 5. 読み方は似ていますが、順序が異なります。 uint8_t


于 2015-04-21T17:34:31.833 に答える