1、第十三章 文 件,什么是数据文件,为什么使用数据文件,如何使用数据文件,本章学习目标,理解文本文件和二进制文件的区别; 理解 FILE *fp 文件指针; 能够用函数fopen和fclose打开和关闭文件; 掌握常用的文件读/写函数;,13.1 C文件概述,文件:文件是存储在外部介质上数据的集合。,使用数据文件的目的1、数据文件的改动不引起程序的改动程序与数据分离。2、不同程序可以访问同一数据文件中的数据数据共享。3、能长期保存程序运行的中间数据或结果数据。,13.1 C文件概述, C 语言文件分为ASCII文件和二进制文件ASCII文件:也称文本文件,每个字节存放一个字符的ASCII码。二进
2、制文件:数据按其在内存中的存储形式原样存放。,13.1 C文件概述,文本文件特点:存储量大、速度慢、便于对字符操作,二进制文件特点:存储量小、速度快、便于存放中间结果,13.2 文件类型指针, 文件结构体类型 FILE每个正在使用的文件在内存中都拥有一个文件信息区。文件信息用系统定义的名为FILE的结构体描述。FILE定义在 stdio.h 中,typedef struct int _fd; /文件号 int _cleft; /缓冲区中剩下的字符数 int _mode; /文件操作方式 char *_next; /文件当前读写位置 char *_buff; /文件缓冲区位置FILE;,13.2
3、 文件类型指针, 文件类型指针定义:FILE *fp ;文件使用方式:打开文件-文件读/写-关闭文件,FILE *文件指针名,在stdio.h中定义的一种结构,可看作类型说明符,文件指针名,经过定义的文件指针,就可以用来指向一个文件!,13.3 文件的打开与关闭, 打开文件 fopen( ),FILE *fp; fp=fopen(“文件名”,“打开方式”);,例:FILE *fp; fp=fopen(“d:usermyfile.txt”,”r”);,为什么 ,Read,13.3 文件的打开与关闭,fopen( )的返回值:正常打开,返回指向文件结 构体的指针;打开失败,返回 NULL。,FIL
4、E *fp;fp=fopen(“aa.c”,“w”);if(fp=NULL) printf(“File open error!n”); exit(0);,13.3 文件的打开与关闭,r:读方式;w:写方式;b:二进制方式;a:追加方式;+:既可读又可写,r 只读 出错 正常,w 只写 建立新文件 覆盖原内容,a 追加 建立新文件 在原内容后追加,r+/w+ 读写 出错 正常,13.3 文件的打开与关闭, 文件的关闭 fclose( ),FILE *fp; fp=fopen(“a.txt”,“r”);fclose(fp);,fclose( )的返回值:用于表示文件是否被正确地关闭,如果文件顺利关
5、闭,该值为0,否则为-1(EOF)。,13.4 文件的读写,文件打开之后,就可以对它进行读与写的操作了。13.4.1 读写文件中的一个字符 fgetc() fputc()13.4.2 读写一个数据块 fread() fwrite()13.4.3 对文件进行格式化读写 fscanf() fprintf()13.4.4 读写一个字符串 fgets() fputs(),13.4 文件的读写,读入单字符的函数fgetc( )格式: ch=fgetc(fp);功能:从指定的文件读入一个字符说明: fp是文件型指针变量 ch是字符变量,FILE *fp; fp=fopen(“a.txt”,“r”); ch
6、=fgetc(fp); while(ch!=EOF) putchar(ch); ch=fgetc(fp); fclose(fp);,EOF文件结束标志,例13.1 从键盘输入一些字符,逐个把它们送到文件中,直到输入一个“ # ”为止。,#include void main() FILE *fp; char ch ; if(fp=fopen(“out.txt”,w)=NULL) printf(cannot open filen); exit(0); printf(Please input string:); ch=getchar(); /*输入的字符被赋给变量ch*/ while(ch!=#)
7、fputc(ch,fp); /*字符被写入out.txt文件*/ putchar(ch); /*字符被输出到显示器*/ ch=getchar(); fclose(fp); /*关闭文件*/,13.4 文件的读写,写入数据块的函数 fwrite( )格式:fwrite(buffer,size,count,fp );功能:向指定文件写入一组数据(实数或结构体变量)说明: buffer: 写数据的存放的首地址 size: 每次要写的字节数 count: 写次数 fp: 文件指针,struct student int num; float score3; stud10; for(i=0;i10;i+)
8、 fwrite(,文件必须是以“二进制”打开的,例13.3 从键盘输入4个学生有关数据,把他们转存到磁盘文件中去,#include #define SIZE 4struct student_type char name10; int num; int age; char addr15;studSIZE;void main() int i; for(i=0;iSIZE;i+) scanf(%s%d%d%s,studi.name,void save() FILE *fp; int i; if(fp=fopen(d:stu_list,wb)=NULL) printf(cannot open file
9、n); return; for(i=0;iSIZE;i+) fwrite(,void display() FILE *fp; int i; if(fp=fopen(d:stu_list,rb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) fread(,13.4 文件的读写,按格式对文件进行读/写的函数 fscanf( ) fprintf()格式: fscanf(fp,格式,输入列表 ); fprintf(fp,格式,输出列表 );,fscanf( fp,“%d,%f”, /*将i和t按 %d, %6.2f 格式写入到 f
10、p文件*/,void save() FILE *fp; int i; if(fp=fopen(d:stu_list,w)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) fprintf(fp,%s %d %d %s,studi.name, studi.num,studi.age,studi.addr); fclose(fp);,void display() FILE *fp; int i; if(fp=fopen(d:stu_list,r)=NULL) printf(cannot open filen); return; f
11、or(i=0;iSIZE;i+) fscanf(fp,%s %d %d %s,studi.name, ,小 结,在使用文件时,首先要定义一个文件指针: FILE *fp;然后通过该指针来操作相应的文件;通过fopen这个函数,使文件指针fp和相应的文件建立了联系,通过fclose函数将fp和文件的联系切断;文件可以以文本的方式打开(默认或“t”),也可以以二进制方式打开(“b”);,小 结,如果以一次一个字符的方式处理文件,需要用fgetc或者fputc函数;如果以一次一个结构体的方式处理文件,可以用函数fread和fwrite(多为二进制文件);fscanf和fprintf函数使用很广泛,应重点掌握。,THE END,