《C语言程序设计 教学课件 ppt 作者 郑山红 李万龙 宋立明 侯秀萍 第9章 文件》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 郑山红 李万龙 宋立明 侯秀萍 第9章 文件(43页珍藏版)》请在金锄头文库上搜索。
1、第9章 文件,第9章 文件,了解文件的基本概念和分类 熟悉文件的相关操作函数 掌握文件打开、关闭、读写和定位函数的使用方法 会用C语言的文件打开、关闭、读写和定位函数编写程序,本章目标,9.1 文件概述,文件:是一组相关数据的有序集合,这个数据集的名称叫文件名 。 使用数据文件的目的 1、数据文件的改动不引起程序的改动程序与数据分离 2、不同程序可以访问同一数据文件中的数据数据共享 3、能长期保存程序运行的中间数据或结果数据,9.1 文件概述,文件分类: 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:
2、存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放,9.1 文件概述,如 int型数10000,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,9.2 文件指针,C语言采用缓冲文件系统来处理文件。缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区,当需要把数据写入磁盘时,首先把数据写入缓冲区,缓冲区把数据写入磁盘文件的工作由系统自动完成。从磁盘读入数据同样也要经过
3、缓冲区。,9.2 文件指针,文件结构体FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中,FILE结构体的定义如下: typedef struct short level; /* 缓冲区使用量 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件号 */ short bsize; /* 缓冲区大小缺省值512 */ unsigned char *buffer; /* 缓冲区指针 */ unsigned char *curp; /* 当前活动指针 */ unsigned
4、 char hold; /* 无缓冲区取消字符输 入 */ unsigned istemp; /* 草稿文件标识 */ short token; /* 作正确性检验 */ FILE;,9.2 文件指针,文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放,9.3 文件的打开和关闭,要对一个文件进行读写操作,先打开这个文件,当操作完成后要将该文件关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。关闭文件是指断开指针与
5、文件之间的联系,从而也就禁止了对该文件的读写。 文件使用方式:打开文件文件读/写关闭文件 C文件操作用库函数实现,包含在stdio.h,9.3 文件的打开和关闭,1、文件打开函数fopen(),要打开文件的名称,带开该文件后要对文件进行的操作,fopen()函数调用方式 FILE *fp; fp=fopen(文件名,使用文件方式),1、文件打开函数fopen(),说明: 1)文件使用方式由r、w、a、t、b和+这6个字符组成,各个字符的含义如下: r(read):读。 w(write):写。 a(append):追加。 t(text):文本文件,可省略不写。 b(binary):二进制文件。
6、+:读和写。,9.3 文件的打开和关闭,1、文件打开函数fopen(),2)用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据。 3)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。 4)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。 5)用“r+”、“w+”、“a+”方式打开的文件既可以用来输入数据,也可以用来输出数据。,9.3 文件的打开和关闭,1、文件打开函数fopen(),6)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障
7、;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdioh文件中已被定义为0)。 7)二进制文件读写操作速度比文本文件读写速度要快。把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII,因此与二进制文件相比,文本文件的读写要花费较多时间。,9.3 文件的打开和关闭,9.3.2 文件关闭函数fclose(),作用: 让文件指针与被关闭的文件实现“脱勾” 将未满的输出缓冲区数据写入文件,将未满的输入缓冲区数据取出,以避免数据丢失。 一般形式:fclose(文件指针名); 功能: 关闭文件指针名所
8、指向的文件。fclose函数有返回值,如果该操作执行成功时,则返回值为0;否则返回EOF。EOF是头文件“stdio.h”中定义的符号常量,值为-1。,9.3 文件的打开和关闭,9.4 文件读写,读字符函数fgetc() 一般形式:字符变量 = fgetc(文件指针名); 功能:从文件指针指向的磁盘文件中读一个字符,并存放到字符变量中 例如: c = fgetc(fp);,1、字符读写函数fgetc()和fputc(),1、字符读写函数fgetc()和fputc(),注意: 注意文件指针和文件内部的位置指针是不一样的。 对文件进行读操作时,为了避免文件已结束还在进行读操作而导致错误,可以用系统
9、函数feof来判断文件是否结束,当该函数的值为1(真)时表示文件结束,为0(假)时表示文件还没有结束。,9.4 文件读写,1、字符读写函数fgetc()和fputc(),写字符函数fputc() 一般形式:fputc函数(字符,文件指针名); 功能是:把一个字符写入指针所指向的文件中 fputc函数有一个返回值,若写入成功则返回写入的字符,否则返回一个EOF,可用此来判断写入是否成功。 例如: fputc(a, fp);,9.4 文件读写,1、 字符读写函数fgetc()和fputc(),fgetc()和fputc()函数使用举例 1)从键盘输入字符,存到文件test.txt中。,9.4 文件
10、读写,#include int main( ) FILE *fp; char ch; if(fp = fopen(”test.txt”, ”w”) = NULL printf(”Cannot open file!n”); exit(0); while (ch = getchar( ) != n) fputc(ch, fp); fclose(fp); return 0; 运行结果如下: I love China!,1、字符读写函数fgetc()和fputc(),2)从键盘输入字符,逐个存到磁盘文件,直到输入 “#“为止,9.4 文件读写,#include main() FILE *fp; cha
11、r ch,*filename=“out.txt”; if(fp=fopen(filename,“w“)=NULL) printf(“cannot open filen“); exit(0); printf(“Please input string:“); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); ,1、字符读写函数fgetc()和fputc(),3)读文本文件内容,并显示,#include main() FILE *fp; char ch,*filename=“out.txt”
12、; if(fp=fopen(filename,”r“)=NULL) printf(“cannot open filen“); exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp); ,9.4 文件读写,1、字符读写函数fgetc()和fputc(),4.文件拷贝,9.4 文件读写,#include main() FILE *in, *out; char ch,infile10,outfile10; scanf(“%s“,infile); scanf(“%s“,outfile); if (in = fopen(infile, “r“)
13、= NULL) printf(“Cannot open infile.n“); exit(0); if (out = fopen(outfile, “w“)= NULL) printf(“Cannot open outfile.n“); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out); ,2、字符串读写函数fgets()和fputs(),读字符串函数fgets() 一般形式:fgets(字符数组名,n,文件指针); 功能:从文件指针所指向的文件中读一个长度不超过n-1的字符串,并将其存入到字符数组
14、中。其中,n是一个正整数,用以指明字符串的长度。 fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULL 例如: fgets(str, 8, fp); 需要注意的是,在使用该函数读取字符串时,若在读入7个字符之前遇到了换行符或者文件结束标志EOF,则读操作结束。,9.4 文件读写,2、字符串读写函数fgets()和fputs(),写字符串函数fputs() 一般形式:fputs(字符串,文件指针名); 功能:将一个字符串写入到指定的文件中。其中,字符串可以是字符串常量,也可以是字符数组名或字符指针变量。 fputs正常时返回写入的最后一个字符;出错为EOF 例如: fputs(”a
15、bcd”, fp);,9.4 文件读写,2、字符串读写函数fgets()和fputs(),fputs和fgets函数使用举例 1.从一个文本文件test1.txt中读出字符串,再写入到文件test2.txt中(假定test1.txt中只存在一行字符“I love China!”)。,9.4 文件读写,#include #include int main( ) FILE *fp1, *fp2; char str128; if (fp1 = fopen(”test1.txt”, ”r”) = NULL) printf(”Cannot open filen”); exit(0); ,if(fp2 = fopen(”test2.txt”, ”w”) = NULL) printf(”Cannot open filen”); exit(0); while(strlen(fgets(str, 128, fp1) 0) fputs(str, fp2 ); printf(”%s”, str); fclose(fp1); fclose(fp2); return 0; ,3、数据块读写函数fread()和fwrite(),读数据块函数fread() 一般形式:fread(buffer,size,count,fp); 功能:从fp所指向的文件中每次读出大小为size个字节的数据,读取co