精通C程序设计十一文件操作_第1页
精通C程序设计十一文件操作_第2页
精通C程序设计十一文件操作_第3页
精通C程序设计十一文件操作_第4页
精通C程序设计十一文件操作_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十一章文件操作本章内容提要: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.TXT""C:\\user\\abc.txt"(2)

返回值为NULL表明文件打开失败;否则打开成功,为一个有效的FILE*型指针值。(3)mode:文件打开方式字符串11.3C语言文件操作函数(续1)打开方式串操作特点字符文件二进制文件"r"或"rt""rb"只读方式,要求文件必须已经存在"w"或"wt""wb"只写方式,文件存在,则截取文件长度为0,即删除文件原有数据,重建文件;文件不存在则建立新的文件"a"或"at""ab"添加写方式,文件存在,则只能从文件结尾开始写入数据;文件不存在,则新建"r+"或"rt+""rb+"读写方式,要求文件必须已经存在,可以进行全文读、改写、添加写。"wb+"写读方式,文件存在,则截取文件长度为0,文件不存在,则建新文件,允许读出写入的数据和改写已经写入的数据。"a+"或"at+""ab+"添加可读方式,文件存在,只能添加写,文件不存在,则建立新文件;允许读出添加写入的数据和改写添加写入的数据。"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字节)写入文件。

成功:返回写入的该字节(0~255);

失败:返回EOF(-1)intfgetc(FILE*fp);从文件中读出一个字节并返回。

成功:函数返回值为0~255,即读出的字节;

失败:返回值为EOF(-1)。

11.3C语言文件操作函数(续6)(2)字符串读写函数(字符与二进制文件均适用)char

fgets(char

s,intn,FILE

fp);从文件中连续读出n

1个字符存入字符指针s开始的内存,最后自动加上一个字符'\0'。

成功:函数返回值为s;失败:返回值为NULL。intfputs(char

s,FILE

fp);将字符串s写入文件(不写入'\0')。

成功:函数返回非负整数;失败:返回EOF。11.3C语言文件操作函数(续7)(3)格式化读写函数(仅字符文件适用)intfscanf(FILEfp,charformat[,&argument]...);intfprintf(FILEfp,charformat[,expression]...);与scanf与printf的用法完全一样,但是从字符文件读写数据。fscanf(stdin,...);

scanf(...);fprintf(stdout,...);

printf(...);11.3C语言文件操作函数(续8)(4)

字节块读写函数(仅二进制文件适用)unsignedfread(void

buffer,unsignedsize,unsignedcount,FILE

fp);从文件中连续读出size

count个字节存入指针buffer开始的内存。返回实际读出的字节数。

unsignedfwrite(void

buffer,unsignedsize,unsignedcount,FILE

fp);

从内存地址buffer开始,写size

count字节到文件中。返回实际写入文件的字节数。

11.3C语言文件操作函数(续9)4.数据读写位置指针操作函数(1)文件数据读写位置指针的概念字节流文件的读写位置以字节为单位编号。长度为n字节的文件,第一字节的编号为0,最后一个字节的编号为n-1,因此文件数据读写位置指针的有效范围为0~n-1。(2)数据读写位置指针的自动移动规则

(a)

任何方式打开文件时,指针初态都是0;11.3C语言文件操作函数(续10)(b)

含a的打开方式,只要进行写操作,则指针自动移到文件当前结束位置即位置n(n为当前文件已有字节数)处。(c)

进行任何读写操作时,指针总是从当前位置开始读写,读写结束后,指针当前位置自动移动到读写之后的位置。(3)数据读写位置指针的操作函数voidrewind(FILE

fp);

重置当前读写位置指针为0。11.3C语言文件操作函数(续11)longftell(FILE*fp);

返回当前文件读写位置指针值。intfseek(FILE*fp,longoffset,intstartpos);读写位置指针移动到偏移startpos指定的位置offset字节处。startpos=0

SEEK_SET

文件开始处(位置0)

1

SEEK_CUR

当前指针位置处

2

SEEK_END

文件结尾处(位置n)

n为文件当前字节长度11.3C语言文件操作函数(续12)SEEK_SETSEEK_CURSEEK_END11.3C语言文件操作函数(续13)5.读操作失败标志函数intfeof(FILE

fp);当且仅当文件当前读写位置指针在有效数据区以外并进行了读操作,函数返回值不等于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文件更名

int

rename(char

oldname,char

newname);成功,函数返回0,否则返回

1。文件更名必须符合操作系统关于文件更名的规定。例如:rename("A1.DAT","A2.DAT");11.3C语言文件操作函数(续18完)(2)删除文件intremove(char

path);删除磁盘上由文件名path指定的文件。删除文件成功,返回0,否则返回

1。删除文件失败的可能情况是:没有指定正确的文件名;文件不存在;或者文件是只读属性。

例如:remove("D:\\TC\\A.C");11.4字符文件应用例11.3打印如下图形到屏幕上与正文文件ABC.TXT中,要求打印行数n由键盘输入。135791113151719n行算法设计:屏幕上怎样输出,就在字符文件中怎样输出。

#include"stdio.h"voidmain(){intn,i,j,k;FILE

fw;printf("Inputn=");scanf("%d",&n);fw=fopen("abc.txt","w");k=1;for(i=1;i<=n;i++){printf("%s",4

(n

i),"");fprintf(fw,"%

s",4

(n

i),"");for(j=1;j<=i;j){printf("%4d",k);fprintf(fw,"%4d",k);k+=2;}printf("\n");fprintf(fw,"\n");}fclose(fw);}11.4字符文件应用(续1)11.4字符文件应用(续2)例11.4

用正文文件A1.TXT提供数据建立一个矩阵,然后输出转置矩阵到正文文件A2.TXT。算法设计:设矩阵为4行3列整型矩阵,建立A1.TXT文件内容如下:1235678910111213

文件A1.TXT可用任何字符文件编辑软件建立,如WINDOWS的"记事本"程序。11.4字符文件应用(续3)#include"stdio.h"#defineN4#defineM3voidmain(){longa[N][M],b[M][N];inti,j;FILE

fw,

fr;fr=fopen("a1.txt","r");fw=fopen("a2.txt","w");if(!fr){printf("Filea1.txtnotfound.\n");return;}for(i=0;i<N;i++)for(j=0;j<M;j++){fscanf(fr,"%ld",&a[i][j]);b[j][i]=a[i][j];}for(i=0;i<M;i++){for(j=0;j<N;j++)fprintf(fw,"%6ld",b[i][j]);fprintf(fw,"\n");}fcloseall();}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的内容

158112691237101311.4字符文件应用(续5)11.4字符文件应用(续6)#include"stdio.h"voidmain(){FILE

fr;charch;charfname[81];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=%d\n",n);fclose(fr);}11.4字符文件应用(续7)例11.6判断一个C源程序中的大括号{}是否配对。算法设计:C源程序文件名由键盘输入;设置一个计数变量c,初值为0,读到左{则c自加1,遇到右}则自减1。扫描文件过程中,出现c<0或者扫描结束后,c>0都说明{}没有配对。

#include"stdio.h"voidmain(){FILE

fr;intch;charfname[81];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(c<0)break;/

c<0,说明大括号配对不正确

/

}

if(c!=0)printf("braceserror.\n");elseprintf("bracesright.\n");fclose(fr);}11.4字符文件应用(续9)例11.7删除一个C源程序文件中的注释。算法设计:用空格擦写/*....*/部分。设两个长整型变量pos1,pos2,表示注释开始和结束的位置。注意查找注释开始与结束的方法。ABCD…/*XXXX*/ch1ch2ch1ch2pos1pos2注意:ch1,ch2每循环一次只推进一个字节,才能保证搜索的完整性,如上图所示。11.4字符文件应用(续10)#include"stdio.h"voidmain(intargc,char

argv[])/*参见教材P2409.4*/{FILE

fp;charfname[81],ch1,ch2;longpos1,pos2;if(argc==2)/

若含有一个文件名参数

/

fp=fopen(argv[1],"rb+");else{printf("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=='/'&&ch2=='

')pos1=ftell(fp)

2;if(ch1=='*'&&ch2=='/'){pos2=ftell(fp)

1;fseek(fp,pos1,SEEK_SET);

for(;pos1<=pos2;pos1++){charch=fgetc(fp);if(ch!='\r'&&ch!='\n')/*回车符与换行符不覆盖*/{fseek(fp,

1L,1);fputc('',fp);fseek(fp,0L,1);}}}ch1=ch2;}

fclose(fp);}11.4字符文件应用(续12完)例11.8

输入一句英文,将其作为一行,添加进文本文件B.TXT中。#include"stdio.h"voidmain(){chars[81];FILE

fp;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

编程实现文件复制程序。要求源文件名和目的文件名可以用命令行参数提供,也可以提示从键盘输入。

#include"stdio.h"#include"string.h"voidmain(intargc,char

argv[]){FILE

fr,

fw;intch;charsfn[81],dfn[81];if(argc==3){strcpy(sfn,argv[1]);strcpy(dfn,argv[2]);}else{printf("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

删除一个正文文件中的大写英文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论