C语言程序设计-提高篇-第3章 文件-3_第1页
C语言程序设计-提高篇-第3章 文件-3_第2页
C语言程序设计-提高篇-第3章 文件-3_第3页
C语言程序设计-提高篇-第3章 文件-3_第4页
C语言程序设计-提高篇-第3章 文件-3_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、提高篇C语言程序设计提高篇第第3 3章章 文件文件 提高篇 文件分类文件分类 缓冲文件系统缓冲文件系统 文件的指针文件的指针 文件打开与关闭文件打开与关闭 文件应用文件应用提高篇1.概述文件的概念,非缓冲文件系统和缓冲文件系概述文件的概念,非缓冲文件系统和缓冲文件系统;统; 2.描述文件类型指针的概念及定义方法;描述文件类型指针的概念及定义方法;3.正确进行文件的打开和关闭操作,及对打开和关正确进行文件的打开和关闭操作,及对打开和关闭操作的错误处理;闭操作的错误处理;4.正确使用文件的读写操作,包括基于字节,数据正确使用文件的读写操作,包括基于字节,数据项等的读写操作;项等的读写操作;5.牢记

2、文件的随机读写方法;牢记文件的随机读写方法;6.正确使用文件访问的错误检测及处理方法;正确使用文件访问的错误检测及处理方法;提高篇文件是指存储在外部介文件是指存储在外部介质上,且按文件名访问的质上,且按文件名访问的一组信息序列一组信息序列提高篇文本文件文本文件(字符代码文件或字符代码文件或ASCII代码文件代码文件)由一个一个字符组成,每一个字符用一个由一个一个字符组成,每一个字符用一个ASCII代码表示,如代码表示,如123.45以以ASCII代码形式存代码形式存储到磁盘需要储到磁盘需要6个字节。个字节。特点:可通过显示器或打印机显示,即可读,特点:可通过显示器或打印机显示,即可读,比较直观

3、。比较直观。提高篇非文本文件非文本文件(二进制文件二进制文件)是指以数据在内存中的存储形式原样输出存是指以数据在内存中的存储形式原样输出存储到磁盘上的文件。如储到磁盘上的文件。如123.45在内存中以浮点在内存中以浮点数形式存储占数形式存储占4个字节,不管一个实数多大都个字节,不管一个实数多大都占占4个字节。个字节。特点:节省存储空间,输入输出无需转换,特点:节省存储空间,输入输出无需转换,速度快,不便阅读。速度快,不便阅读。提高篇00110110001100000011001100111000ASCII形式形式(6)(0)(3)(8)0011011000111000内存形式内存形式(6038

4、)0001011110010110二进制形式二进制形式提高篇说明:说明:一个一个C文件是一个字节流或二进制流,它文件是一个字节流或二进制流,它把数据看作是一连串的字符序列把数据看作是一连串的字符序列(字节字节),而不,而不考虑记录的界限,即考虑记录的界限,即C文件并不是由记录组成文件并不是由记录组成的。的。由于对文件的操作要与各种外部设备发生由于对文件的操作要与各种外部设备发生联系,因此对文件的输入输出联系,因此对文件的输入输出(读写读写)过程是通过程是通过操作系统来实现的。对文件的读写都是通过过操作系统来实现的。对文件的读写都是通过标准的标准的I/O函数进行的。函数进行的。提高篇缓冲文件系统

5、缓冲文件系统(又称标准或高层文件系统又称标准或高层文件系统)特点:对程序中的每一个文件都在内存中开特点:对程序中的每一个文件都在内存中开辟一个辟一个“缓冲区缓冲区”。作用:从磁盘文件读入的数据先到作用:从磁盘文件读入的数据先到“输入缓输入缓冲区冲区”中,然后再从缓冲区依次将数据送给接中,然后再从缓冲区依次将数据送给接收变量。收变量。提高篇在向磁盘文件输出数据时,先将程序数据区在向磁盘文件输出数据时,先将程序数据区中变量或表达式的值送到中变量或表达式的值送到“输出文件缓冲区输出文件缓冲区”中,待装满后才一起输出给磁盘文件。目的减中,待装满后才一起输出给磁盘文件。目的减少对磁盘的读写次数,即一次可

6、以读入一批数少对磁盘的读写次数,即一次可以读入一批数据或输出一批数据。据或输出一批数据。变量变量a磁盘文件磁盘文件内存内存程序数据区程序数据区输入文件缓输入文件缓冲区冲区(512k)输出文件缓输出文件缓冲区冲区(512k)读读写写提高篇非缓冲文件系统:不由系统自动设置所非缓冲文件系统:不由系统自动设置所需缓冲区,而由用户根据需要设置。需缓冲区,而由用户根据需要设置。新的新的ANSI标准只建议使用缓冲系统,并标准只建议使用缓冲系统,并对缓冲文件系统的功能进行了扩充,使既对缓冲文件系统的功能进行了扩充,使既能用于处理字符代码文件,也能处理二进能用于处理字符代码文件,也能处理二进制文件。制文件。提高

7、篇对文件的操作是通过文件指针实现的,对文件的操作是通过文件指针实现的,关键的概念是关键的概念是“文件指针文件指针” 。调用一个文件需要的信息:调用一个文件需要的信息:文件当前读写的位置;文件当前读写的位置;与该文件对应的内存缓冲区的地址;与该文件对应的内存缓冲区的地址;缓冲区未被处理的字符数缓冲区未被处理的字符数(字符指针字符指针);文件的操作方式。文件的操作方式。提高篇系统内部定义了一个系统内部定义了一个FILE的结构类型。的结构类型。typedef structint_fd;/文件号文件号int_cleft;/缓冲区中剩余的字符缓冲区中剩余的字符int_mode;/文件操作方式文件操作方式

8、char *_nextc;/下一个字符位置下一个字符位置char *_buff;/文件缓冲区位置文件缓冲区位置FILE;提高篇 FILE类型类型 保存被使用的文件的有关信息保存被使用的文件的有关信息 所有的文件操作都需要所有的文件操作都需要FILE类型的指针类型的指针 FILE是库文件中定义的结构体的别是库文件中定义的结构体的别名名,FILE 定义在定义在stdio.h中中 注意不要写成注意不要写成struct FILE 举例举例 FILE *fp;提高篇文件必须先打开后,并及时关闭文件必须先打开后,并及时关闭1)打开文件:是在用户程序和操作系打开文件:是在用户程序和操作系统之间建立联系,程序

9、要把操作的文统之间建立联系,程序要把操作的文件的信息通知操作系统,如文件名、件的信息通知操作系统,如文件名、文件操作方式文件操作方式(读写读写)。提高篇读文件:读文件:需要先确定此文件是否存在,需要先确定此文件是否存在,并将读当前位置设定为文件的开头。并将读当前位置设定为文件的开头。写文件:写文件:需要检查原来是否有同名文需要检查原来是否有同名文件,如有则将该文件的原有内容删除,件,如有则将该文件的原有内容删除,如无同名文件就建立一个新文件,然如无同名文件就建立一个新文件,然后将写当前位置设定于文件的开头,后将写当前位置设定于文件的开头,以便从文件开头写入数据。以便从文件开头写入数据。提高篇文

10、件的打开方式:文件的打开方式:l调用方式调用方式nfopen(文件名文件名,文件操作方式文件操作方式);l功能:返回一个指向该文件的指针或错误标志功能:返回一个指向该文件的指针或错误标志NULL。为避免出错,常用以下方法来打开文件为避免出错,常用以下方法来打开文件FILE*fp;if(fp=fopen(“文件名文件名”,“使用文件方式使用文件方式”)=NULL)printf(”cannot open this file.n”);exit(0); /正常中止程序正常中止程序提高篇文件的打开模式文件的打开模式打开模式描 述r只读,打开已有文件,不能写w只写,创建或打开,覆盖已有文件a追加,创建或打

11、开,在已有文件末尾追加r+读写,打开已有文件w+读写,创建或打开,覆盖已有文件a+读写,创建或打开,在已有文件末尾追加t按文本方式打开 (缺省)b按二进制方式打开提高篇文件的打开举例FILE *fp1, *fp2, *fp3;char filename=file3.dat;/* 以文本只读方式打开以文本只读方式打开file1 */if (!(fp1=fopen(file1, r) printf(Cannot Open This File!n); exit(0); /* 退出程序退出程序 */ /* 以二进制读写方式打开以二进制读写方式打开file2.txt */fp2=fopen(C:HOME

12、file2.txt, rb+);/* 以二进制读写方式打开以二进制读写方式打开file3.dat */fp3=fopen(filename, a+b);提高篇2)文件的关闭:文件的关闭:调用方式调用方式nfclose(文件指针变量文件指针变量);l功能:关闭一个已打开的文件功能:关闭一个已打开的文件(释放文件信息区释放文件信息区)l返回值:若成功,返回返回值:若成功,返回0,若出错,返回若出错,返回EOF(-1)3)文件结尾标志文件结尾标志: EOF说明:说明:释放文件的有关信息区;释放文件的有关信息区;将输出文件缓冲区的内容将输出文件缓冲区的内容(无论缓冲区是否为满无论缓冲区是否为满)都输都

13、输出写入文件,然后关闭文件,这样可防止丢失本来应出写入文件,然后关闭文件,这样可防止丢失本来应写入文件的数据。写入文件的数据。不用的文件应关闭,防止数据破坏丢失不用的文件应关闭,防止数据破坏丢失提高篇文件应用示例文件应用示例例例1:格式化的输入输出。:格式化的输入输出。fprintf(fp,格式字符串格式字符串,输出项表列输出项表列)功能:将输出按格式串规定输出到指定文功能:将输出按格式串规定输出到指定文件。件。fscanf(fp,格式字符串格式字符串,输入项表列输入项表列)功能:从功能:从fp所指文件按格式串读入数据。所指文件按格式串读入数据。函数执行成功返回读得的数据项个数;若函数执行成功

14、返回读得的数据项个数;若在读第在读第1项前已到达文件结束处,则返回项前已到达文件结束处,则返回EOF。提高篇#include #include #include void main()FILE *fp;char name10;int num;float score;if(fp=fopen(file3.txt,w+)=NULL)printf(cannot open this file.n);exit(0);printf(enter name,num,score:);scanf(%s %d %f,name,&num,&score);提高篇while(strlen(name)1)fp

15、rintf(fp,%s %d %fn,name,num,score);printf(enter name,num,score:);scanf(%s %d %f,name,&num,&score);rewind(fp);/使文件指针返回到文件的开头while(fscanf(fp,%s %d %f,name,&num, &score) !=EOF)printf(%-10s,%6d,%6.2fn,name,num,score);fclose(fp);提高篇输入:输入: enter name,num,score: zhangsan0501 90 enter name,n

16、um,score: liming0502 85 enter name,num,score: gaofei0503 95 enter name,num,score: 000输出:输出:zhangsan50190.00 liming50285.00gaofei50395.00提高篇例例2:具有文件拷贝功能的程序:具有文件拷贝功能的程序filecopy.c。说明两个问题:命令行参数的应用和文说明两个问题:命令行参数的应用和文件的字符输入与输出应用。件的字符输入与输出应用。fgetc(fp)功能:从指定文件读入一个字符。功能:从指定文件读入一个字符。fputc(ch,fp)功能:把一个字符写到指定文件

17、中去。功能:把一个字符写到指定文件中去。提高篇#include #include #include void filecopy(FILE *fp1,FILE *fp2)char c;while(c=fgetc(fp1)!=EOF)fputc(c,fp2);提高篇void main(int argc,char *argv)FILE *fp1,*fp2;/void filecopy(FILE *fp1,FILE *fp2);if(argc1)if(fp1=fopen(*+argv,r)=NULL)printf(cant fopen %sn,*argv);exit(0);if(fp2=fopen(*

18、+argv,w)=NULL)printf(cant fopen %sn,*argv);exit(0);filecopy(fp1,fp2);提高篇例例3:文件的字符串的输入输出处理。:文件的字符串的输入输出处理。fgets(str,n,fp)字符串输入函数字符串输入函数其功能是从其功能是从fp指定的文件中读取一个串,若满足以下条指定的文件中读取一个串,若满足以下条件读取结束:已读取件读取结束:已读取n-1个字符个字符, 当前读取到的字符是当前读取到的字符是回车符回车符, 已读取到文件尾。已读取到文件尾。读取的字符个数至多读取的字符个数至多n-1个,余下的一个字节空间作为个,余下的一个字节空间作为

19、加加“0”串结束符。串结束符。读取回车符时,也作为一个字符送入由读取回车符时,也作为一个字符送入由str所指的内存缓所指的内存缓冲区。然后再加一个字符结束符冲区。然后再加一个字符结束符“0”str为数组名或字符指针为数组名或字符指针;n为读取字符个数为读取字符个数提高篇例例3:文件的字符串的输入输出处理。:文件的字符串的输入输出处理。fputs(str,fp)字符串输出字符串输出(写写)函数函数其功能是将其功能是将str所指定的字符串写到所指定的字符串写到fp指向的文件中。指向的文件中。与与fgets()函数在输入字符串自动加函数在输入字符串自动加“0”特性对应,特性对应,fputs ()函数

20、在将函数在将C字符串写入文件时其末尾的字符串写入文件时其末尾的“0”字符字符自动舍去。自动舍去。提高篇#include #include #include void main()FILE*fp;char str16; if(fp=open(“file2.txt”,”w”)=NULLprintf(“cannot open this file.n”);exit(0);while(strlen(gets(str)0)fputs(str,fp);fclose(fp);if(fp=open(“file2.txt”,”r”)=NULLprintf(“cannot open this file.n”);ex

21、it(0);while(fgets(str,16,fp)!=NULL)printf(“%sn”,str);fclose(fp);提高篇文件的读写函数功能函数功能fputc输出字符fprintf格式化输出fgetc输入字符fscanf格式化输入putc输出字符putw输出一个字getc输入字符getw输入一个字fwrite输出数据块fputs输出字符串fread输入数据块fgets输入字符串提高篇例例4:数据块:数据块(二进制形式二进制形式)的读写的读写fread(buffer,size,count,fp)功能功能:从指定文件读入从指定文件读入count个大小为个大小为size的字节数据块的字节

22、数据块,存入存入buffer所指存储单元。返回所读的数据项个数所指存储单元。返回所读的数据项个数,如遇如遇文件结束或出错返回文件结束或出错返回0。fwrite(buffer,size,count,fp)功能功能: 从从buffer所指存储单元的数据取所指存储单元的数据取size count个字个字节送节送fp所指文件。返回写到所指文件。返回写到fp所指文件中的数据项的个所指文件中的数据项的个数。数。提高篇例例4:数据块:数据块(二进制形式二进制形式)的读写的读写fread(buffer,size,count,fp)fwrite(buffer,size,count,fp)说明说明:buffer为

23、输入输出在内存中存放的首地址;为输入输出在内存中存放的首地址;size为读、写的字节数,即数据块的大小;为读、写的字节数,即数据块的大小;count为输入输出的数据项的个数;为输入输出的数据项的个数;fread()和和fwrite()用于二进制文件的输入输出。用于二进制文件的输入输出。提高篇#include #include #define SIZE 4struct studentchar name10;int num,age;char addr15;studSIZE;void save_load()FILE *fp;int i;if(fp=fopen(stu_list,wb+)=NULL)p

24、rintf(cannot open file.n);exit(0);提高篇for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct student),1,fp)!=1)printf(file write error!n);exit(0);rewind(fp);for(i=0;iSIZE;i+)if(fread(&studi,sizeof(struct student),1,fp)!=0)printf(%-10s %4d %4d %-15sn, ,studi.num, studi.age, studi.addr);提高篇输

25、入:输入:zhang100119room_101li1002 19room_102wang100321room_103zhao100421room_104输出:输出:zhang100119room_101li1002 19room_102wang100321room_103zhao100421room_104void main()int i;for(i=0;iSIZE;i+)scanf(%s %d %d %s, , &studi.num,&studi.age, studi.addr);save_load();提高篇回顾:回顾:fgetc( ), fputc(

26、 )fgets( ), fputs( )fscanf( ), fprintf( )这些函数都是这些函数都是按顺序读按顺序读/写写文件文件3.5 文件的随机读写文件的随机读写提高篇解决的办法:解决的办法:把文件指针移到指定的位置即可。把文件指针移到指定的位置即可。关键步骤:关键步骤:文件的定位。文件的定位。3.5 文件的随机读写文件的随机读写问题:问题:要求打开文件后,对指定位置上的数据要求打开文件后,对指定位置上的数据进行读写操作,减少一些不必要的中间环节。进行读写操作,减少一些不必要的中间环节。提高篇一、对文件随机存取的思想一、对文件随机存取的思想 对一个文件流,有主观的愿望要取指定位对一个

27、文件流,有主观的愿望要取指定位置的记录和更新指定位置的记录。置的记录和更新指定位置的记录。如:如:对一个文件流对一个文件流可以有两种目的:可以有两种目的: 从第从第i个字节开始,读取个字节开始,读取k个字节的内容个字节的内容 把把k个字节的内容写到从第个字节的内容写到从第i个字节开始后个字节开始后存在的问题:存在的问题:读取的内容是否满足我们的要求?读取的内容是否满足我们的要求?30 1 2结束标志kin1提高篇二、随机存取的应用二、随机存取的应用 随机存取文件适合于具有固定长度记录的文件随机存取文件适合于具有固定长度记录的文件程序可以很方便的访问到指定位置处的记录。程序可以很方便的访问到指定

28、位置处的记录。访问100200300400500结束标志0100个字节100个字节100个字节100个字节100个字节100个字节提高篇三、随机存取的目的三、随机存取的目的1. 方便、快捷方便、快捷2. 只改变指定位置后的固定长度字节的只改变指定位置后的固定长度字节的内容内容(不会破坏其它的数据不会破坏其它的数据)结束标志读取、修改等读取、修改等提高篇问题的实质:问题的实质:把指定的数据写到文件流中指把指定的数据写到文件流中指定的位置。定的位置。问题的关键:问题的关键:把文件指针定位到文件流中指把文件指针定位到文件流中指定的位置。定的位置。步骤:步骤:定位定位写数据写数据四、向随机文件中随机地

29、写入数据四、向随机文件中随机地写入数据提高篇五、文件定位函数五、文件定位函数 fseek(文件指针变量、 位移量、起始点)注:注: 起始点的取值只有3种: 位移量:以起始点为基点移动的字节数 0 文件开始处1 文件位置指针的当前位置2 文件尾。文件头文件尾起始点一位移量十位移量(往后)(往前)提高篇 位移量应为long型 fseek( )的返回值:0 成功非零 失败例:例:fseek(fp, 20l, 0);将位置指针从文件头移动20个字节fseek(fp, 10l, 1);将位置指针移到离文件尾30个字节处fseek(fp, 30l, 2);将位置从当前位置向后移10个字节提高篇六、位置函数

30、六、位置函数 ftell(文件指针变量);作用:作用:返回位置指针的当前指向返回值:返回值:0, 文件指针的当前指向1, 出错提高篇例例5: 文件文件data1.txt的内容如下:的内容如下:This is a test.C语言程序设计,随机读写函数测试。要求编写一程序随机读出指定的记录。七、重新定位函数七、重新定位函数rewind( 文件指针变量 )作用作用:使文件指针返回到文件的开头无返回值提高篇#include #include #include void main( )FILE *fp;int loc1, loc2;long d=8l;char w;fp=fopen(data1.txt

31、, r);if (fp=NULL)printf(errorn);elseloc1=fseek(fp,d,0);if (loc1=0)w=fgetc(fp);printf(w=%cn,w);提高篇运行结果:运行结果: w=a loc2=9 loc2=0loc2=ftell(fp);rewind(fp);printf(loc2=%dn,loc2);loc2=ftell(fp);fclose(fp);printf(loc2=%dn,loc2);提高篇思考思考:若要采用随机读写的方式读取一个汉字,程序如何修改?提示:提示: 一个汉字占2个字节 可使用fgets ( )函数将要读出的汉字装a数组 读取的字符个数必须为3的单数提高篇八、文件操作的错误检测八、

温馨提示

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

评论

0/150

提交评论