二进制文件
二进制文件非常类似数组的结构,除了结构在一个磁盘文件而不是数组在内存中。因为结构在一个二进制文件在磁盘上,你可以创建非常大的集合(只受限于您可用磁盘空间)。他们也永久,总是可用的。唯一的缺点是来自磁盘访问时间的缓慢。
二进制文件有两个特性,区别于文本文件:
广告
- 你可以立刻跳到任何结构文件,它提供了随机存取数组中。
- 你可以改变结构的内容文件的任何地方在任何时间。
二进制文件通常也更快的读写速度比文本文件,因为一个二进制图像记录的存储直接从内存磁盘(反之亦然)。在一个文本文件,每样东西都要来回转换成文本,这需要时间。
C支持file-of-structures概念非常干净。一旦你打开文件你可以阅读结构,编写一个结构,或寻求任何文件中的结构。这个文件概念支持的概念文件指针。文件打开时,指针指向的记录0(第一个记录文件)。任何读操作读取当前指针结构和移动下一个结构的指针。任何写操作写入当前指针结构和移动下一个结构的指针。寻求移动指针所请求的记录。
记住C认为所有的磁盘文件从磁盘读取到内存的字节块或从内存中读取到磁盘上。C使用一个文件指针,但它可以指向任何文件中的字节的位置。因此需要跟踪的事情。
下面的程序演示了这些概念:
# include < stdio。h > / *随机记录描述,可以是任何* / struct rec {int x, y, z;};/ *写然后从文件中读取任意记录10“垃圾”。* / int main () {int i, j。文件* f;struct rec r;/ *创建文件的记录* / f = fopen(“垃圾”、“w”);如果(!)返回1;(我= 1,< = 10; i++) { r.x=i; fwrite(&r,sizeof(struct rec),1,f); } fclose(f); /* read the 10 records */ f=fopen("junk","r"); if (!f) return 1; for (i=1;i<=10; i++) { fread(&r,sizeof(struct rec),1,f); printf("%d\n",r.x); } fclose(f); printf("\n"); /* use fseek to read the 10 records in reverse order */ f=fopen("junk","r"); if (!f) return 1; for (i=9; i>=0; i--) { fseek(f,sizeof(struct rec)*i,SEEK_SET); fread(&r,sizeof(struct rec),1,f); printf("%d\n",r.x); } fclose(f); printf("\n"); /* use fseek to read every other record */ f=fopen("junk","r"); if (!f) return 1; fseek(f,0,SEEK_SET); for (i=0;i<5; i++) { fread(&r,sizeof(struct rec),1,f); printf("%d\n",r.x); fseek(f,sizeof(struct rec),SEEK_CUR); } fclose(f); printf("\n"); /* use fseek to read 4th record, change it, and write it back */ f=fopen("junk","r+"); if (!f) return 1; fseek(f,sizeof(struct rec)*3,SEEK_SET); fread(&r,sizeof(struct rec),1,f); r.x=100; fseek(f,sizeof(struct rec)*3,SEEK_SET); fwrite(&r,sizeof(struct rec),1,f); fclose(f); printf("\n"); /* read the 10 records to insure 4th record was changed */ f=fopen("junk","r"); if (!f) return 1; for (i=1;i<=10; i++) { fread(&r,sizeof(struct rec),1,f); printf("%d\n",r.x); } fclose(f); return 0; }
在这个程序中,一个结构描述矩形已经使用,但是您可以使用任何你想要的结构描述。你可以看到,打开外部文件和文件关闭工作完全一样的文本文件。
这里的新功能从文件中读,写入文件和fseek。从文件中读函数包含四个参数:
- 一个内存地址
- 读取的字节数/块
- 块的数量
- 文件的变量
因此,线从文件中读(设计验证,sizeof (struct rec), 1, f);说读12字节的大小矩形)从文件f(从当前文件指针的位置)到内存地址描述:。12字节块之一是要求。是一样简单的100块从磁盘读入一个数组在内存中通过改变1到100。
的写入文件功能相同的方式工作,但从内存的字节块移动到该文件。的fseek函数移动文件指针指向文件中的一个字节。一般来说,你移动的指针sizeof (struct rec)增量保持指针记录边界。寻求时您可以使用三个选项:
- SEEK_SET
- SEEK_CUR
- SEEK_END
SEEK_SET移动的指针x文件的字节从一开始(从文件中的字节0)。SEEK_CUR移动的指针x字节从当前指针位置。SEEK_END从文件的末尾移动指针(因此您必须使用负偏移量与该选项)。
几种不同的选项出现在上面的代码中。特别是,注意的部分文件被打开r +模式。这将打开文件阅读和写作,记录可以被改变。寻求一个记录的代码,读取它,和修改一个字段;然后寻找回来,因为阅读取代了指针,和写更改回来。