2010-06-27 64 views
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; 

是我遇到的问题是,当我尝试写一个桶。 bucket大小只有8(两个指针的cos),但我不能制作这两个指针向量[],因为一旦程序已经启动,我必须计算这些值。而对于我所读的内容,没有办法调整矢量大小,因为它们会改变内存中的位置。

我能想到的唯一解决方案是将整个桶加载到一个char数组(缓冲区类型)中,然后将其写入内存。

任何想法?

回答

3

你在做什么通常称为序列化,如果这有助于你Google更多的信息。

现在,在这种情况下,你的第一个结构:

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个字节(一个记录的大小),以指定的指针。

+0

我该怎么处理废物? 因为整个想法是将整个页面(在这种情况下为桶)写入磁盘。 – 2010-06-27 02:19:39

+0

我不确定你的意思。我给出的代码示例将写入一个Hist_Clin结构及其包含的所有数据。之前或之后没有数据会被写入,所以它是一个相对干净,无浪费的方法。您可能不得不求助于分页文件或使用某种文件存储功能来访问数据。没有看到更完整的例子,我不确定它将如何完成。 – ssube 2010-06-27 02:38:10

+0

是不是保留了结构? ;) – Nyan 2010-06-27 03:07:01