第10章 文件处理程序设计_第1页
第10章 文件处理程序设计_第2页
第10章 文件处理程序设计_第3页
第10章 文件处理程序设计_第4页
第10章 文件处理程序设计_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、第10章 文件处理程序设计C语言程序设计语言程序设计2解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20本章内容本章内容文件复制问题文件复制问题1账号管理问题账号管理问题2DOS环境下的文件复制问题环境下的文件复制问题3 内部函数、外部函数内部函数、外部函数复杂系统的多文件运行复杂系统的多文件运行文件的概念、文件的打开与关闭文件的概念、文件的打开与关闭出错检查、文件的顺序读写出错检查、文件的顺序读写 多文件管理问题多文件管理问题4带参数的带参数的main函数函数文件定位、随机文件的读写文件定位、随机文件的读写3文件复制问题文件复制问题v在程序对数据进行操

2、作的过程中,可以利在程序对数据进行操作的过程中,可以利用变量存储各种信息,如输入的数据、计用变量存储各种信息,如输入的数据、计算结果和运行过程中产生的中间值,但是算结果和运行过程中产生的中间值,但是程序停止运行,变量的值就丢失了。程序停止运行,变量的值就丢失了。v在很多应用中,能够永久存储信息是非常在很多应用中,能够永久存储信息是非常重要的。当用户想让信息存储在计算机上重要的。当用户想让信息存储在计算机上的时间比程序运行的时间更长时,一般的的时间比程序运行的时间更长时,一般的方法是收集信息,使其成为一个逻辑上结方法是收集信息,使其成为一个逻辑上结合更紧密的整体,并以文件的形式保存在合更紧密的整

3、体,并以文件的形式保存在一种永久存储介质中。一种永久存储介质中。例例10-1【例例10-1】如何将一个文件的内容复制到另一个如何将一个文件的内容复制到另一个文件中?文件中?【分析分析】操作系统是以文件为单位对数据进行管理的。操作系统是以文件为单位对数据进行管理的。也就是说,如果要查找存在外部介质上的数据,也就是说,如果要查找存在外部介质上的数据,必须先按文件名找到指定的文件,然后再从该文必须先按文件名找到指定的文件,然后再从该文件中读取数据。件中读取数据。如果要向外部介质上存储数据,也必须先建立一如果要向外部介质上存储数据,也必须先建立一个文件(以文件名标识),然后才能向它输出数个文件(以文件

4、名标识),然后才能向它输出数据。据。5解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-1 实现代码实现代码/* LI10_1.C */#include#includeint main() FILE *fp1,*fp2; /*定义指向源文件和目标文件的指针定义指向源文件和目标文件的指针*/ char ch,file150,file250; printf(Input source file :); scanf(%s,file1); /* 输入源文件名输入源文件名 */ printf(Input object file :); scanf(%s,f

5、ile2); /* 输入目标文件名输入目标文件名 */ if(fp1=fopen(file1,r)=NULL) /*以只读方式打开要复制的文件以只读方式打开要复制的文件*/ printf(Cannot open %sn,file1); exit(1); /*文件打开不成功的处理文件打开不成功的处理*/ if(fp2=fopen(file2,w)=NULL) /* 以写的方式打开复制的目标文件以写的方式打开复制的目标文件 */ fp2=stdout; /* 缺省输出文件为标准输出设备即到显示器缺省输出文件为标准输出设备即到显示器 */ while(ch=fgetc(fp1)!=EOF) /* 读

6、第一个文件的字符读第一个文件的字符 */ fputc(ch,fp2); /* 复制到第二个文件复制到第二个文件 */ fclose(fp1); /* 关闭文件关闭文件1 */ fclose(fp2); /* 关闭文件关闭文件2 */ return 0;定义文定义文件结构件结构体指针体指针以读方以读方式打开式打开文件文件以写方以写方式打开式打开文件文件读文读文件信件信息息写文写文件信件信息息关闭关闭文件文件文件的概念文件的概念v所谓所谓“文件文件”一般指存储在介质上的数据的一般指存储在介质上的数据的集合。集合。v在在C语言中,文件就是由一个一个的字符或字语言中,文件就是由一个一个的字符或字节的数

7、据顺序组成的字符或字节序列。节的数据顺序组成的字符或字节序列。v换句话说,换句话说,C语言把文件看作是一个有序的字语言把文件看作是一个有序的字节流。节流。vC语言对文件的存取是以字节为单位的,也就语言对文件的存取是以字节为单位的,也就意味着以字符形式进行操作。意味着以字符形式进行操作。v每一个文件通常以文件结束标志(每一个文件通常以文件结束标志(end-of-file,也就是,也就是EOF)结束。)结束。文件的分类文件的分类从用户的角度从用户的角度文件分为文件分为标准设备文件普通磁盘文件从文件编码方式从文件编码方式文件分为文件分为ASCII文件二进制文件v把外部设备也看作是一个文件来进行管理,

8、把它把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。们的输入、输出等同于对磁盘文件的读和写。v键盘键盘为标准的输入文件,文件指针为为标准的输入文件,文件指针为stdin。从。从键盘上输入就意味着从标准输入文件上输入数据。键盘上输入就意味着从标准输入文件上输入数据。如如scanfscanf、getchargetchar函数。函数。v显示器显示器为标准输出文件,文件指针为为标准输出文件,文件指针为stdout。在屏幕上显示有关信息就是向标准输出文件输出。在屏幕上显示有关信息就是向标准输出文件输出。如如printfprintf、putcharputchar函数。函数

9、。v标准错误输出标准错误输出也是标准设备文件,文件指针为也是标准设备文件,文件指针为stderr。v本章所讲的文件主要是针对普通的本章所讲的文件主要是针对普通的磁盘文件磁盘文件。标准设备文件标准设备文件9解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20从文件编码方式分类从文件编码方式分类v从文件编码的方式分从文件编码的方式分: ASCIIASCII码文件。码文件。在磁盘中存放时每个字符对应在磁盘中存放时每个字符对应一个字节,用于存放对应的一个字节,用于存放对应的ASCIIASCII码。码。 二进制文件。数据按其在内存中的存储形式原二进制文件。数据按其在

10、内存中的存储形式原样存放。样存放。 ASCII文件文件vASCII文件也称文本文件。文件也称文本文件。vASCII文件在磁盘中存放时,每个字符对文件在磁盘中存放时,每个字符对应一个字节,用于应一个字节,用于存放对应的存放对应的ASCII码码。如:整型十进制数如:整型十进制数5678,按,按ASCII文件文件存放则需要占用存放则需要占用4个字节。个字节。 二进制文件二进制文件v二进制文件:是对不同的数据类型,按其二进制文件:是对不同的数据类型,按其实际占用内存字节数实际占用内存字节数存放。即内存的存储存放。即内存的存储形式,原样输出到磁盘上存放。形式,原样输出到磁盘上存放。v十进制整数十进制整数

11、12345的存储,按的存储,按ASCII码码形式存储占用形式存储占用5个字节,而采用二进制形个字节,而采用二进制形式存储只需要式存储只需要2个字节。个字节。文件在内存中的存储文件在内存中的存储内存存储形式内存存储形式 二进制文件形式二进制文件形式 00110000 00111001 00110000 00111001 1 的的 ASCII 2(50) 3(51) 4(52) 5(53) 码为码为(49) ASCII文件(文本文件)形式文件(文本文件)形式 00110010 00110011 00110100 00110101 00110001ASCII文件与二进制文件的区别vASCIIASCI

12、I码文件可在屏幕上按字符显示,例如码文件可在屏幕上按字符显示,例如源程序文件就是源程序文件就是ASCIIASCII文件,用文件,用DOSDOS命令命令TYPETYPE可显示文件的内容。可显示文件的内容。v由于是按字符显示,因此由于是按字符显示,因此能读懂能读懂文件内容。文件内容。占用占用存储空间大存储空间大,在进行读、写操作时要,在进行读、写操作时要进行二进制与十进制之间的相互进行二进制与十进制之间的相互转换转换,效效率低率低。v二进制文件虽然也可在屏幕上显示,但其二进制文件虽然也可在屏幕上显示,但其内容内容无法读懂无法读懂。但二进制文件占用。但二进制文件占用存储空存储空间少间少,在进行读、写

13、操作时,在进行读、写操作时不不用进行二进用进行二进制与十进制之间的相互制与十进制之间的相互转换转换,效率高效率高。文件系统文件系统 v根据操作系统对文件的处理方式的不同,根据操作系统对文件的处理方式的不同,把文件系统分为把文件系统分为 缓冲文件系统缓冲文件系统 非缓冲文件系统非缓冲文件系统vANSI C标准采用缓冲文件系统。标准采用缓冲文件系统。 缓冲文件系统缓冲文件系统v缓冲文件系统是指操作系统在内存中为每缓冲文件系统是指操作系统在内存中为每一个正在使用的文件开辟一个读写缓冲区。一个正在使用的文件开辟一个读写缓冲区。 内内 存存 输出输出 ( 写写 ) 输入输入 ( 读读 ) 外存外存 输出

14、缓冲区输出缓冲区 文件文件 输输 入入 输入缓冲区输入缓冲区 程序数据区程序数据区 输出输出 v在输入数据时,先把数据从磁盘读到在输入数据时,先把数据从磁盘读到“输输入缓冲区入缓冲区”,等输入缓冲区已满或强制把,等输入缓冲区已满或强制把它清空时再把其中的数据送到程序数据区它清空时再把其中的数据送到程序数据区进行处理。进行处理。v处理完后的数据要送到文件中保存,先放处理完后的数据要送到文件中保存,先放到到“输出文件缓冲区输出文件缓冲区”,等输出缓冲区已,等输出缓冲区已满或强制把它清空时再把其中的数据送到满或强制把它清空时再把其中的数据送到磁盘文件。磁盘文件。 非缓冲文件系统非缓冲文件系统v非缓冲

15、文件系统指系统不自动开辟确定大非缓冲文件系统指系统不自动开辟确定大小的内存缓冲区,而是由程序自己为每个小的内存缓冲区,而是由程序自己为每个文件设定缓冲区。文件设定缓冲区。 18解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20文件指针v调用磁盘上的一个文件时,必须知道与该文件有调用磁盘上的一个文件时,必须知道与该文件有关的信息。比如文件名字、文件的当前读写位置、关的信息。比如文件名字、文件的当前读写位置、文件缓冲区大小与位置、文件的操作方式等。这文件缓冲区大小与位置、文件的操作方式等。这些信息被些信息被C C语言系统保存在一个称作语言系统保存在一个称作F

16、ILEFILE的结构的结构体体中,通常它被放在中,通常它被放在stdio.hstdio.h头文件内。头文件内。v对于每一个要操作的文件,都必须定义一个指针对于每一个要操作的文件,都必须定义一个指针变量,并使它指向该文件结构体变量,这个指针变量,并使它指向该文件结构体变量,这个指针称为称为文件指针文件指针。v通过文件指针找到被操作文件的描述信息,就可通过文件指针找到被操作文件的描述信息,就可对它所指的文件进行各种操作。对它所指的文件进行各种操作。FILE FILE * *指针变量标识符;指针变量标识符;v其中其中FILEFILE应为大写。应为大写。19解析解析C程序设计第程序设计第10章章 文件

17、处理程序设计文件处理程序设计2022-3-20typedef structtypedef struct int level; / int level; /* *缓冲区缓冲区“满满”或或“空空”的程度的程度* */ / unsigned flags; / unsigned flags; /* *文件状态标志文件状态标志* */ / char fd; / char fd; /* *文件描述符文件描述符* */ / unsigned char hold;/ unsigned char hold;/* *如无缓冲区不读取字符如无缓冲区不读取字符* */ / int bsize; / int bsize

18、; /* *缓冲区大小缓冲区大小* */ / unsigned char unsigned char * *buffer; /buffer; /* *数据缓冲区位置数据缓冲区位置* */ / unsigned char unsigned char * *curp; /curp; /* *文件定位指针文件定位指针* */ / unsigned istemp; / unsigned istemp; /* *临时文件指示器临时文件指示器* */ / short token; / short token; /* *用于有效性检查用于有效性检查* */ /FILE;FILE; FILE文件结构体文件的操

19、作文件的操作v对文件的操作的一般步骤包括对文件的操作的一般步骤包括: 打开文件打开文件 文件的读写文件的读写 关闭文件关闭文件v在语言中,文件操作都是由在语言中,文件操作都是由库函数库函数来完来完成的。这些库函数包含在成的。这些库函数包含在stdio.h头文件头文件中。中。v在在C语言中,也没有专门的文件输入输出语言中,也没有专门的文件输入输出语句,它们都是用库函数来实现的。语句,它们都是用库函数来实现的。文件的打开与关闭文件的打开与关闭 v打开文件打开文件是建立文件的各种有关信息,并是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它各使文件指针指向该文件,以便进行其它各种操作。种

20、操作。v关闭文件关闭文件是断开指针与文件之间的联系,是断开指针与文件之间的联系,禁止再对该文件进行操作。禁止再对该文件进行操作。 文件的打开文件的打开 文件指针名文件指针名=fopen(文件名文件名,使用文件方式使用文件方式); 如:如: FILE *fp1; fp1=fopen(c:tttest.exe,rb);v其意义是打开其意义是打开C驱动器磁盘的驱动器磁盘的tt目录下的文件目录下的文件test.exe,这是一个二进制文件,只允许按二,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线进制方式进行读操作。两个反斜线“”中的第中的第一个表示转义字符,第二个表示根目录。一个表示转义

21、字符,第二个表示根目录。 文件的打开文件的打开v文件的打开使用函数文件的打开使用函数fopen(),函数原型,函数原型为:为:FILE *fopen(char *filename,char *type);vfilename为需要打开的文件名,为需要打开的文件名, type为文件打开的类型,也是一个字符串,用为文件打开的类型,也是一个字符串,用于确定文件的使用方式,可以选用的方式于确定文件的使用方式,可以选用的方式如下:如下:文件使用方式文件使用方式意义意义 r只读打开一个文本文件,只允许读数据只读打开一个文本文件,只允许读数据 w只写打开或建立一个文本文件,只允许写数据只写打开或建立一个文本文

22、件,只允许写数据 a追加打开一个文本文件,并在文件末尾写数据追加打开一个文本文件,并在文件末尾写数据 rb只读打开一个二进制文件,只允许读数据只读打开一个二进制文件,只允许读数据 wb只写打开或建立一个二进制文件,只允许写数据只写打开或建立一个二进制文件,只允许写数据 ab追加打开一个二进制文件,并在文件末尾写数据追加打开一个二进制文件,并在文件末尾写数据 r+读写打开一个文本文件,允许读和写读写打开一个文本文件,允许读和写 w+读写打开或建立一个文本文件,允许读写读写打开或建立一个文本文件,允许读写 a+读写打开一个文本文件,允许读,或在文件末追加数据读写打开一个文本文件,允许读,或在文件末

23、追加数据 rb+读写打开一个二进制文件,允许读和写读写打开一个二进制文件,允许读和写 wb+读写打开或建立一个二进制文件,允许读和写读写打开或建立一个二进制文件,允许读和写 ab+读写打开一个二进制文件,允许读,或在文件末追加数据读写打开一个二进制文件,允许读,或在文件末追加数据文件的访问模式文件的访问模式v文件的关闭使用函数文件的关闭使用函数fclose(),函数原型,函数原型为:为:int fclose(FILE *stream);v其中:其中:stream为文件流指针。它的作用为文件流指针。它的作用是使文件指针变量不再指向该文件,同时是使文件指针变量不再指向该文件,同时关闭文件。关闭文件

24、。v当文件正常关闭时,返回当文件正常关闭时,返回0值;当文件关值;当文件关闭失败时闭失败时 (如磁盘空间不足、写保护或关如磁盘空间不足、写保护或关闭已经关闭的文件闭已经关闭的文件) ,返回非,返回非0值。值。文件的关闭文件的关闭 exit函数函数v原型为:原型为:void exit(int status); v功能:终止程序。它将功能:终止程序。它将status的值发送给的值发送给DOS环境变量。它在环境变量。它在stdlib.h中声明。中声明。27解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-2打开打开test.txt文件文件/* LI1

25、0_2.C */#include #include int main() FILE *fp; /* 定义文件指针定义文件指针 */ fp=fopen(test.txt,w); /* 以写方式打开文件以写方式打开文件test.txt */ if(fp=NULL) printf(file open error!n); exit(0); /* 终止程序运行,返回操作系统终止程序运行,返回操作系统0值值 */ else printf(fiel open OK!n); fclose(fp); /* 关闭文件关闭文件 */ return 0;出错检查出错检查 v文件在进行打开操作的时候,并不能保证文件在进

26、行打开操作的时候,并不能保证每次操作都会成功,操作也可能失败。每次操作都会成功,操作也可能失败。v如果需要的文件不存在或者发现其他错误,如果需要的文件不存在或者发现其他错误,那么那么fopen函数调用将返回指针值函数调用将返回指针值NULL,表示有错误发生。作为程序员,应该检查表示有错误发生。作为程序员,应该检查错误并且进行相应的错误报告。一般错误并且进行相应的错误报告。一般C系统系统都提供了库函数检测错误,主要错误检测都提供了库函数检测错误,主要错误检测函数如下:函数如下: 1错误报告函数的原型为:错误报告函数的原型为:void error(char *errorstring);2文件结束检

27、测错误函数的原型为:文件结束检测错误函数的原型为:int feof(FILE *stream);返回:到达文件尾时为非返回:到达文件尾时为非0,否则为,否则为03文件出错检测函数的原型为:文件出错检测函数的原型为:int ferror(FILE *stream);4清除文件错误标志函数的原型为:清除文件错误标志函数的原型为:void clearerr(FILE *stream);顺序文件的读写顺序文件的读写 v文件的顺序读写,是指文件被打开后,按文件的顺序读写,是指文件被打开后,按照数据流的先后顺序对文件进行读写操作。照数据流的先后顺序对文件进行读写操作。每读写一次后,文件指针自动指向下一个每

28、读写一次后,文件指针自动指向下一个读写位置。读写位置。v在语言中提供了多种文件读写的函数,在语言中提供了多种文件读写的函数,分别如下:分别如下:(1)字符读写函数:)字符读写函数:fgetc和和fputc。(2)字符串读写函数:)字符串读写函数:fgets和和fputs。(3)格式化读写函数:)格式化读写函数:fscanf和和fprintf。fgetc()与与fputc()函数函数vfgetc函数函数的功能是从指定的文件中读一个字符,的功能是从指定的文件中读一个字符,函数原型为:函数原型为:int fgetc(FILE *stream);返回:当读取正确时,返回所读取的字符;返回:当读取正确时

29、,返回所读取的字符; 当当读取错误时,返回读取错误时,返回-1(EOF)vfputc函数函数的功能是把一个字符写入指定的文件的功能是把一个字符写入指定的文件中,函数原型为:中,函数原型为:int fputc(char ch,FILE *stream);返回:若写入正常,则返回字符返回:若写入正常,则返回字符ch的的ASCII码码值,否则出错,返回值,否则出错,返回-1(EOF)32解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-3/* LI10_3.C */#include #includeint main() FILE *fp; char

30、ch,filename10; scanf(%s,filename); if (fp=fopen(filename, w)=NULL) /* 建立并打开新文件建立并打开新文件 */ printf(cannot open file!n); exit(0); /* 终止程序终止程序 */ ch=getchar(); /* 读读scanf的回车符的回车符 */ ch=getchar(); /* 输入第一个字符输入第一个字符 */ while(ch!= #) /* 如果输入如果输入#号则结束号则结束 */ fputc(ch,fp); /* 将将ch写入写入fp所指向的文件所指向的文件 */ putcha

31、r(ch); /* 将将ch在屏幕上输出,即写入在屏幕上输出,即写入stdin所指向的文件所指向的文件 */ ch=getchar(); fclose(fp); /* 关闭文件关闭文件 */ return 0;fgets()与与fputs()函数函数vfgets函数函数的功能是从的功能是从fp所指向的文件中读所指向的文件中读n-1个个字符,放到以字符,放到以string为起始地址的存储空间为起始地址的存储空间(string可以是数组名可以是数组名)。函数原型为:。函数原型为: char * fgets(char *string, int n, FILE *fp); 返回:若操作成功,则返回返回

32、:若操作成功,则返回string的首地址,否的首地址,否则出错,返回则出错,返回NULL。 vfputs函数函数的功能是将的功能是将string所表示的字符串内所表示的字符串内容容(不含最后的不含最后的0)输出到输出到fp所指向的文件中去。所指向的文件中去。函数原型为:函数原型为: int fputs(char *string, FILE *fp);返回:若操作成功,则返回一个非负数,否则出返回:若操作成功,则返回一个非负数,否则出错,返回错,返回-1(EOF)。)。34解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-4/* LI10_4.C

33、 */#include#includeint main() FILE *fp; char str11; if(fp=fopen(temp.txt,r)=NULL) /*以只读方式打开一个文件以只读方式打开一个文件*/ printf(Cannot open file strike any key exit!);exit(1); /* 打开不成功的处理方式打开不成功的处理方式 */ fgets(str,11,fp); /*打开文件成功,读取打开文件成功,读取10个字符,放在个字符,放在str串中串中*/ printf(%s,str); /*打印读取字符串打印读取字符串*/ fclose(fp);

34、/*操作完成,关闭文件操作完成,关闭文件*/ return 0;35解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-5/* LI10_5.C */#include#includeint main() FILE *fp; char ch,st20; if(fp=fopen(string.txt,a)=NULL) /* 以追加方式打开一个文件以追加方式打开一个文件 */ printf(Cannot open file strike any key exit!); exit(1); /* 打开不成功的处理方式打开不成功的处理方式 */ printf

35、(input a string:n); scanf(%s,st); /* 从键盘读入一个串从键盘读入一个串 */ fputs(st,fp); /* 将串写入文件中将串写入文件中 */ fclose(fp); if(fp=fopen(string.txt,r)=NULL) printf(Cannot open file strike any key exit!); exit(2); /* 打开不成功的处理方式打开不成功的处理方式 */ ch=fgetc(fp); /* 读取文件中的第一个字符读取文件中的第一个字符 */ while(ch!=EOF) /* 反复打印读出的字符,再读下一个字符反复打

36、印读出的字符,再读下一个字符 */ putchar(ch); ch=fgetc(fp); printf(n); fclose(fp); /* 操作完成,关闭文件操作完成,关闭文件 */ return 0;fscanf()与与fprintf()函数函数vfscanf函数、函数、fprintf函数与前面使用的函数与前面使用的scanf和和printf函数的功能相似,都是格函数的功能相似,都是格式化读写函数。式化读写函数。 v两者的区别在于两者的区别在于 fscanf函数和函数和fprintf函函数的读写对象不是键盘和显示器,而是数的读写对象不是键盘和显示器,而是磁磁盘文件盘文件。fscanf()函

37、数函数vfscanf函数函数的功能是按照的功能是按照format给出的控给出的控制符格式,把从制符格式,把从fp所指向的文件中读取的内所指向的文件中读取的内容,分别赋给变量容,分别赋给变量arg1,argn。函数原。函数原型为型为:int fscanf(FILE *fp, char *format, &arg1, , &argn)返回:若读取成功,则返回已读取数据的返回:若读取成功,则返回已读取数据的个数;若遇到文件结束,则返回个数;若遇到文件结束,则返回-1(EOF);); 若出错,则返回若出错,则返回0。printf()函数函数vfprintf函数函数的功能是按照的功能是按

38、照format给出的给出的控制符格式,将变量控制符格式,将变量arg1,argn的值的值写入到写入到fp所指向的文件中去所指向的文件中去 。函数原型为:。函数原型为:int fprintf(FILE *fp, char *format, arg1, , argn)返回:若写入成功,则返回实际写入数返回:若写入成功,则返回实际写入数据的个数;据的个数; 若出错,则返回负数。若出错,则返回负数。例例10-6v例例10-6 键盘输入两个学生数据,写入一键盘输入两个学生数据,写入一个文件中,个文件中, 再读出这两个学生的数据显示再读出这两个学生的数据显示在屏幕上。在屏幕上。/* LI10_6_1.C

39、*/#include#includestruct stu char name10; int num; int age; char addr15;boya2,boyb2,*pp,*qq; /*定义结构体定义结构体stu*/int main() FILE *fp; /*定义文件指针定义文件指针*/ char ch; int i; pp=boya; qq=boyb; if(fp=fopen(stu_list.dat,wb+)=NULL) /*以读写方式打开一个文件以读写方式打开一个文件*/ printf(Cannot open file strike any key exit!); exit(1);

40、 /*文件打开不成功的处理文件打开不成功的处理*/ printf(ninput datan);/*读入学生记录读入学生记录*/ for(i=0;iname,&pp-num,&pp-age,pp-addr); pp=boya; for(i=0;iname,pp-num,pp-age,pp-addr); fclose(fp);40解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-6程序程序 if(fp=fopen(stu_list.dat,rb)=NULL) /*以读写方式打开一个文件以读写方式打开一个文件*/ printf(Can

41、not open file strike any key exit!); exit(2); /*文件打开不成功的处理文件打开不成功的处理*/ for(i=0;iname,&qq-num,&qq-age,qq-addr); printf(nnnametnumber age addrn); qq=boyb; for(i=0;iname,qq-num, qq-age,qq-addr); fclose(fp); /*操作完成,关闭文件操作完成,关闭文件*/ return 0;举一反三举一反三v例例10-7 读入文件读入文件temp.c,在屏幕上输,在屏幕上输出。出。/* LI10_7.

42、C */#include#includeint main() FILE *fp; /*定义文件指针定义文件指针*/ char ch; if(fp=fopen(temp.c,r)=NULL) /* 以只读方式打开文件以只读方式打开文件 */ printf(Cannot open file strike any key exit!); exit(1); /* 文件打开不成功的处理文件打开不成功的处理 */ ch=fgetc(fp); /* 读文件的第一个字符读文件的第一个字符 */ while (ch!=EOF) /* 读文件没有到文件尾读文件没有到文件尾 */ putchar(ch); /* 输

43、出刚刚读入的字符输出刚刚读入的字符 */ ch=fgetc(fp); /* 读下一个字符读下一个字符 */ fclose(fp); /* 关闭文件关闭文件 */ return 0;42解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-8v例例10-8 从键盘输入一行字符,写入一个从键盘输入一行字符,写入一个文件文件strfile,再把该文件内容读出显示在,再把该文件内容读出显示在屏幕上。屏幕上。/* LI10_8.C */#include#includeint main() FILE *fp; /*定义文件指针定义文件指针*/ char ch;

44、 char *str; int n=0; if(fp=fopen(strfile,wb+)=NULL) /*以读写方式打开文件以读写方式打开文件*/ printf(Cannot open file strike any key exit!); exit(1);/*文件打开不成功的处理文件打开不成功的处理*/ printf(input a string:n); ch=getchar(); /*从键盘输入一个字符从键盘输入一个字符*/ while (ch!=n) n+; fputc(ch,fp); /*写字符到文件中写字符到文件中*/ ch=getchar(); /*读下一个字符读下一个字符*/

45、fclose(fp);43解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-8 str=(char *)malloc(n+2); /*动态内存分配动态内存分配*/ if(fp=fopen(strfile,rb)=NULL) /* 以读方式打开文件以读方式打开文件 */ printf(Cannot open file strike any key exit!); exit(2); /*文件打开不成功的处理文件打开不成功的处理*/ fgets(str,n+1,fp); printf(%sn,str); fclose(fp); /*关闭文件关闭文件*

46、/ free(str);/*释放内存释放内存*/ return 0;44解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20思考题思考题v如果要访问文件中的一部分,如果要访问文件中的一部分,如何实现呢?如何实现呢? 账号管理问题账号管理问题v前面介绍的对文件的读写方式都是顺序读前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写写,即读写文件只能从头开始,顺序读写各个数据。但在实际问题中常要求只读写各个数据。但在实际问题中常要求只读写文件中某一指定的部分。文件中某一指定的部分。v为了解决这个问题,可移动文件内部的位为了解决这个问题,可移

47、动文件内部的位置指针到需要读写的位置,再进行读写,置指针到需要读写的位置,再进行读写,这种读写称为随机读写。这种读写称为随机读写。例例10-9维护银行账号信息维护银行账号信息例例10-9 建立一个程序维护银行的账户信息。希望程序能够更新、建立一个程序维护银行的账户信息。希望程序能够更新、添加和删除账号,并且能够把所有当前账号清单存储在一个用添加和删除账号,并且能够把所有当前账号清单存储在一个用于打印的文本文件中。于打印的文本文件中。【分析分析】处理这个问题要求快速访问指定数据,这就需要建立具有固定长度的文件,处理这个问题要求快速访问指定数据,这就需要建立具有固定长度的文件,这样的文件一般称为这

48、样的文件一般称为随机存取文件随机存取文件,文件中的记录具有相同的结构,能够直,文件中的记录具有相同的结构,能够直接而且快速地访问。接而且快速地访问。访问的基本思路就是通过记录关键字的函数,计算每一条记录相对于文件起访问的基本思路就是通过记录关键字的函数,计算每一条记录相对于文件起始点的位置,然后直接访问指定的记录,达到快速访问的目的。始点的位置,然后直接访问指定的记录,达到快速访问的目的。随机文件是用于访问的事务处理系统,如航空订票系统、银行系统、销售系随机文件是用于访问的事务处理系统,如航空订票系统、银行系统、销售系统等。统等。随机文件的读写,是指在对文件进行读写操作时,可以对文件中指定位置

49、的随机文件的读写,是指在对文件进行读写操作时,可以对文件中指定位置的信息进行读写操作。实现随机读写的关键是要按要求移动位置指针,这样就信息进行读写操作。实现随机读写的关键是要按要求移动位置指针,这样就需要对文件进行详细定位。需要对文件进行详细定位。一般地,随机文件的读写适合具有固定长度记录的文件。一般地,随机文件的读写适合具有固定长度记录的文件。47解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-9 实现代码实现代码v具体程序源代码详见教材具体程序源代码详见教材P371-374v例例10-9程序实现了一个简单的借贷处理系统,通程序实现了一个简

50、单的借贷处理系统,通过修改(缺省时建立)过修改(缺省时建立)credit.dat文件来处理定长文件来处理定长账户记录,每一条记录由账号(用作记录关键字)、账户记录,每一条记录由账号(用作记录关键字)、姓名和借贷金额组成。程序采用随机文件读写实现了姓名和借贷金额组成。程序采用随机文件读写实现了更新、插入和删除一条记录,并能够以格式化文本形更新、插入和删除一条记录,并能够以格式化文本形式将所有的记录写入到式将所有的记录写入到account.txt中。中。v本例涉及到文件定位、文件块数据的读写等知识。本例涉及到文件定位、文件块数据的读写等知识。文件定位文件定位vC语言提供了一组用于随机读写的定位函语

51、言提供了一组用于随机读写的定位函数,其函数原型都在数,其函数原型都在stdio.h中。中。v采用随机读写,可以在不破坏其它数据的采用随机读写,可以在不破坏其它数据的情况下把数据插入到文件中去,也可以不情况下把数据插入到文件中去,也可以不重写整个文件而更新和删除以前存储的数重写整个文件而更新和删除以前存储的数据。据。v在结构体类型在结构体类型FILE中有一个文件定位指针中有一个文件定位指针(unsigned char *curp;),实现随),实现随机读写的关键是要按要求移动该位置指针,机读写的关键是要按要求移动该位置指针,这称为文件定位。这称为文件定位。 rewind()rewind()函数函

52、数v函数原型:函数原型: void rewindvoid rewind(FILE FILE * *fpfp););v功能:将功能:将fpfp所指向的文件的内部位置指针所指向的文件的内部位置指针置于文件开头,并清除文件结束标志和错置于文件开头,并清除文件结束标志和错误标志。误标志。fseekfseek()()函数函数v函数原型:函数原型: int fseek(FILE *fp,long offset,int base);); v功能:改变文件位置指针的位置,成功时返回功能:改变文件位置指针的位置,成功时返回0 0;失败时返回非失败时返回非0 0值(值(EOFEOF,-1-1)。)。 v其中:其中

53、: 文件指针文件指针fpfp:指向被移动的文件。:指向被移动的文件。 位移量位移量offsetoffset:表示以起始位置为基准移动的:表示以起始位置为基准移动的字节数。字节数。 起始点起始点basebase:表示从何处开始计算位移量,规:表示从何处开始计算位移量,规定的起始点有三种:文件首(定的起始点有三种:文件首(0-SEEK_SET0-SEEK_SET)、)、当前位置(当前位置(1-SEEK_CUR1-SEEK_CUR)和文件尾()和文件尾(2-2-SEEK_ENDSEEK_END)。)。 51解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20ft

54、ellftell()()函数函数v函数原型:函数原型: long ftell(FILE *fp);); v功能:得到功能:得到fpfp所指向的文件中的当前位置,所指向的文件中的当前位置,该位置用相对于文件头的位移量来表示。该位置用相对于文件头的位移量来表示。 v函数返回值:成功时返回当前读写的位置;函数返回值:成功时返回当前读写的位置;失败时返回失败时返回-1L-1L(EOFEOF)。)。随机文件的读写随机文件的读写v随机文件的读写可使用前面介绍的任一种随机文件的读写可使用前面介绍的任一种读写函数进行。由于一般是读写一个数据读写函数进行。由于一般是读写一个数据块,因此,常用数据块读写函数块,因

55、此,常用数据块读写函数fread和和fwrite。53解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20fread()函数函数v 函数原型:函数原型: int fread(void *buf,int size,int count,FILE *fp);其中:其中: buf:是一个指针,表示存放读入数据的首地址。:是一个指针,表示存放读入数据的首地址。 size:表示要读入的数据块的字节数。:表示要读入的数据块的字节数。 count:表示要读入的数据块的块数,即有:表示要读入的数据块的块数,即有count个个size字节的数字节的数据块。据块。 fp:表示文

56、件指针。:表示文件指针。 v 函数功能:从函数功能:从fp所指向的文件中读取所指向的文件中读取count个个size字节字节的数据块,放到由的数据块,放到由buf所指的内存地址中。所指的内存地址中。v 函数返回值:若读取成功,则返回函数返回值:若读取成功,则返回count的值,即读取的值,即读取数据块的完整个数,否则出错,返回数据块的完整个数,否则出错,返回-1(EOF)。读取)。读取成功时,实际读取的数据块可能小于代入的成功时,实际读取的数据块可能小于代入的count的值。的值。54解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20fwrite()函数

57、函数v 函数原型:函数原型: int fwrite(void *buf,int size,int count,FILE *fp);其中:其中: buf:是一个指针,表示存放写入数据的首地址。:是一个指针,表示存放写入数据的首地址。 size:表示要写入的数据块的字节数。:表示要写入的数据块的字节数。 count:表示要写入的数据块的块数,即有:表示要写入的数据块的块数,即有count个个size字节的数字节的数据块。据块。 fp:表示文件指针。:表示文件指针。 v 函数功能:将函数功能:将buf所指的内存地址中的所指的内存地址中的count个个size字字节的数据块写入节的数据块写入fp所指向

58、的文件中所指向的文件中 。v 函数返回值:若写入成功,则返回函数返回值:若写入成功,则返回count的值,即写入的值,即写入数据块的完整个数,否则出错,返回数据块的完整个数,否则出错,返回-1(EOF)。写入)。写入成功时,实际写入的数据块可能小于代入的成功时,实际写入的数据块可能小于代入的count的值。的值。55解析解析C程序设计第程序设计第10章章 文件处理程序设计文件处理程序设计2022-3-20例例10-10v例例10-10 从学生文件从学生文件stu_list.dat中读出第二中读出第二个学生的数据。个学生的数据。/* LI10_10.C */#include #include s

59、truct stu char name10; int num; int age; char addr15;boy,*qq; /*定义结构体变量定义结构体变量*/int main() FILE *fp; /*定义文件指针定义文件指针*/ char ch; int i=1; qq=&boy; if(fp=fopen(stu_list.dat,rb)=NULL) printf(Cannot open file strike any key exit!); exit(1); /*打开文件不成功的处理打开文件不成功的处理*/ rewind(fp); /*移动文件指针到文件首部移动文件指针到文件首

60、部*/ /*移动文件指针,跳过第一个结构体数据移动文件指针,跳过第一个结构体数据*/ fseek(fp,i*sizeof(struct stu),0); /*读第二个结构体数据读第二个结构体数据*/ fread(qq,sizeof(struct stu),1,fp); printf(nnnametnumber age addrn); printf(%st%5d %7d %sn,qq-name, qq-num,qq-age,qq-addr); fclose(fp); /*关闭文件关闭文件*/ return 0; 举一反三举一反三 v【例例7-11】从键盘输入若干行字符(每行从键盘输入若干行字符(每行长度不等),然后把它们存储到一磁盘文长度不等),然后把

温馨提示

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

评论

0/150

提交评论