1

我正在做一个关于维护个人数据库的学校项目。但我的导师没有解释实践,他们解释了理论(数据结构等),而不是如何用 c 编码。

我们给定了他们想要解决的一定数量的表、索引和咨询,我们将对后面运行的数据结构进行编程。

我选择了一个哈希表来保存二级索引的数据和 b+树。


好吧,我可以将 b+ 树保存在 RAM 中,但我必须能够将哈希表保存在硬盘中。所以我使用 fwrite() 函数将它保存在磁盘中。但是我发现了一个问题。我不知道如何使用单个 fwrite 指令将整个存储桶写入磁盘(这是我得到的少数要求之一)。


我用于初始化结构的代码

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 个指针的余数),但我不能制作这两个指针向量 [],因为一旦程序已经启动,我必须计算这些值。对于我读到的内容,没有办法调整向量的大小,因为它们在内存中改变了位置。

我能想到的唯一解决方案是将整个存储桶加载到 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个指针组成。指针不一定在保存加载周期内有效(您通常可以指望它们不会有效),因此您不需要保存它们。相反,您需要将这两个结构的内容写入文件。幸运的是,你几乎让这一切变得容易了。您知道地址(来自指针),所以只需使用:

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

这将写入 n 个字节(一条记录的大小),从给定的指针开始。

于 2010-06-27T02:15:29.603 回答