收藏 分享(赏)

清华大学(9) PPT课件.ppt

上传人:微传9988 文档编号:3353889 上传时间:2018-10-17 格式:PPT 页数:65 大小:209.50KB
下载 相关 举报
清华大学(9) PPT课件.ppt_第1页
第1页 / 共65页
清华大学(9) PPT课件.ppt_第2页
第2页 / 共65页
清华大学(9) PPT课件.ppt_第3页
第3页 / 共65页
清华大学(9) PPT课件.ppt_第4页
第4页 / 共65页
清华大学(9) PPT课件.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、清华大学 黄维通 设计制作,1,第10章 文件操作,清华大学 黄维通 设计制作,2,本章主要内容,文件概述文件的基本操作文件的读写操作文件的定位错误处理,清华大学 黄维通 设计制作,3,101 文件概述,清华大学 黄维通 设计制作,4,文件,1011 文件的概念,程序文件,数据文件,存储在外部介质上的数据的集合,在C 语言中,文件可以看作字节的序列,根据文件的数据组织形式,可以分为ASCII文件和二进制文件。,清华大学 黄维通 设计制作,5,ASCII形式与二进制形式的比较,每一个字节放一个ASCII代码,代表一个字符,把数据按其在内存中的存储形式原样输出到磁盘上存放,清华大学 黄维通 设计制

2、作,6,FILE结构类型由系统定义,其格式各编译系统略有差别,大致如下:struct _iobuf int _cnt;/输入缓冲区中等待取的字符个数int _fd; /文件号,或通道号int _flag; /I/O错误标志,有错则为非0char *_base; /指向 I/O缓冲区的首地址char *_ptr; /指向当前所取的字符char *_fname; /指向文件识别名 typedef struct _iobuf FILE;,清华大学 黄维通 设计制作,7,对于每一个要操作的文件,都必须定义一个指向结构文件的指针变量,FILE *文件类型指针名;如果程序中同时要处理几个文件,则应该定义几

3、个文件类型指针,例如:FILE *fp1,*fp2,*fpn;,清华大学 黄维通 设计制作,8,缓存的概念,系统为打开的文件在内存中开辟的一块区域,当数据从内存向磁盘输出的时候,数据先送到缓存中,等缓存满了或者程序请求清空缓存时,数据才被写入磁盘,清华大学 黄维通 设计制作,9,标准I/O的三种缓存,全缓存:缓存被充满后系统才进行实际的文件操作,效率高,行缓存: 当输入或者输出中遇到行结束标志的时候,标准I/O库才执行实际的I/O操作。,无缓存:在无缓存的情况下,每一次操作都是对外部介质的操作,效率比较低。,清华大学 黄维通 设计制作,10,10.2 文件的基本操作,清华大学 黄维通 设计制作

4、,11,FILE * fopen(const char * filename, const char mode);,r:可读 w:可写;若文件不存在则创建;若存在,长度截为0 a:添加;若文件不存在则创建;若文存在,则从末尾添加 r+:可读写 w+:可读写;类似w方式 a+:可读并添加 rb,wb,ab,r+b,rb+,w+b,wb+,a+b,ab+:与没有b标志的模式功能相同,对象为二进制文件,1 文件的打开,清华大学 黄维通 设计制作,12,使用fopen()函数打开文件时,一般要检查文件打开的正确性,以便确定程序能否继续执行下去。例如: if(fp=fopen(”test”,”r”)=N

5、ULL) printf(”This file cant be opened! n”); exit(1); ,清华大学 黄维通 设计制作,13,以wb+形式创建临时二进制文件,每调用一次,就产生一个不同文件名,最多调用次数为TMP_MAX,该宏定义在stdio.h中,清华大学 黄维通 设计制作,14,【例】tmpnam和tmpfile函数的使用 #include #include int main(void) char name20,line20; /定义字符数组,用以存放文件名FILE * fp;printf(“%sn“,tmpnam(name); /输出创建的第一个临时文件名tmpnam(n

6、ame); /创建第二个临时文件,清华大学 黄维通 设计制作,15,printf(“%sn“,name);/输出第二个临时文件名 if( (fp=tmpfile()=NULL) /判断是否创建了临时文件 perror(“create temp file failed!n“); fputs(“hello temp file!n“,fp); /将fp指针指向字符串,并移到尾部 rewind(fp); /将fp指针指回到字符串的首地址,清华大学 黄维通 设计制作,16,if(fgets(line,sizeof(line),fp)=NULL)/将字符串存放在line数组中 perror(“fgets

7、failed!“); fputs(line,stdout); /将line数组中的内容输出到屏幕 exit(0); 运行结果如下: Tmp1.$ Tmp2.$ hello temp file!,清华大学 黄维通 设计制作,17,文件的读写包括非格式化读写和格式化读写,它们的用法不同,功能也不同,10.3 文件的读写操作,清华大学 黄维通 设计制作,18,(1) 每次一个字符的读写int fgetc(FILE * stream);注意: 由于是将usigned char转换为int,因此正常字符的范围只能是0255 ANSI C中还定义了getc函数,该函数可能是由宏实现的,因此效率可能比较高。

8、 ANSI C中还定义了getchar函数,该函数相当于fgetc(stdin)。,10.3.1 文件的非格式化读写,清华大学 黄维通 设计制作,19,向流中写入一个字符: int fputc(int c, FILE * stream);这个函数实现的功能是将c输到stream流的当前位置 注意: 对应getc和getchar,ANSI C中定义了putc和putchar,功能同fputc。,fputc(char c, FILE *stdout);输出一个字符,等价putchar(char c);,stdprn为向 打印机输出,清华大学 黄维通 设计制作,20,【例】编制程序,运行该程序后可以

9、显示指定文件的内容。例如,假设编译后生成typefile.exe文件,则命令行的格式为: typefile filename.txt 其程序如下: #include “stdio.h“ #include “stdlib.h“ void main(int argc,char *argv) int ch;FILE *fp;,清华大学 黄维通 设计制作,21,if(fp=fopen(argv1,“r“)=NULL) printf(“The file:%s cant be opened“,argv1);exit(1); ch=fgetc(fp); /读取字符 while (ch!=EOF) putch

10、ar(ch); /逐个输出字符ch=fgetc(fp); /读取字符 printf(“argc is %d“,argc); fclose(fp); ,清华大学 黄维通 设计制作,22,(2) 每次一行的读写 char *fgets(char * buf, int n, FILE *stream),注意: 如果一行超过了n,那么只读取其中的n-1个,最后还是以NULL结尾。通常n比欲读取的数据的长度少一,即n长度的buf总要为NULL留一个位置。,ANSI C中可以使用如下函数来向流中写入一行内容: int fputs(const char * str, FILE * stream),清华大学

11、黄维通 设计制作,23,【例】基于行的I/O的使用。 #include #include void main(void) char * buf;int n= 16;buf=(char *)malloc(n);/开辟存储空间while( fgets(buf,n,stdin) != NULL ) fputs(buf,stdout); puts(buf); ,清华大学 黄维通 设计制作,24,运行上面的程序,如果输入字符串12345,运行结果如下: 12345 12345 12345 如果输入字符串abcdefghijklmnopqrst,运行结果如下: abcdefghijklmnopqrst a

12、bcdefghijklmnoabcdefghijklmno pqrst pqrst,清华大学 黄维通 设计制作,25,【例】有两个文本文件,把第二个文本文件接在第一个文本文件后面的功能。 #include “stdio.h“ #include “stdlib.h“ #define SIZE 512 main(int argc,char *argv) int i;char bufferSIZE;FILE *fp1,*fp2;if (argc!=3)printf(“Error!“); exit(0); if (fp1=fopen(argv1,“a“)=NULL)printf(“file %s ca

13、nt be opened n“,argv1); exit(0); ,清华大学 黄维通 设计制作,26,if (fp2=fopen(argv2,“r“)=NULL)printf(“file %s cant be openedn“,argv2); exit(0); while(fgets(buffer,SIZE,fp1)!=NULL) /读取file1文件内容存入buffer数组 printf(“n%s“,buffer);/输出file1内容 while(fgets(buffer,SIZE,fp2)!=NULL) /读取file2文件内容存入buffer数组 fputs(buffer,fp1);

14、/将file2的内容接在file1文件后面 fclose(fp1); fclose(fp2);,清华大学 黄维通 设计制作,27,if(fp1=fopen(argv1,“r“)=NULL)/将fp1指针重定向到file1文件printf(“file %s failn“,argv1); exit(0); while(fgets(buffer,SIZE,fp1)!=NULL)/读取file1内容 printf(“n%s“,buffer); /输出file1内容 fclose(fp1); ,清华大学 黄维通 设计制作,28,/* 把文件A的内容复制到文件B中 */ #include main() i

15、nt c; FILE *fpr,*fpw;char file130,file230;scanf(“%s%s“,file1,file2);if (fpr=fopen(file1,“r“)=NULL) printf(“n file%s failn“,file1); exit(); if (fpw=fopen(file2,“w“)=NULL) printf(“file %s failn“,file2); exit(); while(c=fgetc(fpr)!=EOF)fputc(c,fpw);fclose(fpr); fclose(fpw); ,清华大学 黄维通 设计制作,29,(3) 直接I/O,

16、这类操作每次都需要指定操作的长度,通常用于二进制文件的读写,ANSI C为我们提供了具有这个功能的函数。 size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream) 功能: 从stream中读取nmemb次大小为size的元素到ptr中,其中ptr是数据存储的起始位置,size是每个元素的字节大小,nmemb是要读取的次数,stream是已打开的文件指针。,清华大学 黄维通 设计制作,30,类似的有按照二进制形式写入文件的函数:size_t fwrite(void *ptr, size_t size, size_t nme

17、mb, FILE * stream)该函数的功能是向stream流中写入大小为size的元素,写的次数为nmemb。,清华大学 黄维通 设计制作,31,【例】现有一个关于学生信息的磁盘文件file1,把该文件存入另一个文件file2中 #include “stdio.h“ #include “stdlib.h“ #define SIZE 4 / 宏定义struct stu / 定义结构体 int id; / 结构体成员 char name20;int age;,清华大学 黄维通 设计制作,32,main() / 主函数 struct stu stu1; / 定义结构体变量int n;FILE

18、*in,*out; /定义文件类型指针if(in=fopen(“file1.txt“,“rb“)=NULL)puts(“The file1 cant be opened“); exit(0);if(out=fopen(“file2.txt“,“wb“)=NULL)puts(“The file2 cant be opened “);exit(0);while(fread( ,清华大学 黄维通 设计制作,33,10.3.2 文件的格式化写操作,ANSI C提供了如下的格式化输出函数 int fprintf(FILE * stream, const char * format, argument,)

19、 功能:据format指定的格式向stream中输入字符串 其中:stream:已打开的文件指针format:指定的写格式串argument:输出变量列表,清华大学 黄维通 设计制作,34,【例】编写程序,实现显示文件内容、存储和为文件加行号的功能,如果实现此功能的程序的执行文件为display.exe ,则要求执行该程序的命令行格式为:display -i -s filename -i和-s两个选项意义如下: 不指定-i和-s 只显示filename文件的内容 指定选项-s 显示并存储filename文件的内容 指定选项-i 对显示文件的每一个加行号 同时指定-i和-s 把文件的每一行加行号

20、后显示并存储,清华大学 黄维通 设计制作,35,#include “stdio.h“ #include “stdlib.h“ #include “string.h“ #define SIZE 100 void main(int argc,char *argv) char bufferSIZE,*filename;FILE *in,*out;int n,count=1 /count:行计数器int sflag=0, /sflag:储存标志,int iflag=0; /iflag:加行号标志if(argc4) /参数个数正确否?puts(“Command line should be :displ

21、ay -i-s filename“);exit(1);,清华大学 黄维通 设计制作,36,for (n=1;nargc;n+) if (!strcmp(argvn,“-s”) /若要求显示的话sflag = 1; /设置显示标志为1else if (!strcmp(argvn,“-i“) /若要加行号iflag = 1; /置加行号标志为1elsefilename=argvn; /仅显示文件内容 if(in=fopen(filename,“r“)=NULL) printf(“%s cant be opened“, filename); exit(0); if(out=fopen(“save.t

22、xt“,“w“)= NULL) printf(“save.txt cant be opened“); exit(0); ,清华大学 黄维通 设计制作,37,while(fgets(buffer,SIZE,in)!=NULL) /将文件内容输入到缓冲区 if(iflag=1) /如果需要加行号的话printf(“%3d:%s“,count,buffer); /输出行号和缓冲区中的内容if(sflag=1) /如果需要存储的话fprintf(out,“%3d :%s“,count,buffer); /加行号并存储到out指针指向的文件 else /如果不需要加行号的话,清华大学 黄维通 设计制作,

23、38, printf(“%s“,buffer);/显示内容if (sflag=1) /如果需要保存的话fprintf(out,“%s”,buffer); /将缓冲区中的内容保存到out指向的文件 count+; /处理下一行 fclose(in); fclose(out); ,清华大学 黄维通 设计制作,39,10.3.3 文件的格式化读操作,ANSI C提供了如下的格式化输入函数:int fscanf(FILE * stream, const char * format, argument,),清华大学 黄维通 设计制作,40,【例】从键盘输入学生的姓名、班级、年龄、学号,读入文件stude

24、nt.txt中,再从该文件读取这些资料,在屏幕上输出 #include “stdio.h“ #include “stdlib.h“ void main() char name20,class_no20;int age;long number;FILE *fp;if(fp=fopen(“student.txt“,“w“)=NULL)puts(“cant be opened“); exit(0);,清华大学 黄维通 设计制作,41,fscanf(stdin,“%s%s %d%ld“, name,class_no, ,清华大学 黄维通 设计制作,42,把一个字符串和一个十进制整数写入e盘的tc目录下

25、的test文件中,然后再从文件中读出来 #include main() int a; char s80; FILE *fp;if (fp=fopen( ,“w“)=NULL) puts(“can not open file“); exit(); fscanf(stdin,“%s%d“,s, ,“e:tctest“,“e:tctest“,清华大学 黄维通 设计制作,43,fread,fwrite,include: 语法: fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); 参数: buffer: 读/写数据的存放首地址 size:

26、每次要写/读的字节数 count: 读/写次数 fp: 文件指针 返回:实际读/写的次数. 功能:从文件中连续读入 count 次,字节数为 size 的数据块,存放在起始地址为 buffer 的内存区域。,清华大学 黄维通 设计制作,44,/* 把一组数据写到文件中,然后再输出到屏幕上 */ #include #define SIZE 4 void save() FILE *fp; int i;if(fp=fopen(“stu_list“,“wb+“)=NULL) printf(“cannot open filen“); return; for (i=0;iSIZE;i+)if(fwrite

27、(,struct stu_type char name5;int num;int age;char addr5;studSIZE;,清华大学 黄维通 设计制作,45,void load() FILE *fp1; int i; if(fp1=fopen(“stu_list“,“rb“)=NULL) printf(“cannot open filen“); return; for (i=0;iSIZE;i+) fread( ,清华大学 黄维通 设计制作,46,putw,include: 语法:int putw(int w,FILE *fp); 参数:w: 要写入文件中的整数 功能:以二进制形式,向

28、文件中写一个 int 型的整数。,其他读写函数,include: 语法:int getw(FILE *fp); 功能:从文件中读一个二进制整型数。,getw,清华大学 黄维通 设计制作,47,fgets,include: 语法:char *fgets(字符数组地址,n, fp); 功能: 从文件中读入 n-1 字符,存入字符数组,include: 语法:int fputs(字符串首地址 ,fp); 功能:将字符串写入文件中,自动舍弃末尾,fputs,清华大学 黄维通 设计制作,48,/* 显示文本文件的内容并加行号 */ #include #define n 256 main() char b

29、uffn, file20; int c,lcnt; FILE *fp; puts(“Input a file name:“);scanf(“%s“,file);if(fp=fopen(file,“r“)=NULL) printf(“nfile %s failn“,file); exit(); lcnt=0;while(fgets(buff,n,fp)!=NULL)printf(“%3d:%s“,+lcnt,buff);fclose(fp); ,清华大学 黄维通 设计制作,49,/* 连接两个文本文件 */ #include #define BUFSIZE 256 main() int i; F

30、ILE *fp1,*fp2; char buffBUFSIZE,file115,file215; puts(“Input the file names:“); scanf(“%s%s“,file1,file2);if(fp1=fopen(file1,“a“)=NULL) printf(“file %s failn“,file1); exit(); if (fp2=fopen(file2,“r“)=NULL) printf(“file %s fialn“,file2); exit(); while(fgets(buff,BUFSIZE,fp2)!=NULL) fputs(buff,fp1); f

31、close(fp2); fclose(fp1); ,清华大学 黄维通 设计制作,50,在对文件进行操作时,不一定始终都是从文件的开始位置进行操作的,因此,对文件的定位非常重要,TC提供了一系列的文件定位的函数,10.4 文件的定位,清华大学 黄维通 设计制作,51,ANSI C对该函数定义如下: int fgetpos(FILE * stream, fops_t * pos),功能:获得stream中文件指针当前的位置,存储在pos变量中,pos是保存文件指针的位置信息。该函数和fsetpos是ANSI C新增加的,该它可获得文件当前的位置,当以后调用fsetpos的时候可以重新将流定位到该位

32、置,10.4.1 fgetpos函数,清华大学 黄维通 设计制作,52,ANSI C对该函数定义如下:int fsetpos(FILE * stream, const fops_t * pos)该函数的功能是设置文件指针的偏移位置,函数运行如果成功,返回0;如果失败,返回非0,并设置errno,该函数使用的pos,通常都是以前从fgetpos函数得到的,10.4.2 fsetpos函数,清华大学 黄维通 设计制作,53,ANSI C对该函数定义如下: long int ftell(FILE * stream)该函数的功能是获得stream中文件指针当前的位置,该函数如果运行成功,返回文件指针位

33、置;如果失败,返回-1L,并设置errno。,10.4.3 ftell函数,清华大学 黄维通 设计制作,54,ANSI C对该函数定义如下 int fseek(FILE * stream, long int offset, int whence) 功能:是控制文件指针在流当中的位置,offset表示位移的偏移量,whence是计算相对位移量的基点,它可取0、1和2三个值之一。base取值 命名 含义0 SEEK_SET 文件开头1 SEEK_CUR 文件当前位置2 SEEK_END 文件末尾,10.4.4 fseek函数,清华大学 黄维通 设计制作,55,fseek(fp,200L,SEEK_

34、SET); /将文件读/写位置指针移到距文件开头200个字节的位置fseek(fp,150L,1); / 将文件读/写位置指针移到距当前位置150个字节的位置fseek(fp,-100L,2); / 将文件读/写位置指针移到距末尾100个字节的位置,清华大学 黄维通 设计制作,56,【例】在文件stufile中,存有100个学生的信息,按学号1、2、100顺序排列,现要求把单号学生的信息显示在屏幕上。 #include “stdio.h“ #include “stdlib.h“ struct stu_type int num; char name20;int age; char class_n

35、o; stud;,清华大学 黄维通 设计制作,57,void main() / 主函数 int n;FILE *fp; / 定义文件类型指针if(fp=fopen(“stufile“,“rb“)=NULL)puts(“The file cant be opened n“); exit(1); for (n=1;n100;n+=2) fseek(fp,n*sizeof(struct stu_type),0); /指针移动fread( / 关闭文件 ,清华大学 黄维通 设计制作,58,将feof放在这里也许不太合适,该函数是用来判断一个流是否到达尾端的。ANSI C对该函数定义如下: int fe

36、of(FILE * stream) 该函数的功能是判断stream指向的流是否到达尾端。,10.4.5 feof函数,清华大学 黄维通 设计制作,59,文件的定位函数 rewind,对于文件的读写,一般来说,读文件时,指针是顺序下移的,若要指针强制性的移动到某个地方,就要涉及到文件的定位问题。,void rewind(文件指针);功能:将位置指针置于文件开头。 返回值:无,清华大学 黄维通 设计制作,60,10.5 错误处理,清华大学 黄维通 设计制作,61,ANSI C对该函数定义如下: int ferror(FILE * stream) 功能:判断stream指向的流是否存在错误,出错时返

37、回非0值。该函数通常用来判断流本身的错误。比如流意外被中断等错误。而类似scanf的函数指定的format与扫描的流的格式不符合,这不属于流本身的错误,请读者注意区分。,10.5.1 ferror函数,清华大学 黄维通 设计制作,62,void perror(const char * s) 该函数输出具体的错误信息s ,有助于判断程序的错误所在,建议在程序中尽量使用,10.5.2 perror函数,清华大学 黄维通 设计制作,63,在调用某一输入输出函数时出错,ferror为非零值;调用clearerr(fp)后,ferror(fp)变成0。,void clearerr(文件指针) 功能:将错

38、误标志、结束标志置 0。,Clearerr:将错误标志或结束标志置0,清华大学 黄维通 设计制作,64,/* 将学生数据后存盘,然后在屏幕上显示*/ # include # include struct stu char name5; int num; stud500; main() int i,j,n; FILE *fr,*fw;if(fw=fopen(“e:tcbinfile“,“w+“)=NULL) printf(“failn“); exit(0); scanf(“ %d”,清华大学 黄维通 设计制作,65,if(fr=fopen(“file“,“r“)=NULL) printf(“failn“); exit(0); for(i=0;in;i+)fseek(fr,i*sizeof(struct stu_type),0);fread( ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医学治疗 > 医学现状与发展

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报