1、第10章 文件,本章学习目标理解文本文件和二进制文件的区别; 理解 FILE *fp 文件指针; 能够用函数fopen和fclose打开和关闭文件; 掌握常用的文件读/写函数;,目 录,C文件基础知识,文件的打开与关闭,文件的读写,文件的定位,出错的检测,10.1 C文件基础知识 1、文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。,静夜思 床前明月光, . . . 12345 6784,2、文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成,按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字
2、符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,3、文件缓冲区 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区。可减少主机和外部设备频繁交换数据的次数,4、文件类型指针 文件结构体类型FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 Turbo C在stdio.h文件中有以下的文件类型声明:,typedef struct short level; /*缓冲区“满”或“空”的程度*/unsigned
3、flags; /*文件状态标志*/char fd; /*文件描述符*/unsigned char hold; /*如无缓冲区不读取字符*/short bsize; /*缓冲区的大小*/unsigned char *buffer; /*数据缓冲区的位置*/unsigned ar *curp; /*指针,当前的指向*/unsigned istemp /*临时文件,指示器*/short token; /*用于有效性检查*/ FILE;,定义文件类型变量 定义文件型指针变量,指向FILE类型结构体变量,通过该结构体变量中的文件信息访问文件。 如:FILE *fp;,静夜思 床前明月光, . . . 1
4、2345 6784,fp,10.2 文件的打开与关闭C文件操作用库函数实现,包含在stdio.h文件使用方式: 打开文件文件读/写关闭文件,系统自动打开和关闭三个标准文件:标准输入-键盘 stdin标准输出-显示器 stdout标准出错输出-显示器 stderr,1、文件的打开(fopen函数)函数原型: FILE *fopen(char *name,char *mode)调用方式:fopen(“文件名“,“使用文件方式“)例:FILE *fp;fp=fopen(“d:usermyfile.txt“,“r“);,为什么 ,Read,返回值:正常打开,返回指向文件结 构体的指针;打开失败,返回
5、NULL,FILE *fp; if (fp=fopen(“file1”,“r”)=NULL) printf(“cannot open this file!n”);exit(0); /*关闭所有文件终止调用*/ ,2、文件的关闭(fclose函数) 作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,FILE *fp; fp=fopen(“a.txt”,“r”); fclose(fp);,返回值:用于表示文件是否被正确地关闭,如果文件顺利关闭,该值为0,否则为-1(EOF)。 返回值可以用ferror函数测试,10.3 文件的读写 1、读写文件中的一个字符 fputc函数(putc函数
6、) 函数原型:int fputc(int c, FILE *fp) 功能:把一字节代码c写入fp指向的文件中 返值:正常,返回c;出错,为EOF(-1),fgetc函数(getc函数) 函数原型:int fgetc(FILE *fp) 功能:从fp指向的文件中读取一字节代码 返值:返回读到的代码值;读到文件尾或出错为EOF(-1),feof函数 调用方式:feof(fp) 功能:对于二进制文件读取时判断文件是否结束。 返值:结束-1;反之0。,文件指针变量,文件指针变量,例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。,#include #include voi
7、d main() FILE *fp;char ch , filename10;scanf(“%s“, filename);if(fp=fopen(filename,“w“)=NULL) printf(“cannot open filen“);exit(0); /*终止程序*/ch=getchar(); /*接收执行scanf时最后输入的回车符*/ch=getchar(); /*第一个输入的字符被赋给变量ch*/while(ch!=#) fputc(ch,fp); /*字符被写入filename表示的文件中*/putchar(ch); /*字符被输出到显示器*/ch=getchar();putc
8、har(10); /*向屏幕输出一个换行符*/fclose(fp); /*关闭文件*/,例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。,#include #include void main() FILE *in, *out;char ch,infile10,outfile10;printf(“Enter the infile name:n“);scanf(“%s“,infile); /*输入文件的文件名*/printf(“Enter the outfile name:n“);scanf(“%s“,outfile); /*输出文件的文件名*/if (in = fopen(infil
9、e, “r“)= 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、数据块输入输出函数:fread与fwrite 一般调用形式: fread(buffer,size,count,fp ); fwrite(buffer,size,count,fp ); 参数说明: buf
10、fer: 要读入的数据块的存放首地址或要输出的数据块的起始地址。 size: 每个要读/写的数据块的大小(字节数) count: 要读/写的数据块的个数 fp: 要读/写的文件指针 返值:成功,返count的值;出错或文件尾,0值。fread与fwrite 一般用于二进制文件的输入/输出,#include #define SIZE 4 struct 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.na
11、me, ,例10.4 从键盘输入4个学生的数据,然后转存到磁盘上,并在屏幕上显示磁盘文件的内容。,void save() FILE *fp;int i;if(fp=fopen(“d:stu_list“,“wb“)=NULL) printf(“cannot open filen“);return;for(i=0;iSIZE;i+)if(fwrite( ,文件必须是以“二进制”打开的,void display() FILE *fp;int i;if(fp=fopen(“d:stu_list“,“rb“)=NULL) printf(“cannot open filen“); return;for(i
12、=0;iSIZE;i+) fread( ,例10.4b 将4个学生的数据,从磁盘文件stu_dat调入,然后输出到stu_list文件中,并在屏幕上显示磁盘文件的内容。,#include #define SIZE 4 struct student_type char name10;int num;int age;char addr15; studSIZE; main() load();save();display(); ,void load() FILE *fp;int i;if(fp=fopen(“d:stu_dat“,“rb“)=NULL) printf(“cannot open file
13、n“); return;for(i=0;iSIZE;i+)if( fread( ,3、按指定格式读写文件的函数:fprintf和fscanf 一般调用格式:fscanf(fp,格式字符串,输入列表);fprintf(fp,格式字符串,输出列表); 返值:成功,返回I/O的个数;出错或文件尾,返回EOF 由于输入输出时要进行ASCII码和二进制形式的转换,费时较多。,fscanf( fp,“%d,%f”, /*将i和t按 %d, %6.2f 格式写入到 fp文件*/,void save() FILE *fp;int i;if(fp=fopen(“d:stu_list“,“w“)=NULL) pr
14、intf(“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;for(i=0;iSIZE;i+) fscanf(fp,“%s %d %d %s“,studi.name,studi.num,stud
15、i.age,studi.addr); printf(“%-10s %4d %4d %-15sn“,studi.name,studi.num,studi.age,studi.addr);fclose(fp); ,4、其它读写函数 1. putw和getw函数 作用:以二进制形式,对磁盘文件读写一个 int 型的整数,2个字节。 返值:成功:所写的整数值;失败:EOF。如:putw(10,fp);i=getw(fp);,2. fgets 和fputs函数 形式:fgets(str,n,fp); (str字符数组,n-1个字符)fputs(字符串,fp); (“0“不输出) 作用:从fp指向的文件读
16、/写一个字符串 返值: fgets正常时返回字符串的首地址;出错或文件尾,NULL fputs正常时返回写入的最后一个字符;出错为EOF,例 从键盘读入字符串存入文件,再从文件读回显示,#include void main() FILE *fp;char string81;if(fp=fopen(“file.txt“,“w“)=NULL) printf(“cannt open file“);exit(0); while(strlen(gets(string)0) fputs(string,fp);fputs(“n“,fp); fclose(fp);if(fp=fopen(“file.txt“,
17、“r“)=NULL) printf(“cannt open file“);exit(0); while(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp); ,10.4 文件的定位 几个概念 文件位置指针-指向当前读写位置的指针,具体位置由文件打开方式确定。 “r”“w”:指向文件头 “a”:指向文件尾 读写方式 顺序读写:位置指针按字节位置顺序移动。 随机读写:位置指针按需要移动到任意位置。,rewind函数 函数原型: void rewind(FILE *fp) 功能:重置文件位置指针到文件开头 返值:无,例10.5 对一个磁
18、盘文件进行显示和复制两次操作,#include void main() FILE *fp1,*fp2;fp1=fopen(“c:tcuserch12_4.c“,“r“);fp2=fopen(“d:tcuserch12_41.c“,“w“);while(!feof(fp1) putchar(getc(fp1);rewind(fp1);while(!feof(fp1) putc(getc(fp1),fp2);fclose(fp1); fclose(fp2); ,fseek函数和随机读写 调用形式:fseek(文件类型指针,位移量,起始点) 功能:改变文件位置指针的位置 返值:成功,返回0;失败,返
19、回非0值,位移量(以起始点为基点,移动的字节数)0 向后移动,0 向前移动,起始点 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2,例 fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);,例10.6 文件内存有10个学生数据,将单数学生数据输入计算机并在屏幕上显示,void main() FILE *fp;int i;if(fp=fopen(“stud_dat“,“rb“)=NULL) printf(“cannot open filen“); exit(0);for(i=0;i10;i+=2)
20、 fseek(fp,i*sizeof(struct student_type),0);fread( ,#include #include struct student_type char name10;int num;int age;char sex; stud10;,ftell函数 函数原型: long ftell(FILE *fp) 功能:得到流式文件中位置指针当前位置(用相对于文件开头的位移量表示) 返值:返回当前位置指针位置;失败,返回-1L,例 求文件长度 #include“stdio.h“main() FILE *fp;char filename80;long length;get
21、s(filename);fp=fopen(filename,“rb“);if(fp=NULL)printf(“file not found!n“);else fseek(fp,0L,SEEK_END);length=ftell(fp);printf(“Length of File is %1d bytesn“,length);fclose(fp); ,10.5 出错的检测 ferror函数:测试文件是否出现错误 调用形式: ferror(fp); 返值:未出错,0;出错,非0 说明 每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试 fopen打开文件时,ferror函
22、数初值自动置为0,clearerr函数 调用形式: clearerr(fp); 功能:使文件错误标志置为0,无返值。 说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数,例 ferror()与clearerr()举例 #include int main(void) FILE *stream;stream = fopen(“DUMMY.FIL“, “w“);getc(stream);if (ferror(stream) printf(“Error reading from DUMMY.FILn“);clearerr(stream);i
23、f(!ferror(stream)printf(“Error indicator cleared!“);fclose(stream);return 0; ,文件输入输出小结 在使用文件时,首先要定义一个文件指针:FILE *fp;然后通过该指针来操作相应的文件; 通过fopen这个函数,使文件指针fp和相应的文件建立了联系,通过fclose函数将fp和文件的联系切断; 文件可以以文本的方式打开(默认或“t”),也可以以二进制方式打开(“b”); 如果以一次一个字符的方式处理文件,需要用fgetc或者fputc函数; 如果以一次一行的方式处理文件,可以用函数fgets或者fputs; 如果以一次一个结构体的方式处理文件,可以用函数fread和fwrite(多为二进制文件); fscanf和fprintf函数使用很广泛,应重点掌握。,
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1