1

私は個人データベースの維持に関する学校のプロジェクトを行っています。しかし、私の講師は実践について説明していませんでした。彼らは、cでコーディングする方法ではなく、理論(データ構造など)について説明しました。

私たちは、彼らが解決したいと思っていた一定量のテーブル、インデックス、およびコンサルトを与えられ、遅れて実行されるデータ構造をプログラムすることになっています。

セカンダリインデックスのデータとb+ツリーを保持するためにハッシュテーブルを選択しました。


さて、b +ツリーはRAMに保持できますが、ハッシュテーブルはハードディスクに保持できる必要があります。そのため、fwrite()関数を使用してディスクに保持しています。しかし、私は問題を見つけました。単一のfwrite命令でバケット全体をディスクに書き込む方法がわかりません(これは、私が与えられた数少ない要件の1つです)。


構造を初期化するために私が持っているコード

FILE * file;
file = fopen ( "HistoriasClinicas.bin" , "wb" );
for(i=0;i<amountOfBuckets;i++)
    fwrite (Bucket , getpagesize() ,1 , file );
fclose (file);

そしてこれが私の構造です

typedef struct Hist_clin_s{
struct
{
    char codPaciente[7];
} X;
struct
{
    char codMedico[7];
    int fecha;
    char Observacion[151];
} Y;
int ptro;
}Hist_Clin;



typedef struct balde_s{
Hist_Clin *hcs;
char *waste; //Waste to make the bucket reach the page size.
}Bucket;

私が経験している問題は、バケツを書き込もうとしたときです。バケットサイズはわずか8(2つのポインターのcos)ですが、プログラムが既に開始されたらこれらの値を計算する必要があるため、これらの2つのポインターvectors[]を作成できません。そして、私が読んだものでは、ベクトルはメモリ内の場所を変更するため、ベクトルのサイズを変更する方法はありません。

私が考えることができる唯一の解決策は、バケット全体をchar配列(一種のバッファー)にロードしてから、それをメモリーに書き込むことです。

何か案は?

4

1 に答える 1

3

あなたがしていることは、それがあなたにグーグルのより多くの情報を助けるならば、一般にシリアル化と呼ばれます。

さて、この場合、あなたの最初の構造体:

typedef struct balde_s{
    Hist_Clin *hcs;
    char *waste; //Waste to make the bucket reach the page size.
}Bucket;

2つのポインタで構成されています。ポインターは、保存と読み込みのサイクル全体で必ずしも有効であるとは限らないため(通常、ポインターは有効ではないと見なすことができます)、ポインターを保存する必要はありません。代わりに、これら2つの構造体の内容をファイルに書き込みます。幸いなことに、あなたはこれをほとんど自分で簡単にしました。(ポインタから)アドレスがわかっているので、次を使用します。

fwrite( (void*)something.hcs, sizeof(Hist_Clin), 1, file);

これは、指定されたポインターから開始して、nバイト(1レコードのサイズ)を書き込みます。

于 2010-06-27T02:15:29.603 に答える