【问题标题】:Writing a structure all at once in a file在文件中一次写入结构
【发布时间】:2010-06-27 01:41:58
【问题描述】:

我正在做一个关于维护个人数据库的学校项目。但是我的导师没有解释实践,他们解释了理论(数据结构等),而不是如何用 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 个指针的余数),但我不能制作这两个指针向量 [],因为一旦程序已经启动,我必须计算这些值。对于我读到的内容,没有办法调整向量的大小,因为它们在内存中改变了位置。

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

有什么想法吗?

【问题讨论】:

    标签: c fwrite


    【解决方案1】:

    您所做的通常称为序列化,如果这有助于您在 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 个字节(一条记录的大小)。

    【讨论】:

    • 我能做些什么来处理这些垃圾?因为整个想法是将整个页面(在本例中为存储桶)写入磁盘。
    • 我不确定你的意思。我给出的代码示例将编写一个 Hist_Clin 结构及其包含的所有数据到文件中。前后都不会写入数据,因此是一种相对干净、无浪费的方法。您可能不得不求助于分页文件或使用某种文件即内存功能来访问数据。没有看到更完整的示例,我不确定它需要如何完成。
    • 完全正确。我被教导要尽量减少对磁盘的访问,我必须立即将整个页面(我认为这称为块,不确定翻译)写入磁盘,我展示的浪费是我缺少多少来填充页面,它只包含垃圾。
    • 如果您知道内存中连续有多个 Hist_Clin,那么您可以从第一个位置开始,然后将 sizeof 乘以计数。这将一次倾倒整个集团。我的方法是将一个块(如果您将 Hist_Clin 作为一个块)写入磁盘。写一整个内存页似乎有点多。但是,文件可能会被缓冲。就 FILE 而言,我并不肯定,但我知道 fstream 在内存中缓冲,只是偶尔写入磁盘。如果您可以创建一个用于写入的内存缓冲区或文件已被缓冲,则可以最大限度地减少磁盘读取/写入。
    • 好的,非常感谢,我终于决定连载了。我正在使用 char * 缓冲区。存储所有内容并编写它。
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多