精通C程序设计第十一章文件操作.ppt
- 文档编号:18772296
- 上传时间:2023-11-06
- 格式:PPT
- 页数:47
- 大小:196.50KB
精通C程序设计第十一章文件操作.ppt
《精通C程序设计第十一章文件操作.ppt》由会员分享,可在线阅读,更多相关《精通C程序设计第十一章文件操作.ppt(47页珍藏版)》请在冰点文库上搜索。
第十一章文件操作,本章内容提要:
11.1C语言文件操作的基本概念11.2C语言文件操作数据结构11.3C语言文件操作函数11.4字符文件应用11.5二进制文件应用重点小结作业,11.1C语言文件操作的基本概念,11.1.1C语言流文件的概念所谓流(stream)是指C语言文件操作函数与物理文件之间的一种数据结构与操作规程。
一般说来,流是指文件按存储顺序形成的字节序列。
1.缓冲文件内存中开辟一个适当大小的内存块称为文件缓冲区,用来保存文件一部分数据,读写文件不直接针对物理文件本身,而是对缓冲区进行,由内部程序实现缓冲区与文件的数据更新。
11.1C语言文件操作的基本概念(续1),2.非缓冲文件任何读写操作直接针对物理文件进行。
缓冲文件可有效减低磁盘的访问频度。
C语言两种文件操作方式都提供,但我们主要应用的是缓冲文件(即流文件)。
ANSIC标准决定不采用非缓冲文件系统而只采用缓冲文件系统,因此本章将只介绍C语言的缓冲文件操作函数。
通常所说的流文件就是指ANSI标准的字节流缓冲文件。
11.1C语言文件操作的基本概念(续2),11.1C语言文件操作的基本概念(续3完),11.1.2顺序文件与随机文件操作1.顺序文件读文件或者写文件操作只能按照顺序进行。
对于字节流文件,即读/写文件的第i个字节前必须顺序读出/写入前面的i-1个字节。
2.随机文件对于字节流文件允许直接读/写文件的第i个字节。
C语言的文件操作函数两种方式都可以实现。
11.2C语言文件操作数据结构,1.FILE结构类型定义于stdio.h中,是文件操作的句柄结构,我们无需关心该结构的详细内容,C函数通过一个FILE*型指针,对文件进行操作。
例如:
FILE*fp,*fr,*fw;2.空文件指针常量:
NULL等价于03.文件读操作结束(失败)标志常量:
EOF等价于-1以上两个常量均已定义于stdio.h中。
11.2C语言文件操作数据结构(续1完),4.系统标准输入/输出文件已定义于stdio.h中,用户可在程序中直接使用。
(1)stdin:
标准输入文件,即键盘输入(r型)
(2)stdout:
标准输出文件,即显示屏(w型)(3)stderr:
标准错误输出文件,一般指显示屏(w型),11.3C语言文件操作函数,1.打开文件函数原形FILE*fopen(char*fname,char*mode);
(1)fname:
指文件名,可包含盘符与路径信息如:
ABC.TXTC:
userabc.txt
(2)返回值为NULL表明文件打开失败;否则打开成功,为一个有效的FILE*型指针值。
(3)mode:
文件打开方式字符串,11.3C语言文件操作函数(续1),w+或wt+,11.3C语言文件操作函数(续2),说明:
(a)打开文件失败的可能情况主要有:
I对于含字母r的打开方式,失败情况主要是:
文件不存在;文件名或路径名有错误对含r方式打开的文件,一定要测试文件是否打开成功,否则会带着错误正常运行下去II对于含有w或a字母的打开方式,失败的情况主要是:
磁盘空间不足或磁盘故障(b)打开方式串中的字母必须小写,不能够大写。
11.3C语言文件操作函数(续3),例如:
FILE*fr,*fw;fr=fopen(abc.txt,r);if(fr=NULL)printf(Fileopenerror.n);exit(0);fw=fopen(abc.bak,w);2.关闭文件:
(1)intfclose(FILE*fp);/*一般不用返回值*/,11.3C语言文件操作函数(续4),如:
fclose(fr);fclose(fw);对于写入方式打开的文件,一定要用fclose关闭文件,否则可能有数据未从缓冲区写入磁盘。
原则上,fclose与fopen配对使用。
(2)intfcloseall();该函数关闭本应用程序所有打开的文件。
3.文件读写函数
(1)单字节读写函数(字符与二进制文件都适用),11.3C语言文件操作函数(续5),intfputc(intch,FILE*fp);ch的低8位(1字节)写入文件。
成功:
返回写入的该字节(0255);失败:
返回EOF(-1)intfgetc(FILE*fp);从文件中读出一个字节并返回。
成功:
函数返回值为0255,即读出的字节;失败:
返回值为EOF(-1)。
11.3C语言文件操作函数(续6),
(2)字符串读写函数(字符与二进制文件均适用)charfgets(chars,intn,FILEfp);从文件中连续读出n1个字符存入字符指针s开始的内存,最后自动加上一个字符0。
成功:
函数返回值为s;失败:
返回值为NULL。
intfputs(chars,FILEfp);将字符串s写入文件(不写入0)。
成功:
函数返回非负整数;失败:
返回EOF。
11.3C语言文件操作函数(续7),(3)格式化读写函数(仅字符文件适用)intfscanf(FILEfp,charformat,11.3C语言文件操作函数(续8),(4)字节块读写函数(仅二进制文件适用)unsignedfread(voidbuffer,unsignedsize,unsignedcount,FILEfp);从文件中连续读出sizecount个字节存入指针buffer开始的内存。
返回实际读出的字节数。
unsignedfwrite(voidbuffer,unsignedsize,unsignedcount,FILEfp);从内存地址buffer开始,写sizecount字节到文件中。
返回实际写入文件的字节数。
11.3C语言文件操作函数(续9),4.数据读写位置指针操作函数
(1)文件数据读写位置指针的概念字节流文件的读写位置以字节为单位编号。
长度为n字节的文件,第一字节的编号为0,最后一个字节的编号为n-1,因此文件数据读写位置指针的有效范围为0n-1。
(2)数据读写位置指针的自动移动规则(a)任何方式打开文件时,指针初态都是0;,11.3C语言文件操作函数(续10),(b)含a的打开方式,只要进行写操作,则指针自动移到文件当前结束位置即位置n(n为当前文件已有字节数)处。
(c)进行任何读写操作时,指针总是从当前位置开始读写,读写结束后,指针当前位置自动移动到读写之后的位置。
(3)数据读写位置指针的操作函数voidrewind(FILEfp);重置当前读写位置指针为0。
11.3C语言文件操作函数(续11),longftell(FILE*fp);返回当前文件读写位置指针值。
intfseek(FILE*fp,longoffset,intstartpos);读写位置指针移动到偏移startpos指定的位置offset字节处。
startpos=0SEEK_SET文件开始处(位置0)1SEEK_CUR当前指针位置处2SEEK_END文件结尾处(位置n)n为文件当前字节长度,11.3C语言文件操作函数(续12),SEEK_SET,SEEK_CUR,SEEK_END,11.3C语言文件操作函数(续13),5.读操作失败标志函数intfeof(FILEfp);当且仅当文件当前读写位置指针在有效数据区以外并进行了读操作,函数返回值不等于0,其余情况,函数的返回值是0。
注意:
执行fseek、rewind或者任何写操作后,该函数的返回值将是0。
6.可读/可写打开方式中的读写操作切换,11.3C语言文件操作函数(续14),fopen函数中的打开方式串若含有+号,允许对文件进行读操作和写操作。
C语言规定,读操作和写操作切换时,中间必须间隔fseek函数。
例如:
字节流为ABCDEFGH/*以r+方式打开文件*/,当前读写位置指针,执行语句charch=fgetc(fp);/*ch得到E*/,ABCDEFGH/*读写位置指针指向F*/,当前读写位置指针,11.3C语言文件操作函数(续15),此时若将F改写为f,则fseek(fp,0L,SEEK_CUR);/指针原地踏步/fputc(f,fp);/*若不执行前面的fseek,此句无法正常写入*/,ABCDEfGH/*读写位置指针指向G*/,当前读写位置指针,11.3C语言文件操作函数(续16),7.字符文件与二进制文件操作的区别若文件以字符文件方式打开时,当向文件写入字节n(10),写操作函数(fputc,fputs,fprintf)先自动写入字符r(13);当从文件读到字节r(13)时,读操作函数(fgetc,fgets,fscanf)不返回r而是跳过r读出紧跟在它后面的字节n(10),并返回n。
二进制文件打开方式没有上述特性,即每个字节都一视同仁。
字符文件的内容结构请参见教材P23例1.12。
11.3C语言文件操作函数(续17),8.操作系统文件操作命令函数头文件stdio.h文件更名intrename(charoldname,charnewname);成功,函数返回0,否则返回1。
文件更名必须符合操作系统关于文件更名的规定。
例如:
rename(A1.DAT,A2.DAT);,11.3C语言文件操作函数(续18完),
(2)删除文件intremove(charpath);删除磁盘上由文件名path指定的文件。
删除文件成功,返回0,否则返回1。
删除文件失败的可能情况是:
没有指定正确的文件名;文件不存在;或者文件是只读属性。
例如:
remove(D:
TCA.C);,11.4字符文件应用,例11.3打印如下图形到屏幕上与正文文件ABC.TXT中,要求打印行数n由键盘输入。
135791113151719,n行,算法设计:
屏幕上怎样输出,就在字符文件中怎样输出。
#includestdio.hvoidmain()intn,i,j,k;FILEfw;printf(Inputn=);scanf(%d,11.4字符文件应用(续1),11.4字符文件应用(续2),例11.4用正文文件A1.TXT提供数据建立一个矩阵,然后输出转置矩阵到正文文件A2.TXT。
算法设计:
设矩阵为4行3列整型矩阵,建立A1.TXT文件内容如下:
1235678910111213,文件A1.TXT可用任何字符文件编辑软件建立,如WINDOWS的记事本程序。
11.4字符文件应用(续3),#includestdio.h#defineN4#defineM3voidmain()longaNM,bMN;inti,j;FILEfw,fr;fr=fopen(a1.txt,r);fw=fopen(a2.txt,w);if(!
fr)printf(Filea1.txtnotfound.n);return;for(i=0;iN;i+)for(j=0;jM;j+)fscanf(fr,%ld,11.4字符文件应用(续4),问题与思考:
(1)建立字符文件A1.TXT时,A1.TXT应该存在什么目录(文件夹)中?
答:
A1.TXT应该存放在与源程序文件相同的目录中
(2)程序建立的A2.TXT存放在哪里?
typea1.txt显示的文件内容(该文件可用TC集成环境或WINDOWS记事本等编辑器建立)12356789101213,例11.5编程统计一个C源程序文件的字符行数。
算法设计:
C源程序文件名由键盘输入;统计文件中包含的n字符数目。
输出文件a2.txt的内容1581126912371013,11.4字符文件应用(续5),11.4字符文件应用(续6),#includestdio.hvoidmain()FILEfr;charch;charfname81;intn=0;printf(InputaCsourcefilename:
);gets(fname);fr=fopen(fname,r);if(!
fr)printf(file%snotfound.n,fname);return;while
(1)ch=fgetc(fr);if(feof(fr)break;if(ch=n)n+;printf(numberofrows=%dn,n);fclose(fr);,11.4字符文件应用(续7),例11.6判断一个C源程序中的大括号是否配对。
算法设计:
C源程序文件名由键盘输入;设置一个计数变量c,初值为0,读到左则c自加1,遇到右则自减1。
扫描文件过程中,出现c0都说明没有配对。
#includestdio.hvoidmain()FILEfr;intch;charfname81;intc;printf(InputCsourcefilename:
);gets(fname);fr=fopen(fname,r);if(!
fr)printf(file%snotfound.n,fname);return;,11.4字符文件应用(续8),c=0;while
(1)ch=fgetc(fr);if(ch=EOF)break;if(ch)c+;if(ch=)c;if(c0)break;/c0,说明大括号配对不正确/if(c!
=0)printf(braceserror.n);elseprintf(bracesright.n);fclose(fr);,11.4字符文件应用(续9),例11.7删除一个C源程序文件中的注释。
算法设计:
用空格擦写/*.*/部分。
设两个长整型变量pos1,pos2,表示注释开始和结束的位置。
注意查找注释开始与结束的方法。
ABCD/*XXXX*/,ch1ch2,ch1ch2,pos1,pos2,注意:
ch1,ch2每循环一次只推进一个字节,才能保证搜索的完整性,如上图所示。
11.4字符文件应用(续10),#includestdio.hvoidmain(intargc,charargv)/*参见教材P2409.4*/FILEfp;charfname81,ch1,ch2;longpos1,pos2;if(argc=2)/若含有一个文件名参数/fp=fopen(argv1,rb+);elseprintf(InputaCsourcefilename:
n);gets(fname);fp=fopen(fname,rb+);if(!
fp)printf(Filenotfound.n);return;ch1=fgetc(fp);if(feof(fp)fclose(fp);return;,11.4字符文件应用(续11),while
(1)ch2=fgetc(fp);if(feof(fp)break;if(ch1=/,11.4字符文件应用(续12完),例11.8输入一句英文,将其作为一行,添加进文本文件B.TXT中。
#includestdio.hvoidmain()chars81;FILEfp;charch,p;fp=fopen(B.TXT,a);/字符文件添加写方式/printf(Inputastring:
n);gets(s);fputs(s,fp);fputc(n,fp);fclose(fp);问题与思考:
文件B.TXT需要事先建立吗?
11.5二进制文件应用,例11.9编程实现文件复制程序。
要求源文件名和目的文件名可以用命令行参数提供,也可以提示从键盘输入。
#includestdio.h#includestring.hvoidmain(intargc,charargv)FILEfr,fw;intch;charsfn81,dfn81;if(argc=3)strcpy(sfn,argv1);strcpy(dfn,argv2);elseprintf(InputSourcefilename:
);gets(sfn);printf(InputDestinationfilename:
);gets(dfn);,11.5二进制文件应用(续1),fr=fopen(sfn,rb);/二进制只读方式打开源文件/if(!
fr)printf(Sourcefile%snotfound.n,sfn);return;fw=fopen(dfn,wb);/二进制只写方式打开目标文件/if(!
fw)printf(Destinationfile%scannotbecreated.n,dfn);return;ch=fgetc(fr);/*典型循环结构
(一)*/while(!
feof(fr)fputc(ch,fw);ch=fgetc(fr);fcloseall();,11.5二进制文件应用(续2),例11.10建立源程序文件f1.c,从键盘输入N个实数,将其写入一个二进制文件A1.DAT。
再建立一个源程序文件f2.c,从A1.DAT中读出这N个实数,然后进行由小到大排序,写入另一个二进制文件A2.DAT。
最后,建立一个源程序文件f3.c,从A2.DAT中读出排序后的N个实数,并显示在屏幕上。
源程序参见教材p295-296.,11.5二进制文件应用(续3),例11.11删除一个正文文件中的大写英文字母。
算法设计:
删除文件中的内容时,必须建立一个临时文件,将源文件需要保留的字符拷贝到临时文件。
最后,通过文件操作命令删除源文件,并将临时文件更名为源文件。
#includestdio.h#includestring.hvoidgetpathname(charfname,charpath)/提取路径名charq,p=strrchr(fname,);if(p)for(q=fname;q=p;q+)path+=q;path=0;,11.6二进制文件应用(续4),voidmain()FILEfr,fw;charch,fname81,path81;printf(InputaTXTfilename:
);gets(fname);getpathname(fname,path);strcat(path,$.TMP);/临时建立到与源文件相同的目录中/fr=fopen(fname,rb);if(!
fr)printf(%sfilenotfound.n,fname);return;fw=fopen(path,wb);if(!
fw)printf(Cannotcreatetemporaryfile.n);return;,11.6二进制文件应用(续5完),while
(1)ch=fgetc(fr);if(feof(fr)break;if(!
(ch=A,重点小结与作业,本章重点:
C语言流文件操作函数难点:
不同文件打开方式的操作特点;读写位置指针;feof函数与读文件循环控制2.字符文件应用3.二进制文件的应用作业:
11.2211.25书上11.4,11.7,11.9,11.12,11.14作业本及上机11.18,11.19只上机不写作业本,ThankYou!
第十一章完,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精通 程序设计 第十一 文件 操作