第10章 数据存储—C语言中的文件

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

10.1.2 缓冲文件系统
• 文件根据数据存取实现过程,分为缓冲文件系统 与非缓冲文件系统。
– 缓冲文件系统:指系统会自动为每一个使用的文件分 配一块缓冲区(内存单元),当C程序需要把数据存 入磁盘文件时,首先把数据存入缓冲区,缓冲区真正 把数据存入磁盘文件的工作由系统自动完成,其目的 是为了提高文件操作速度。从磁盘读入数据同样也要 经过缓冲区。 – 非缓冲文件系统:磁盘文件对应的缓冲区不是由系统 自动分配,而需要编程者在程序中用C语句完成缓冲 区分配。
if ((fp=fopen(“file1.txt”,”r”)) = = NULL) { printf(“File open error!\n”); exit(0); }
• 10.2.2 关闭文件
– 关闭文件通过调用标准函数fcolse( )实现,其一般格 式为:
fclose(文件指针)
– 该函数将返回一个整数,若该数为0表示正常关闭文件, 关闭文件操作除了强制把缓 否则表示无法正常关闭文件,所以关闭文件也应使用 冲区中的数据写入磁盘外, 还将释放文件缓冲区单元和 条件判断:
10.3.1 文本文件的读写
• 字符读写
– 字符读写函数是以字符为单位的,也就是每次可从文 件中读出或写入一个字符。 – 函数fputc()的调用格式如下:
fputc(ch,fp); 它的功能是把一个字符ch写到fp所指示的磁盘文件上。如果写 文件成功。函数返回字符ch,否则返回-1。
– 函数fgetc()的调用格式如下:
• 【例10-5】将磁盘文件a.txt中的内容复制到文件b.txt中。
#include <stdio.h> #include <stdlib.h> void main() { FILE *fpa, *fpb ; /* 定义文件指针 */ if ((fpa=fopen("a.txt","r")) == NULL) { /* 打开文件a.txt printf("can notBiblioteka Baiduopen file a.txt !\n"); exit(0); } if ((fpb=fopen("b.txt","w")) == NULL) { /* 打开文件b.txt printf("can not open file b.txt!\n"); exit(0); } while ( !feof(fpa) ) /* 文件复制 */ fputc(fgetc(fpa) , fpb) ; if (fclose(fpa)) { /* 关闭文件a.txt printf ( "Can not close file a.txt !\n" ); exit(0); } if (fclose(fpb)) { /* 关闭文件b.txt printf ( "Can not close file b.txt !\n" ); exit(0); } }
打开只读文件 建立只写新文件 打开添加写文件 打开读/写文件 建立读/写新文件 打开读/写文件
• C语言允许同时打开多个文件,不同文件采用不 同文件指针指示,但不允许同一个文件在关闭前 再次打开。 • 为保证文件操作的可靠性,调用fopen( )时最好 做一个判断,以确保文件正常打开后再进行读写。 其形式为:
• 10.2.1 打开文件
– 文件打开功能是用于指定被操作的文件名,并 请求系统分配相应的文件缓冲区单元。文件打 开由标准函数fopen( )实现,其调用的一般形 式为:
FILE *fp ; fp = fopen(文件名,文件使用方式) ;
例: fp = fopen(“test.txt”, “r”); fp = fopen( “c:\\tc\\test.txt”,”w” ) ;
• 文件使用方式
文本文件(ASCII) 二进制文件
使用方式
“r” “w” “a” “ r+ ” “ w +” “ a +”


使用方式
“ rb ” “ wb ” “ ab ” “ rb+ ” “ wb+ ” “ ab+ ”


打开只读文件 建立只写新文件 打开添加写文件 打开读/写文件 建立读/写新文件 打开读/写文件
ch = fgetc( fp ); 它的功能是从fp所指示的磁盘文件上读入一个字符到ch。
• 【例10-2】从键盘输入10个字符,写到文件f1.txt中。
#include <stdio.h> #include <stdlib.h> void main() { int i ; char ch ; FILE *fp ; /* 定义文件指针 */ if ((fp=fopen("f1.txt","w")) == NULL) { /* 打开文件 */ printf("File open error!\n"); exit(0); } for( i=0 ; i<10 ; i++ ) { /* 写文件10次 */ ch=getchar(); fputc(ch, fp); } if (fclose(fp)) { /* 关闭文件 */ printf ( "Can not close the file!\n" ); exit(0); } }
• 【例10-3】从键盘输入10个字符,写到文件f2.txt中,再 重新读出,输出到屏幕上。
#include <stdio.h> #include <stdlib.h> void main() { int i ; char ch ; FILE *fp ; /* 定义文件指针 */ if ((fp=fopen("f2.txt","w")) == NULL) { /* 打开文件f2.txt */ printf("File open error!\n"); exit(0); } for( i=0 ; i<10 ; i++ ) { /* 写文件10次 */ ch=getchar(); fputc(ch, fp) ; } if (fclose(fp)) { /* 关闭文件 */ printf ( "Can not close the file!\n" ); exit(0); } if ((fp=fopen("f2.txt","r")) == NULL) { /* 按读方式再次打开文件f2.txt */ printf("File open error!\n"); exit(0); } for( i=0 ; i<10 ; i++ ) { /* 读文件10次 */ ch=fgetc(fp); putchar(ch) ; } if (fclose(fp)) { /* 再次关闭文件 */ printf ( "Can not close the file!\n" ); exit(0); } }
• 文件操作步骤
– (1)定义文件指针 – (2)打开文件 – (3)文件读、写操作 – (4)关闭文件
• 文件类型指针
C语言中用结构类型FILE来描述文件缓冲区信息,并 采用指针形式来指示文件缓冲区单元。 由于C语言中的文件操作都是通过调用标准函数来完 typedef struct { 成的,结构体指针的参数传递效率更高。因此,C语 short level; /* 缓冲区使用量 */ 言文件操作统一以文件指针方式实现。定义文件类型 unsigned flags; /* 文件状态标志 */ 指针的格式为: fd; char /* 文件描述符 */ short /* 缓冲区大小 */ FILE *fp ; bsize;
• 【例10-4】从键盘输入一行字符,写到文件f3.txt中,并 重新读出,显示在屏幕上。
#include <stdio.h> #include <stdlib.h> void main() { char ch ; FILE *fp ; /* 定义文件指针 */ if ((fp=fopen("f3.txt","w")) == NULL) { /* 打开文件 */ printf("File open error!\n"); exit(0); } while ( (ch=getchar( ))!=’\n’ ) fputc(ch, fp) ; if (fclose(fp)) { /* 关闭文件 */ printf ( "Can not close the file!\n" ); exit(0); } if ((fp=fopen("f3.txt","r")) == NULL) { /* 按读方式再次打开文件 */ printf("File open error!\n"); exit(0); } ch= fgetc(fp); while ( ch!=EOF ) { /* 读到的不是EOF的话,继续读文件 */ putchar(ch) ; ch=fgetc(fp); } if (fclose(fp)) { /* 再次关闭文件 */ printf ( "Can not close the file!\n" ); exit(0); } }
第10章 数据存储 —C语言中的文件
10.1 C文件概述 10.2 文件的打开与关闭 10.3 文件的顺序读写 10.4 文件的随机读写 10.5 文件程序设计示例
10.1 C文件概述
• 到目前为止,我们编写的C语言程序有一个很 大的缺陷:数据不能保存,也就是说,程序与 数据不独立。 • 程序的实现过程中,依赖于把数据保存到变量 中,而变量是通过内存单元存贮数据的,当一 个程序运行完成或终止运行,所有变量的数据 不再保存。 • 文件是解决问题的有效办法,它通过把数据存 储在磁盘文件中,得以长久保存。
unsigned char *buffer; unsigned char *curp; unsigned char hold; unsigned istemp; short token; } FILE;
/* 文件缓冲区的首地址 */ /* 指向文件缓冲区的工作指针 */ /* 其他信息 */
10.2 文件的打开与关闭
• 例10-4中的程序段:
ch= fgetc(fp); while ( ch!=EOF ) { putchar(ch) ; ch=fgetc(fp); }
• 可改写为:
while ( !feof(fp) ) { ch=fgetc(fp); putchar(ch) ; }
• 函数feof(fp)的功能是判断文件是否被读到了 结束位置。当文件结束时,函数返回1。
• 缓冲文件系统工作原理
10.1.3 文件程序设计初探
• 【例10-1】用C语言编写程序,读取位图(BMP) 文件中的基本信息。
– 一个BMP文件一般由四部分组成:文件头、位图信息头、 颜色表和图形数据。本例主要读取的是BMP文件中文件 头和位图信息头中的一些基本信息。 – 在本例中,首先定义了文件头结构类型 BITMAPFILEHEADER和位图信息头结构类型 BITMAPINFOHEADER ,在main函数中,调用fread()函 数从BMP文件中读取一个BITMAPFILEHEADER结构的 数据给变量fileHeader,并输出其中的相关成员信息,用 同样的方法,再读取位图信息头中的信息并输出 – 读者在运行该实例时,可以根据注释信息自行调整输出项, 也可以在学习完本章的知识后在此程序的基础上对BMP 文件做进一步的操作。
FILE结构体,使文件指针 if (fclose(fp)) { printf ( “Can not close the file!\n” ); 与具体文件脱钩。 exit(0); }
10.3 文件的顺序读写
• 文件最基本的数据操作有两个:从文件中 读取信息(读操作)和把信息存放到文件 中(写操作)。 • C语言为文件的读写操作也定义了一系列标 准函数,它们都在stdio.h中说明。对文件 的读写操作都是通过调用这些标准函数来 完成的。
10.1.1 文件的分类
• C语言把文件看作为数据流,即数据以一维方式 按顺序组织。 • 根据数据存储的形式,文件的数据流又分成字符 流和二进制流,前者称为文本文件(或字符文 件),后者称为二进制文件。 • C语言源程序是文本文件,其内容完全由ASCII码 构成,通过“记事本”等编辑工具可以对文件内 容进行查看、修改等。C程序的可执行文件是二 进制文件,它包含的是计算机内部的机器代码
• 文件(File)是指保存在外存储器上的一 组数据的有序集合。它有3个主要特征:
– 文件被保存在外存储器上,如磁盘、磁带或光 盘,可以长久保存; – 文件中的数据是有序的,将按一定顺序存放和 读取。一般情况下,数据的读取顺序与存储顺 序相同; – 文件中数据的数量可以是不定的,定义时不必 象数组那样必须规定好大小,可以根据实际需 要存储,它只受外存自由空间的限制。
相关文档
最新文档