《C语言程序设计与数据结构》课件第10章.ppt

上传人:wuy****n92 文档编号:80477221 上传时间:2023-03-23 格式:PPT 页数:43 大小:942.50KB
返回 下载 相关 举报
《C语言程序设计与数据结构》课件第10章.ppt_第1页
第1页 / 共43页
《C语言程序设计与数据结构》课件第10章.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《《C语言程序设计与数据结构》课件第10章.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计与数据结构》课件第10章.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第1010章章 文件读写文件读写C语言程序设计与数据结构教学提示:教学提示:存储在变量和数组(即内存)中的数据存储在变量和数组(即内存)中的数据是临时的,这些数据在程序运行结束后会消失,而是临时的,这些数据在程序运行结束后会消失,而文件可以用来永久地保存大量的数据。如果有些数文件可以用来永久地保存大量的数据。如果有些数据需要反复使用或永久保存,应该考虑使用文件来据需要反复使用或永久保存,应该考虑使用文件来完成。完成。教学要求:教学要求:本章要掌握本章要掌握文件在读写之前必须打开,文件在读写之前必须打开,读写结束必须关闭。文件可按只读、只写、读写、读写结束必须关闭。文件可按只读、只写、读写、追

2、加四种操作方式打开,同时还必须指定文件的类追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件。文件可按字节,字型是二进制文件还是文本文件。文件可按字节,字符串,数据块为单位读写,文件也可按指定的格式符串,数据块为单位读写,文件也可按指定的格式进行读写。文件内部的位置指针可指示当前的读写进行读写。文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写。位置,移动该指针可以对文件实现随机读写。C语言程序设计与数据结构10.1文件概述与文件指针 所谓所谓“文件文件”是指一组相关数据的有序集合。是指一组相关数据的有序集合。我们在前几章中已多次接触使用过文件,例如我

3、们在前几章中已多次接触使用过文件,例如源程序文件、目标文件、可执行文件、库文件源程序文件、目标文件、可执行文件、库文件(头头文件文件)等。等。C语言程序设计与数据结构10.1.1 文件分类文文件件通通常常是是驻驻留留在在外外部部介介质质(如如磁磁盘盘等等)上上的的,在在使使用用时时才才调调入入内内存存中中来来。C语语言言把把文文件件看看作作是是由由一一个个个个字字符符(字字节节)的的数数据据顺顺序序组组成成的的。它它把把数数据据看看作作是是连连续续的的字字符符(字字节节)流流,这这样样它它对对文文件件的的存存取取实实际际上上是是以以字字符符(字字节节)为为单单位位的的。输输入入输输出出的的数数

4、据据流流的的开开始始和和结结束束只只受受程程序序的的控控制制而而不不受受特特定定符符号号(比比如如回回车车换换行行符符)的的控控制制。也也就就是是说说,C语语言言在在输输出出数数据据到到文文件件中中时时,并并不不会会自自动动增增加加回回车车换换行行符符以以示示结结束束,在在输输入入时时也也不不会会以以读读入入回回车车换换行行符符作作为为数据的间隔。数据的间隔。C语言程序设计与数据结构10.1.1 10.1.1 文件分类文件分类从从用用户户的的角角度度看看,文文件件可可分分为为普普通通文文件件和和设设备备文文件件两种。两种。根根据据文文件件的的存存储储形形式式,可可分分为为ASCII码码文文件件

5、和和二二进进制文件两种:制文件两种:(1)ASCII文文件件也也称称为为文文本本文文件件,这这种种文文件件在在磁磁盘盘中中存存放放时时每每个个字字符符对对应应一一个个字字节节,用用于于存存放放对对应应的的ASCII码码。例例如如一一个个整整型型数数据据1234在在文文本本文文件件中中占占4个个字字节节。我我们们用用Windows自自带带的的记记事事本本软软件件打打开开该类型文件能读懂文件中的内容。该类型文件能读懂文件中的内容。(2)(2)二进制文件是按二进制的编码方式来存放文件二进制文件是按二进制的编码方式来存放文件的。例如一个整型数据的。例如一个整型数据230在二进制文件中占在二进制文件中占

6、2个字个字节。节。C语言程序设计与数据结构10.1.2 文件类型指针 在在语语言言中中要要使使用用文文件件,必必须须用用一一个个指指针针变变量量指指向向一一个个文文件件,这这个个指指针针称称为为文文件件指指针针。通通过过文文件件指指针针就就可可对对它它所所指的文件进行各种操作。指的文件进行各种操作。定义文件指针的一般形式为:定义文件指针的一般形式为:FILE*指针变量标识符;指针变量标识符;其其中中FILE必必须须为为大大写写,它它是是在在头头文文件件stdio.h中中定定义义的的一一个个结结构构体体,该该结结构构体体中中含含有有文文件件名名、文文件件状状态态和和文文件件当当前前位置等信息,我

7、们编程时不必关心位置等信息,我们编程时不必关心FILE结构的细节。结构的细节。例例如如:FILE*fp;表表示示定定义义了了一一个个名名为为fp的的文文件件指指针针。如如果果变变量量fp已已被被正正确确赋赋值值,则则可可以以根根据据结结构构变变量量fp所所提提供供的的信信息息找找到到一一个个文文件件并并实实施施对对该该文文件件的的操操作作。习习惯惯上上把把fp称称为为指向一个文件的指针。指向一个文件的指针。C语言程序设计与数据结构10.2文件的打开与关闭 使使用用文文件件必必须须遵遵循循“先先打打开开,再再对对文文件件进进行行读读写操作,最后关闭文件写操作,最后关闭文件”的原则。的原则。在在语

8、语言言中中,对对文文件件的的这这些些操操作作都都可可以以由由库库函函数数来来完完成成,对对用用到到的的库库函函数数的的声声明明包包含含在在文文件件stdio.h中中,因因此此在在编编程程中中要要操操作作文文件件时时,要要使使用用头头文件包含命令文件包含命令#include“stdio.h”。C语言程序设计与数据结构10.2.1文件的打开 所所谓谓打打开开文文件件,实实际际上上是是获获得得文文件件的的各各种种有有关关信信息息,并并使使文文件件指指针针指指向向该该文文件件,以以便便进进行行下下一一步步操操作。作。C语言提供了函数语言提供了函数fopen来打开文件。来打开文件。其使用格式为:其使用格

9、式为:文件指针名文件指针名=fopen(文件名文件名,使用文件方式使用文件方式);其中,其中,“文件指针名文件指针名”必须是已被说明为必须是已被说明为FILE类类型的指针变量;型的指针变量;“文件名文件名”是将被打开的文件的文是将被打开的文件的文件名,通常是字符串常量或字符串数组(注意路径件名,通常是字符串常量或字符串数组(注意路径的分隔符应使用的分隔符应使用“”););“使用文件方式使用文件方式”是指是指文件的类型和操作要求,是一个由一对双引号括起文件的类型和操作要求,是一个由一对双引号括起来的字符串,共有来的字符串,共有12种种,具体的符号表示和含义见具体的符号表示和含义见表表10-1。C

10、语言程序设计与数据结构文件使用方式文件使用方式含义含义“rt”打开一个已经存在的文本文件,只能读取数据“wt”打开一个文本文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原有内容,并接受写入的数据(覆盖)“a”打开一个已经存在的文本文件,只能写入数据并且追加在文件的尾部“r+”打开一个已经存在的文本文件,可以读取数据,也可以写入数据“w+”打开一个文本文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原有内容,并接受写入的数据(覆盖)“a+”打开一个已经存在的文本文件,可以读取数据,也可以

11、写入数据(追加在文件的尾部)“rb”打开一个已经存在的二进制文件,只能读取数据“wb”打开一个二进制文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原有内容并接受写入的数据(覆盖)“ab”打开一个已经存在的二进制文件,只能写入数据(追加在文件的尾部)“rb+”打开一个已经存在的二进制文件,可以读取数据,也可以写入数据“wb+”打开一个二进制文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原有内容,并接受写入的数据(覆盖)“ab+”打开一个已经存在的二进制文件,可以读取数据,也可以写入数据

12、(追加在文件的尾部)C语言程序设计与数据结构fopen打开文件 例如:例如:FILE*fpTa;fpTa=fopen(c:cprogramabc,rb);/*反斜线反斜线“”中的第一个表示转义字符中的第一个表示转义字符*/其其意意义义是是打打开开C驱驱动动器器磁磁盘盘的的cprogram子子目目录录下下的的文文件件abc,这这是是一一个个二二进进制制文文件件,只只允允许许按按二二进进制制方式进行读操作。方式进行读操作。又如:又如:FILE*fp;fp=fopen(mytest1.txt,r);其意义是在当前目录下打开文件其意义是在当前目录下打开文件mytest1.txt,只允只允许进行许进行“

13、读读”操作,并使操作,并使fp指向该文件。指向该文件。C语言程序设计与数据结构10.2.2文件关闭函数 在在使使用用完完一一个个文文件件以以后后,应应该该将将该该文文件件关关闭闭,以以防防止止它它再再被被调调用用或或丢丢失失数数据据。“关关闭闭”就就是是使使文文件件指指针针变变量量不不再再指指向向该该文文件件,也也就就是是文文件件指指针针变变量量与与该该文文件件“断断开开”,此此后后不不能能通通过过该该指指针针对对原原来来与与其其相相联联系系的的文文件件进进行行读读、写写操操作作(除除非非再再次次打打开开该该文文件件,使文件指针变量重新指向该文件)。使文件指针变量重新指向该文件)。fclose

14、()函函数数用用来来关关闭闭一一个个已已经经由由fopen()函函数数打打开开的的文文件件,正正常常完完成成关关闭闭文文件件操操作作时时,fclose函函数数返返回值为回值为0,有错误发生则返回非零值。,有错误发生则返回非零值。其调用的一般形式为:其调用的一般形式为:fclose(文件指针文件指针);例如:例如:fclose(fp);C语言程序设计与数据结构10.3 文件位置指针的有关函数 在在文文件件内内部部有有一一个个位位置置指指针针,用用来来指指向向文文件件的的当当前前读读写写字字节节。在在文文件件打打开开时时,该该位位置置指指针针总总是是指指向向文文件件的的第第一一个个字字节节。使使用

15、用下下面面章章节节介介绍绍的的fgetc等等函函数对文件进行读写后,该位置指针将自动向后移动。数对文件进行读写后,该位置指针将自动向后移动。但文件指针和文件内部的位置指针不是一回事。但文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均自动向后移动,它不需在程每读写一次,该指针均自动向后移动,它不需在程序中定义说明,而是由

16、系统自动设置的。序中定义说明,而是由系统自动设置的。C语言程序设计与数据结构顺序读写和随机读写文件的读写方式分为顺序读写和随机读写。文件的读写方式分为顺序读写和随机读写。(1)(1)顺顺序序读读写写即即读读写写文文件件只只能能从从头头开开始始,顺顺序序读读写写各各个个数数据据。但但在在实实际际问问题题中中常常要要求求只只读读写写文文件件中中某某一一指指定定的的部部分分,为为了了解解决决这这个个问问题题可可移移动动文文件件内内部部的的位位置置指指针针到到需需要要读读写写的的位置,再进行读写,这种读写称为随机读写。位置,再进行读写,这种读写称为随机读写。(2)(2)随机读写可以通过利用系统函数去主

17、动移动文件内部随机读写可以通过利用系统函数去主动移动文件内部的位置指针来实现。这样的函数主要有两个,即的位置指针来实现。这样的函数主要有两个,即rewind函函数和数和fseek函数。实现随机读写的关键是要按要求移动位置函数。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。指针,这称为文件的定位。在移动位置指针之后,即可用在移动位置指针之后,即可用后面介绍的任一种读写函数进行读写。由于一般是读写一后面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用个数据据块,因此常用fread和和fwrite函数。函数。C语言程序设计与数据结构rewind函数rewind函函数数

18、的的功功能能是是把把文文件件内内部部的的位位置置指指针针移移到到文文件首。其调用形式为:件首。其调用形式为:rewind(文件指针文件指针);“文件指针文件指针”指向被移动的文件。指向被移动的文件。C语言程序设计与数据结构fseek函数fseek函函数数用用来来移移动动文文件件内内部部位位置置指指针针,其其调调用用形形式式为:为:fseek(文件指针文件指针,位移量位移量,起始点起始点);其中:其中:“文件指针文件指针”指向被移动的文件。指向被移动的文件。“位位移移量量”表表示示移移动动的的字字节节数数,要要求求位位移移量量是是long型型数数据据,以以便便在在文文件件长长度度大大于于64KB

19、时时不不会会出出错。当用常量表示位移量时,要求加后缀错。当用常量表示位移量时,要求加后缀“L”。“起始点起始点”表示从何处开始计算位移量,规定的表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。起始点有三种:文件首,当前位置和文件尾。C语言程序设计与数据结构起始点起始点表示符号表示符号数字表示数字表示文件首文件首SEEK_SET0当前位置当前位置SEEK_CUR1文件末尾文件末尾SEEK_END2C语言程序设计与数据结构例如:例如:fseek(fp,100L,0);/*将将文文件件位位置置指指针针移移到到离离文文件头件头100个字节处个字节处*/fseek(fp,20L,

20、1);/*将将文文件件位位置置指指针针从从当当前前位位置置后移后移20个字节的位置个字节的位置*/fseek(fp,-10L,SEEK_END);/*将将文文件件位位置置指指针针从从文文件末尾前移件末尾前移10个字节的位置个字节的位置*/注意:注意:fseek函数一般用于二进制文件。在文本文函数一般用于二进制文件。在文本文件中由于要进行转换,往往计算的位置会出现错误。件中由于要进行转换,往往计算的位置会出现错误。C语言程序设计与数据结构ftell函函数数:用用来来得得到到流流式式文文件件中中的的当当前前位位置置,用用相相对对于于文文件件开开头头的的位位移移量量来来表表示示。如如返返回回-1L则

21、则表表示出错。示出错。例如:例如:longa;a=ftell(fp);文件结束检测函数文件结束检测函数feof函函数数feof()判判断断文文件件是是否否处处于于文文件件结结束束位位置置,如如文文件结束,则返回值为件结束,则返回值为1,否则为,否则为0。其调用格式为:其调用格式为:feof(文件指针文件指针);说明:说明:文件结束标志文件结束标志EOF(每个文件末有一结束标每个文件末有一结束标志志EOF,值为值为-1)只适用于判断文本文件是否结束。只适用于判断文本文件是否结束。而函数而函数feof()则对文本文件和二进制文件都适用。则对文本文件和二进制文件都适用。C语言程序设计与数据结构10.

22、4读写文件 10.4.1字符读写函数字符读写函数fgetc和和fputc 是以字符是以字符(字节字节)为单位的读写函数。每次可从文件读出或为单位的读写函数。每次可从文件读出或向文件写入一个字符。字符输入向文件写入一个字符。字符输入/出函数所处理的文件可以出函数所处理的文件可以是文本文件,也可以是二进制文件。是文本文件,也可以是二进制文件。10.4.2字符串读写函数字符串读写函数fgets和和fputs 处理的文件一般是文本文件,读写的数据以字符串为单位。处理的文件一般是文本文件,读写的数据以字符串为单位。10.4.3数据块读写函数数据块读写函数fread和和fwtrite 用用于于整整块块数数

23、据据的的读读写写函函数数。可可用用来来读读写写一一组组数数据据,如如一一个数组、一个结构变量的值等。个数组、一个结构变量的值等。10.4.4格式化读写函数格式化读写函数fscanf和和fprintf 与前面使用的与前面使用的scanf和和printf函数的功能相似,都是格式函数的功能相似,都是格式化读写函数。两者的区别在于化读写函数。两者的区别在于fscanf函数和函数和fprintf函数的读函数的读写对象不是键盘和显示器,而是磁盘文件。写对象不是键盘和显示器,而是磁盘文件。C语言程序设计与数据结构读字符函数fgetcfgetc函函数数的的功功能能是是从从指指定定的的文文件件中中读读取取一一个

24、个字字符符,函函数数调调用用的一般形式为:的一般形式为:字符变量字符变量=fgetc(文件指针文件指针);例例如如:ch=fgetc(fp);其其意意义义是是从从打打开开的的文文件件fp中中读读取取一一个个字字符符并送入字符变量并送入字符变量ch中。中。对于对于fgetc函数的使用有以下几点说明:函数的使用有以下几点说明:(1)在在fgetc函函数数调调用用中中,读读取取的的文文件件必必须须是是以以读读或或读读写写方方式式打打开的。开的。(2)读读取取字字符符的的结结果果也也可可以以不不向向字字符符变变量量赋赋值值,例例如如fgetc(fp);但是读出的字符不能保存。但是读出的字符不能保存。(

25、3)文件内部的位置指针在文件打开时总是指向文件的第一文件内部的位置指针在文件打开时总是指向文件的第一个字节。使用个字节。使用fgetc函数后,该位置指针将向后移动一个字函数后,该位置指针将向后移动一个字节。因此可连续多次使用节。因此可连续多次使用fgetc函数来读取多个字符。函数来读取多个字符。C语言程序设计与数据结构【例【例10.1】将】将C盘根目录下的文本文件盘根目录下的文本文件test1.txt的内容在屏幕上输出。的内容在屏幕上输出。#includemain()FILE*fp;/*定义了文件指针定义了文件指针fp*/charch;if(fp=fopen(c:test1.txt,r)=NU

26、LL)/*以读文本文件方式打开并使以读文本文件方式打开并使fp指向该文件指向该文件*/printf(nCannotopenfile,strikeanykeytoexit!);getchar();exit(1);ch=fgetc(fp);/*先读出一个字符,然后进入循环先读出一个字符,然后进入循环*/while(ch!=EOF)/*判断文件是否结束判断文件是否结束*/putchar(ch);/*把该字符显示在屏幕上把该字符显示在屏幕上*/ch=fgetc(fp);/*再读入下一字符再读入下一字符*/fclose(fp);printf(“n”);本例程序的功能是从文件中逐个读取字符,并在屏幕上显示

27、。如打开文件出错,给出提示并退出程序。只本例程序的功能是从文件中逐个读取字符,并在屏幕上显示。如打开文件出错,给出提示并退出程序。只要读出的字符不是文件结束标志要读出的字符不是文件结束标志EOF,就把该字符显示在屏幕上,再读入下一字符。每读一次,文件就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示文件执行本程序将显示文件c:test1.txt的所有内容。的所有内容。C语言程序设计与数据结构写字符函数fputc()fputc函函数数的的功功能能是是把把一一个个

28、字字符符写写入入指指定定的的文文件件中中,如如写写入入成成功功则则返返回回写写入入的的字字符符,否否则则返返回回一一个个EOF,可用此来判断写入是否成功。可用此来判断写入是否成功。函数调用形式为:函数调用形式为:fputc(字符量,文件指针字符量,文件指针);/*字符量是待写入的字符常量或变量字符量是待写入的字符常量或变量*/例例如如:fputc(x,fp);其其意意义义是是把把字字符符x写写入入fp所所指指向向的的文文件件的的位位置置指指针针的的当当前前位位置置中中。每每写写入入一一个字符,文件内部位置指针向后移动一个字节。个字符,文件内部位置指针向后移动一个字节。被写入的文件可以用写、读写

29、、追加方式打开。被写入的文件可以用写、读写、追加方式打开。C语言程序设计与数据结构【例【例10.2】将从键盘上输入的一些字符(以将从键盘上输入的一些字符(以“*”作为结束)写入作为结束)写入c盘根目录下盘根目录下名为名为test2.txt的文本文件中。的文本文件中。#includestdio.hmain()FILE*p;charch;if(p=fopen(c:test2.txt,w)=NULL)printf(Filecannotopen!n);exit(0);printf(Pleaseinput,endinputwith*character:);while(ch=getchar()!=*)fp

30、utc(ch,p);fclose(p);printf(Writeover!n);程序运行结束后,可以在程序运行结束后,可以在c盘根目录下打开盘根目录下打开test2.txt查看其内容。查看其内容。思考一下,如果在写入完毕后想马上把刚才输入的内容打印在屏幕上该如何实现?思考一下,如果在写入完毕后想马上把刚才输入的内容打印在屏幕上该如何实现?C语言程序设计与数据结构字符串输入/出函数 字字符符串串输输入入/出出函函数数所所处处理理的的文文件件一一般般是是文文本本文文件件,读读写写的的数据以字符串为单位。数据以字符串为单位。1.读字符串函数读字符串函数fgets功能是从指定的文件中读一个字符串到字符

31、数组中功能是从指定的文件中读一个字符串到字符数组中.函数调用的形式为:函数调用的形式为:fgets(字符数组名字符数组名,n,文件指针文件指针);其其中中n是是一一个个正正整整数数。该该函函数数表表示示从从文文件件中中读读出出n-1个个字字符符(如如在在读读满满n-1个个字字符符之之前前就就遇遇到到了了换换行行符符或或EOF,则则读读出出提提前前结结束束),并并在在读读取取的的最最后后一一个个字字符符后后加加上上串串结结束束标标志志0。fgets函函数数的的返返回回值值是是字字符符数数组组的的首首地地址址。读读取取字字符符串串后文件位置指针也自动后移若干个位置。后文件位置指针也自动后移若干个位

32、置。例如:例如:fgets(str,n,fp);意义是从意义是从fp所指的文件中读出所指的文件中读出n-1个字符送入字符数组个字符送入字符数组str中。中。C语言程序设计与数据结构【例【例10.3】从】从test2.txt文件中读入文件中读入8个字符组成一个字符串。个字符组成一个字符串。#includemain()FILE*fp;chararr20;if(fp=fopen(c:test2.txt,r)=NULL)printf(nCannotopenfile,strikeanykeyexit!);getchar();exit(1);fgets(arr,9,fp);printf(n%sn,arr)

33、;fclose(fp);本例定义了一个字符数组本例定义了一个字符数组str共共20个字节,在以读文本文件方式打开文件个字节,在以读文本文件方式打开文件string后,从中读出后,从中读出8个字符送入个字符送入str数组,在第数组,在第9个数组元素个数组元素str8内加上内加上0,然后,然后在屏幕上显示输出在屏幕上显示输出str数组存放的字符串。输出的八个字符正是例数组存放的字符串。输出的八个字符正是例10.2的前八的前八个字符。个字符。C语言程序设计与数据结构2.写字符串函数写字符串函数fputsfputs函函数数的的功功能能是是向向指指定定的的文文件件写写入入一一个个字字符符串串(不不写写入

34、入字字符符串串结结束束标标记记0),当当成成功功写写入入一一个个字字符符串串后后,文文件件的的位位置置指指针针会会自自动动后后移移,函函数数返返回回值为值为0;否则,返回;否则,返回EOF(符号常量,其值为符号常量,其值为-1)。)。其调用形式为:其调用形式为:fputs(字符串字符串,文件指针文件指针);其其中中字字符符串串可可以以是是字字符符串串常常量量,也也可可以以是是字字符符数数组组名名或指针变量。或指针变量。例如:例如:fputs(“a1b2”,fp)是把字符串是把字符串“a1b2”写入写入fp所指的文件之中。所指的文件之中。C语言程序设计与数据结构【例【例10.4】在文件】在文件t

35、est2.txt中追加一个不超过中追加一个不超过20个字符的字符串。个字符的字符串。#includemain()FILE*fp;charch,st21;intcount;if(fp=fopen(c:test2.txt,a+)=NULL)printf(Cannotopenfilestrikeanykeyexit!);getchar();exit(1);printf(inputastring:n);gets(st);/*输入不超过输入不超过20个字符的字符串暂放入数组个字符的字符串暂放入数组st中中*/fputs(st,fp);rewind(fp);/*文件内部位置指针移到文件的开始位置文件内部位

36、置指针移到文件的开始位置*/printf(“nAllofthisfileis:n”);ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);printf(n);fclose(fp);本本例例要要求求在在test2.txt文文件件末末添添加加一一个个字字符符串串,因因此此,在在程程序序第第7行行以以追追加加读读写写文文本本文文件件的的方方式式打打开开文文件件test2.txt。然然后后输输入入字字符符串串暂暂放放入入数数组组st中中,并并用用fputs函函数数把把该该串串写写入入文文件件test2.txt。后后在在程程序序中中用用rewind函函

37、数数把把文文件件内内部部位位置置指指针针移移到到文文件件首首,再进入循环逐个显示当前文件中的全部内容。要注意用再进入循环逐个显示当前文件中的全部内容。要注意用scanf(“%s”,st)和和gets(st)输入字符串时的不同。输入字符串时的不同。思考:如果不用思考:如果不用EOF,而是用而是用feof()来判断文件结束,上述阴影部分程序该如何改写?来判断文件结束,上述阴影部分程序该如何改写?C语言程序设计与数据结构数据块读写函数fread和fwtrite 语语言言还还提提供供了了用用于于整整块块数数据据的的读读写写函函数数。可可用用来来读读写写一组数据,如一个数组、一个结构变量的值等。一组数据

38、,如一个数组、一个结构变量的值等。读读数数据据块块函函数数调调用用的的一一般般形形式式为为:fread(buffer,size,count,fp);写写数数据据块块函函数数调调用用的的一一般般形形式式为为:fwrite(buffer,size,count,fp);其中:其中:size表示每个数据块的字节数。表示每个数据块的字节数。count表示要读写的数据块块数。表示要读写的数据块块数。fp表示文件指针。表示文件指针。buffer是一个指针。是一个指针。C语言程序设计与数据结构fread(buffer,size,count,fp)的的功功能能是是从从fp所所指指向向文文件件的的位位置置指指针针

39、的的当当前前位位置置读读取取count块块数数据据(每每个个数数据据所所占占的的字字节节数数为为size),共共组组成成count块块长长度度为为size的的数数据据存存入入butter所所指指定定的的内内存存空空间间中中,当当正正确确的的读读取取了了count块块数数据据后后,文文件件内内部部指指针针会会自自动动后后移移count*size个个字字节节的的位位置置,若若数数据据存存入入正正确确,则则返返回回count值值,否否则则返返回回NULL(符符号号常常量量,其其值值为为0)。)。例例如如:fread(fa,4,5,fp);其其意意义义是是从从fp所所指指的的文文件件中中,每每次次读读

40、4个个字字节节(一一个个实实数数)送送入入实实型型数数组组fa中中,连连续续读读5次次,即即读读5个实数到个实数到fa中。中。fwrite(buffer,size,count,fp)表表示示将将从从buffer起起始始地地址址的的count块块数数据据(每每块块数数据据的的字字节节数数为为size)写写入入到到fp所所指指向向的的文文件件中中,当当正正确确的的写写入入count块块数数据据后后,文文件件位位置置指指针针会会自自动动后后移移count*size个个字字节节的的位位置置。若若数数据据写写入入正正确确,则则返返回回count值;否则返回值;否则返回NULL(符号常量,其值为符号常量,

41、其值为0)。)。C语言程序设计与数据结构【例例10.5】从从键键盘盘上上输输入入10个个整整数数,并并把把这这些些整整数数写写入入c:盘盘根根目目录录下下名名为为test3.dat的二进制文件中。的二进制文件中。#includestdio.hmain()FILE*fp;intdata10,i;if(fp=fopen(c:test3.dat,wb)=NULL)printf(Filecannotopen!n);exit(0);printf(“Inputtenintegers:”);for(i=0;i10;i+)scanf(%d,&datai);fwrite(data,sizeof(int),10,

42、fp);fclose(fp);printf(“Writeover!n”);C语言程序设计与数据结构【例例10.6】从从c:盘盘根根目目录录下下名名为为test3.dat的的二二进进制制文文件件中中读读取取10个个整整数数,要要求求先先读读取取第第610个整数,再读取第个整数,再读取第15个整数。并把它们输出到屏幕上显示。个整数。并把它们输出到屏幕上显示。#includestdio.hmain()FILE*fp;intdata10,i;if(fp=fopen(c:test3.dat,rb)=NULL)printf(Filecannotopen!n);exit(0);fseek(fp,5L*siz

43、eof(int),0);/*先把文件位置指针后移先把文件位置指针后移*/fread(data,sizeof(int),5,fp);/*先读取第先读取第610个整数放入个整数放入data0data4*/rewind(fp);/*把文件位置指针移到文件开始把文件位置指针移到文件开始*/fread(data+5,sizeof(int),5,fp);/*再读取第再读取第15个整数放入个整数放入data5data9*/fclose(fp);for(i=0;i10;i+)printf(%5d,datai);C语言程序设计与数据结构【例例10.7】从从键键盘盘输输入入三三个个学学生生数数据据,写写入入一一个

44、个文文件件中中,再再读读出出这这两两个个学学生生的的数数据据显显示示在在屏屏幕上。幕上。#includestructstucharname20;intnum;intage;charaddr30;boya3,boyb3,*pp,*qq;main()FILE*fp;inti;pp=boya;qq=boyb;if(fp=fopen(c:studata,wb+)=NULL)printf(Cannotopenfilestrikeanykeyexit!);getchar();exit(1);C语言程序设计与数据结构for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya

45、;fwrite(pp,sizeof(structstu),3,fp);rewind(fp);fread(qq,sizeof(structstu),3,fp);fclose(fp);printf(nnnametnumberageaddrn);for(i=0;iname,qq-num,qq-age,qq-addr);本例程序定义了一个结构本例程序定义了一个结构stu,说明了两个结构数组说明了两个结构数组boya和和boyb以及两个结构指针以及两个结构指针变量变量pp和和qq。pp指向指向boya,qq指向指向boyb。程序首先以读写方式打开二进制文程序首先以读写方式打开二进制文件件“studata

46、”,输入三个学生数据之后,写入该文件中。然后把文件内部位置输入三个学生数据之后,写入该文件中。然后把文件内部位置指针移到文件首,读出三块学生数据后,在屏幕上显示。指针移到文件首,读出三块学生数据后,在屏幕上显示。C语言程序设计与数据结构格式化读写函数fscanf和fprintffscanf函函 数数,fprintf函函 数数 与与 前前 面面 使使 用用 的的 scanf和和printf函函数数的的功功能能相相似似,都都是是格格式式化化读读写写函函数数。两两者者的的区区别别在在于于fscanf函函数数和和fprintf函函数数的的读读写写对对象象不不是是键键盘盘和和显显示示器器,而而是是磁磁盘

47、盘文文件件。这这两两个个函函数数的的调用格式为:调用格式为:fscanf(文件指针文件指针,格式字符串格式字符串,输入表列输入表列);fprintf(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);例如:例如:fscanf(fp,%d%s,&i,s);fprintf(fp,%d%c,j,ch);用用fscanf和和fprintf函数也可以完成例函数也可以完成例10.7的问题。的问题。修改后的程序如例修改后的程序如例10.8所示。所示。C语言程序设计与数据结构【例【例10.8】用】用fscanf和和fprintf函数解决例函数解决例10.7的问题。的问题。#includestruct

48、stucharname20;intnum;intage;charaddr30;boya3,boyb3,*pp,*qq;main()FILE*fp;inti;pp=boya;qq=boyb;if(fp=fopen(c:studata,wb+)=NULL)printf(Cantopenfilestrikeanykeyexit!);getch();exit(1);C语言程序设计与数据结构printf(ninputdatan);for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya;for(i=0;iname,pp-num,pp-age,pp-addr);rewi

49、nd(fp);for(i=0;iname,&qq-num,&qq-age,qq-addr);printf(nnnametnumberageaddrn);qq=boyb;for(i=0;iname,qq-num,qq-age,qq-addr);fclose(fp);本程序中本程序中fscanf和和fprintf函数每次只能读写一个结构体数组元素,因此采用函数每次只能读写一个结构体数组元素,因此采用了循环语句来读写全部数组元素。了循环语句来读写全部数组元素。还要注意指针变量还要注意指针变量pp,qq。由于循环改变了由于循环改变了它们的值,因此在程序中分别对它们重新赋予了数组的首地址。它们的值,因此

50、在程序中分别对它们重新赋予了数组的首地址。C语言程序设计与数据结构【例例10.9】把把命命令令行行参参数数中中的的前前一一个个文文件件名名标标识识的的文文件件,复复制制到到后后一一个个文文件件名名标标识识的的文文件件中中,如命令行中只有一个文件名则把该文件写到标准输出文件如命令行中只有一个文件名则把该文件写到标准输出文件(显示器显示器)中。中。#includemain(intargc,char*argv)FILE*fp1,*fp2;charch;if(argc=1)/*如命令行参数中没有给出文件名,则给出提示信息如命令行参数中没有给出文件名,则给出提示信息*/printf(Havenotent

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁