当前位置:嗨网首页>书籍在线阅读

28-把结构内容保存到文件中

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

14.8 把结构内容保存到文件中

由于结构可以存储不同类型的信息,所以它是构建数据库的重要工具。例如,可以用一个结构存储雇员或汽车零件的相关信息。最终,我们要把这些信息存储在文件中,并且能再次检索。数据库文件可以包含任意数量的此类数据对象。存储在一个结构中的整套信息被称为记录(record),单独的项被称为字段(field)。本节我们来探讨这个主题。

或许存储记录最没效率的方法是用 fprintf() 。例如,回忆程序清单14.1中的book结构:

#define MAXTITL 40
#define MAXAUTL 40
struct book {
     char title[MAXTITL];
     char author[MAXAUTL];
     float value;
};

如果 pbook 标识一个文件流,那么通过下面这条语句可以把信息存储在 struct book 类型的结构变量 primer 中:

fprintf(pbooks, "%s %s %.2f\n", primer.title,primer.author, primer.value);

对于一些结构(如,有30个成员的结构),这个方法用起来很不方便。另外,在检索时还存在问题,因为程序要知道一个字段结束和另一个字段开始的位置。虽然用固定字段宽度的格式可以解决这个问题(例如, "%39s%39s%8.2f" ),但是这个方法仍然很笨拙。

更好的方案是使用 fread()fwrite() 函数读写结构大小的单元。回忆一下,这两个函数使用与程序相同的二进制表示法。例如:

fwrite(&primer, sizeof(struct book), 1, pbooks);

定位到 primer 结构变量开始的位置,并把结构中所有的字节都拷贝到与 pbooks 相关的文件中。 sizeof(struct book) 告诉函数待拷贝的一块数据的大小, 1 表明一次拷贝一块数据。带相同参数的 fread() 函数从文件中拷贝一块结构大小的数据到 &primer 指向的位置。简而言之,这两个函数一次读写整个记录,而不是一个字段。

以二进制表示法存储数据的缺点是,不同的系统可能使用不同的二进制表示法,所以数据文件可能不具可移植性。甚至同一个系统,不同编译器设置也可能导致不同的二进制布局。