我正在做一个关于维护个人数据库的学校项目。但我的导师没有解释这种做法,他们解释了理论(数据结构等)而不是如何在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个指针的cos)但是我不能制作那两个指针向量[]因为我必须在程序启动后计算这些值。而对于我所读到的,没有办法调整向量的大小,因为它们会改变内存中的位置。
我能想到的唯一解决方案是将整个存储桶加载到一个char数组(一种缓冲区)中,然后将其写入内存。
有什么想法吗?
答案 0 :(得分: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个字节(一个记录的大小)。