《c语言课件C8-文件-2010.11.20更新.ppt》由会员分享,可在线阅读,更多相关《c语言课件C8-文件-2010.11.20更新.ppt(38页珍藏版)》请在三一文库上搜索。
1、第八章 文件,2019/2/14,2,8.1 C语言文件概述 8.2 缓冲文件输入输出系统,退出,2019/2/14,3,8.1 C语言文件概述,文件:把数据组织起来而构成的数据集合体,是操作系统数据管理的单位。,2019/2/14,4,文件分类 按存储介质 普通文件:存储介质文件(磁盘、磁带等)。 设备文件:非存储介质(键盘、显示器、打印机等)。 按文件内部编码方式 ASCII文件(文本文件、TEXT文件):每个字节存放ASCII码,表示一个字符。 例如源程序文件就是ASCII文件,用DOS命令TYPE可以显示文件的内容。 二进制文件:数据按其在内存中的存储形式原样存放。,2019/2/14
2、,5,例:整数10000的存储。,文本文件特点: 存储量大,转换为二进制速度慢,直观易记。,二进制文件特点: 存储量小,无需转换。但因一个字节不对应一个字符,故不能直接输出其字符形式。,2019/2/14,6,文件分类 按存储介质 普通文件:存储介质文件(磁盘、磁带等)。 设备文件:非存储介质(键盘、显示器、打印机等)。 按文件内部编码方式 ASCII文件(文本文件、TEXT文件):每个字节存放ASCII码,表示一个字符。 例如源程序文件就是ASCII文件,用DOS命令TYPE可以显示文件的内容。 二进制文件:数据按其在内存中的存储形式原样存放。 按文件的逻辑结构 记录文件:由具有一定结构的记
3、录组成(定长和不定长)。 流式文件:由一个个字符(字节)数据顺序组成。C把文件一律都看成是“字节流”。,2019/2/14,7,文件系统:缓冲文件系统、非缓冲文件系统 缓冲文件系统(高级文件系统):系统自动为正在使用的文件开辟内存缓冲区。 非缓冲文件系统(低级文件系统):由用户在程序中为每个文件设定缓冲区。,返回,2019/2/14,8,缓冲文件输入输出系统(高级磁盘输入输出系统,高级I/O):用缓冲文件系统进行的输入输出。 8.2.1 文件类型结构及文件指针 8.2.2 文件的打开与关闭 8.2.3 文件的读写 8.2.4 文件的定位 8.2.5 出错的检测,8.2 缓冲文件输入输出系统,返
4、回,2019/2/14,9,8.2.1 文件类型结构及文件指针,C为每个文件在内存中开辟一个区域,存放文件的有关信息,包括文件名、文件状态、文件当前位置等。 这个区域被作成一个FILE类型的结构体。FILE类型由系统定义,保存在头文件stdio.h中。 C通过指向这个结构体的指针(文件指针)访问文件。,C程序,操作系统,文件名+文件使用方式,文件类型指针,磁盘文件,2019/2/14,10,2019/2/14,10,复习,第七章 指针 7.4.3 指向函数的指针 7.4.4 命令行参数 第八章 文件 8.1 C语言文件概述 8.2 缓冲文件输入输出系统 8.2.1 文件类型结构及文件指针,20
5、19/2/14,11,文件指针定义: FILE *文件结构指针名; 标记 即文件读写位置指针,总是指向文件中将要操作的字节。 文件相关常量 EOF:值为“-1”。一般表示文件结束,或文件操作出错。 NULL:值为“0”。一般表示打开文件失败等。 文件操作 文件操作函数库的头文件是“stdio.h“。 任何高级语言,对文件操作都应该遵循: 打开文件操作文件关闭文件,返回,2019/2/14,12,8.2.2 文件的打开与关闭,文件打开时,系统自动建立文件结构体。 文件关闭后,文件的结构体被释放。 系统自动打开和关闭的五个标准设备文件:,2019/2/14,13,(1)文件打开fopen 函数首部
6、:FILE *fopen(char *filename,char *mode) 功能:按指定方式打开文件。 返回值:正常打开时为指向文件结构体的指针;打开失败时为NULL。,2019/2/14,14,例:文件打开与测试。 FILE *fp; if(fp=fopen(“filename“,“rb+“)=NULL) printf(“Cant open this file.n“); exit(0); ,例:FILE *fp; fp=fopen(“file.txt“,“r“);,2019/2/14,15,(2)文件关闭fclose 函数首部:int fclose(FILE *fp) 功能:关闭fp指向
7、的文件,释放文件结构体。 返回值:正常为0,出错为非0。,返回,不关闭文件可能会丢失数据,2019/2/14,16,(1)字符输入/输出 字符输入:fgetc 函数原型:int fgetc(FILE *fp) 功能:从fp指向的文件中读取一个字符。 返回值:正常,为读取的字符;读到文件尾或出错时,为EOF。 字符输出:fputc 函数原型:int fputc(int ch,FILE *fp) 功能:把一字符ch写入fp指向的文件中。 返回值:正常,返回ch;出错,为EOF。,8.2.3 文件的读写,2019/2/14,17,系统进行了如下宏定义: 文件I/O: #define putc(ch,
8、fp) fputc(ch,fp) #define getc(fp) fgetc(fp) 终端I/O: #define putchar(ch) fputc(ch,stdout) #define getchar() fgetc(stdin),2019/2/14,18,例8.1从键盘输入一些字符,逐个把它们保存到磁盘文件中,直到输入“#”结束。 #include main() char ch,filename20; FILE *fp; clrscr(); printf(“Please input the filename: “); gets(filename); if(fp=fopen(filena
9、me,“w“)=NULL) printf(“Cannot open this file.n“); exit(0); printf(“Please input the string:n“); while(ch=getchar()!=#) fputc(ch,fp); putchar(ch); fclose(fp); ,2019/2/14,19,文件结束:feof 函数原型:int feof(FILE *fp) 功能:判断文件是否结束。 返回值:文件结束,返回“真”;文件未结束,返回“假”。,2019/2/14,20,例8.2将一个磁盘文件中的信息复制到另一个磁盘文件中,两个文件名由命令行参数给出。
10、 #include main(argc,argv) int argc; char *argv; int ch; FILE *fpr,*fpw; clrscr(); if(argc!=3) printf(“You forgot to enter a filename.n“); exit(0); if(fpr=fopen(argv2,“r“)=NULL) printf(“File %s cannot open.n“,argv2); exit(0); if(fpw=fopen(argv1,“w“)=NULL) printf(“FILE %s cannot open.n“,argv1); exit(0
11、); while(ch=fgetc(fpr)!=EOF) fputc(ch,fpw); fclose(fpr); fclose(fpw); ,“rb“,“wb“,while(!feof(fpr) fputc(fgetc(fpr),fpw);,2019/2/14,21,(2)字符串输入/输出 字符串输入:fgets 函数首部:char *fgets(char *str,int length,FILE *fp); 功能:从fp所指向的文件中,至多读length-1个字符,送入字符数组str中,如果在读入length-1个字符结束前遇换行符或EOF,读入即结束,字符串读入后在最后加一个0字符。 返回
12、值:正常,返回str指针;出错,返回NULL。 字符串输出:fputs 函数首部:int fputs(char *str,FILE *fp); 功能:把str指向的字符串写入fp指向的文件。 返回值:正常,返回0;出错,返回EOF。,2019/2/14,22,例8.3读取文本文件的内容,并加上行号显示。 #include #define SIZE 256 main(int argc,char *argv) char sSIZE; int c,line; FILE *fp; clrscr(); if(argc2) printf(“You forgot to enter a filemane.n“
13、); exit(0); if(fp=fopen(argv1,“r“)=NULL) printf(“File %s cannot open.n“,argv1); exit(0); line=1; while(fgets(s,SIZE,fp)!=NULL) printf(“%4dt%sn“,line+,s); fclose(fp); ,2019/2/14,23,(3)字段输入fread/输出fwrite 函数首部: int fread(void *buffer,int num_bytes,int count,FILE *fp); int fwrite(void *buffer,int num_by
14、tes,int count,FILE *fp); 功能:读/写数据块。 返回值:成功,返回读/写的数据块数;出错或文件结束,返回0。 说明: buffer:指向要输入/输出数据存储区首址的指针。 num_bytes:每个要读/写的数据块的字节数。 count:要读/写的数据块的个数。 fp:要读/写的文件指针。 fread与fwrite一般用于二进制文件的输入/输出。,2019/2/14,24,例:float f2; FILE *fp; fp=fopen(“aa.dat“,“rb“); fread(f,4,2,fp);,例:struct student int num; char name20
15、; char sex; int age; float score3; stud10; for(i=0;i10;i+) fread(,for(i=0;i2;i+) fread(,2019/2/14,25,例8.4从键盘输入3个学生数据,再转存到磁盘文件。 #include #define SIZE 3 struct student_type char name10; int num; int age; char addr15; studSIZE; void save(); void display(); main() int i; clrscr(); for(i=0;iSIZE;i+) scan
16、f(“%s%d%d%s“,studi.name, ,2019/2/14,26,void save() FILE *fp; int i; if(fp=fopen(“stu_list“,“wb“)=NULL) printf(“Cannot open file.n“); exit(0); for(i=0;iSIZE;i+) if(fwrite( ,2019/2/14,27,void display() FILE *fp; int i; if(fp=fopen(“stu_list“,“rb“)=NULL) printf(“Cannot open file.n“); exit(0); for(i=0;i
17、SIZE;i+) fread( ,2019/2/14,28,2019/2/14,28,复习,第八章 文件 8.2 缓冲文件输入输出系统 8.2.1 文件类型结构及文件指针 文件指针定义:FILE *文件结构指针名; 8.2.2 文件的打开与关闭 fopen, fclose 8.2.3 文件的读写 fgetc, fputc, feof, fgets, fputs, fread, fwrite,2019/2/14,29,(4)格式化输入fscanf/输出fprintf 函数首部: int fscanf(FILE *fp,char *format,arg_list); int fprintf(FIL
18、E *fp,char *format,arg_list); 功能:按format格式对fp指向文件进行I/O操作。 返回值:成功,返回I/O个数;出错或文件结束,返回EOF。,例:fscanf(fp,“%d%f“, /*将i和t按%d,%f格式输出到fp文件*/,2019/2/14,30,例8.5从键盘按格式输入数据存到磁盘文件中去,并回显到屏幕上。 #include main() char s80,c80; int a,b; FILE *fp; clrscr(); if(fp=fopen(“test“,“w“)=NULL) puts(“Cant open file.“); exit(); f
19、scanf(stdin,“%s%d“,s, ,返回,2019/2/14,31,文件位置指针(标记):指向文件当前读写位置。 读写方式: 顺序读写:位置指针按字节位置顺序移动。 随机读写:位置指针按需要移动到任意位置。 (1)rewind函数 函数首部:void rewind(FILE *fp); 功能:使fp所指文件的位置指针重置到文件开头。 返回值:无。,8.2.4 文件的定位,2019/2/14,32,例8.6对一个磁盘文件分别进行显示和复制操作。 #include main() FILE *fp1,*fp2; clrscr(); fp1=fopen(“file1.c“,“r“); fp2
20、=fopen(“file2.c“,“w“); while(!feof(fp1) putchar(getc(fp1); rewind(fp1); while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); ,2019/2/14,33,(2)fseek函数 函数原型:int fseek(FILE *fp,long offset,int origin); 功能:改变文件位置指针的位置,向后移超界时指向最后一个字节,向前移超界时指向第一个字节。 返回值:成功,返回0;失败,返回非0。,位移量(以起始点为基点,移动的字节数) 0 向后移
21、动 0 向前移动,起始点 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾(EOF)SEEK_END 2,例:fseek(fp,100L,0); fseek(fp,-20L,SEEK_END); fseek(fp,50L,1);,2019/2/14,34,例8.7磁盘文件中存有10个学生数据,要求将第2,4,6,8,10个学生数据显示在屏幕上。 #include struct student_type char name10; int num; int age; char addr15; stud10; main() int i; FILE *fp; clrscr(
22、); if(fp=fopen(“stu_list“,“rb“)=NULL) printf(“Cant open file.n“); exit(0); for(i=1;i10;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread( ,返回,2019/2/14,35,(1)ferror函数 函数首部:int ferror(FILE *fp); 功能:检测fp所指文件的错误。 返回值:未出错,返回“假”;出错,返回“真”。 说明: 每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试。 fopen打开文件时,ferror函
23、数初值自动置为0。,8.2.5 出错的检测,2019/2/14,36,(2)clearerr函数 函数原型:void clearerr(FILE *fp); 功能:使fp所指文件错误标志和文件结束标志置为0。 返回值:无。 说明:出错后,错误标志一直保留,直到对同一文件调用函数clearerr()或rewind(),或任何其它一个输入输出函数。,2019/2/14,37,例8.8ferror()与clearerr()举例。 #include int main(void) FILE *stream; clrscr(); stream=fopen(“stu_list“,“w“); getc(stream); if(ferror(stream) printf(“Error reading from stu_list!n“); clearerr(stream); if(!ferror(stream) printf(“Error indicator cleared!“); fclose(stream); ,返回,2019/2/14,38,The End!,
链接地址:https://www.31doc.com/p-2102491.html