在文件中一次编写一个结构

时间:2010-06-27 01:41:59

标签: c fwrite

我正在做一个关于维护个人数据库的学校项目。但我的导师没有解释这种做法,他们解释了理论(数据结构等)而不是如何在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数组(一种缓冲区)中,然后将其写入内存。

有什么想法吗?

1 个答案:

答案 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个字节(一个记录的大小)。