0

コードは次のようになります。

struct Dog {
  string name;
  unsigned int age;
};

int main()
{
    Dog d = {.age = 3, .name = "Lion"};
    FILE *fp = fopen("dog.txt", "wb");
    fwrite(&d, sizeof(d), 1, fp);   //write d into dog.txt
}

私の問題は、データオブジェクトまたは構造をバイナリファイルに書き込むポイントは何ですか?実行中のプログラムで生成されたデータを永続化するためだと思いますよね?はいの場合、どうすればデータを取り戻すことができますか?fread?を使用する

これは私にデータベースのようなものを考えさせます、線量データベースは同じ方法でディスクにデータを書き込みますか?

4

4 に答える 4

2

バイナリでのデータの書き込みは非常に便利で、テキストでの読み取り/書き込みよりもはるかに高速です。たとえば、ビデオゲーム(すべてのビデオゲームがこれを行うわけではありません)を例にとると、ゲームが保存されると、必要なすべての構造/クラスやその他のデータが書き込まれます。バイナリの保存ファイル。

これはバイナリを使用するための1つの使用法にすぎませんが、これを行う主な理由は速度です。

また、データを読み戻すには、保存した形式を知る必要があります。たとえば、簡単な例として、整数、nサイズのchar配列、ブール値を保存した場合は、バイナリを読み取る必要があります。整数、nサイズのchar配列、およびブール値としてファイルします。そうしないと、データが不適切に読み取られ、まったく役に立たなくなります。

于 2012-08-16T03:13:46.420 に答える
2

あなたはそれを行うことができますが、気にするべき多くの問題があります:

  • 構造体型: すべてのデータは実際に構造体にする必要があります。または、他の場所へのポインターを書き込むことができます。
  • 構造の変更: 構造を変更する必要がある場合は、古い構造体を読み取って新しい構造体を書き込むためのコンバーターを作成する必要があります。
  • 言語の相互運用性: 他の言語を使用してデータにアクセスすることは困難です

これは、リレーショナル データベースが普及する前の初期の一般的な方法でした。レコード番号を指すインデックス ファイルを作成できます。

ただし、最近では、シリアル化を行い、バイナリではなく文字列を記述することをお勧めします。

: string が char[40] のようなものである場合、コードは生き残る可能性があります... しかし、質問が C++ に関するものであり、string がクラスである場合は、成長する前に子供を殺してください! 文字列オブジェクトの文字は、構造体ではなくヒープにあります。

于 2012-08-16T03:23:23.850 に答える
1

気をつけて。構造体のフィールド 'name' のタイプは 'string' です。このクラスには、動的に割り当てられたデータが含まれます。したがって、この方法で「文字列」データをファイルに書き込むと、データ自体ではなく、ポインターのみが書き込まれます。

于 2012-08-16T03:24:29.437 に答える
0

C++ Middleware Writerは、ファイルとの間のバイナリ シリアル化をサポートしています。

マーシャリングの観点から、構造体の「unsigned int age」メンバーは潜在的な問題です。タイプを uint32_t に変更することを検討します。

于 2012-08-16T15:30:44.007 に答える