《C语言文件操作文件》由会员分享,可在线阅读,更多相关《C语言文件操作文件(58页珍藏版)》请在金锄头文库上搜索。
1、第第11章章文文 件件11.1 11.1 文件的基本概念文件的基本概念11.3 11.3 文件的顺序读写文件的顺序读写11.4 11.4 文件的随机读写文件的随机读写11.2 11.2 文件的打开与关闭文件的打开与关闭11.5 11.5 文件检测文件检测11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件【本章要点】【本章要点】文件在计算机领域中是一个重要概念,其实质是存储在文件在计算机领域中是一个重要概念,其实质是存储在计算机外存上的一组相关信息的集合。文件的名字计算机外存上的一组相关信息的集合。文件的名字是唯一的,并且作为其本身的操作标
2、志。与任何程是唯一的,并且作为其本身的操作标志。与任何程序设计语言一样,序设计语言一样,C语言也提供了强大的机制来支持语言也提供了强大的机制来支持对文件的各类操作。本章内容围绕着二进制文件与对文件的各类操作。本章内容围绕着二进制文件与文本文件的操作展开,具体阐述了对它们的基本操文本文件的操作展开,具体阐述了对它们的基本操作方法,对文件的读出与写入,以及对文件的错误作方法,对文件的读出与写入,以及对文件的错误检测等做作初步介绍。检测等做作初步介绍。 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.1.1文件的概念文件的概念 文件(文件(File):存放在外部介质(如计算机硬盘
3、、软件、:存放在外部介质(如计算机硬盘、软件、光盘、优盘等)上的一组完整信息的集合。这些信光盘、优盘等)上的一组完整信息的集合。这些信息可为各国文字、图形、图像、电影、音乐、电子息可为各国文字、图形、图像、电影、音乐、电子小说,甚至包括病毒程序等。小说,甚至包括病毒程序等。11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.1.2文件名称文件名称文件名:是引用文件的唯一的标识符。文件名包括三个要素:v文件路径,文件路径,是指文件在外部存储器设置中的位置,是指文件在外部存储器设置中的位置,路径一般以分隔符路径一般以分隔符“”来体现存储位置的嵌套
4、层次;如来体现存储位置的嵌套层次;如D:ProgramTCExample。 v文件主名,文件主名,命名规则遵循标识符的命名规则。命名规则遵循标识符的命名规则。v文件扩展名文件扩展名(或称文件后缀),在文件主名之后,(或称文件后缀),在文件主名之后,以以“.”符号分隔。用来反映文件的类型或性质。符号分隔。用来反映文件的类型或性质。11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.1.2文件名称文件名称文件扩展名文件的性质或类型.c.cC C语言源程序文件言源程序文件.cpp.cppTC 3.0TC 3.0语言源程序文件言源程序文件.bas.b
5、asBasicBasic语言源程序文件言源程序文件.txt.txt纯文本文件文本文件.dat.dat数据文件数据文件.doc.docWordWord文件文件.mdb.mdbAccessAccess数据数据库文件文件.exe.exe可运行的程序文件可运行的程序文件可可执行的命令文件行的命令文件.bmp.bmp位位图图形文件形文件.jpg.jpg压缩格式的格式的图形文件形文件.avi.avi微微软公司开公司开发的的视频格式文件格式文件.mp3.mp3压缩的音的音乐文件文件常常用用文文件件扩扩展展名名11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件1
6、1.1.3两种重要的文件类型两种重要的文件类型 文文本本文文件件(Text File),也称为ASC文件。每一个字节存储一个ASC码形式表示的字符。文本文件是可直接阅读的,使用Word或Windows的记事本打开即可看到文件的内容。扩展名为.txt的文件。 二二进进制制文文件件(Binary File)。这类文件将文件中的数据按照它的二进制编码的形式存储。由于这类文件内容是二进制编码,因而它无法直接使用记事本或Word打开阅读。一般的可执行程序都为二进制文件,如扩展名为.exe或.com的文件即为二进制文件。11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章
7、章文文 件件11.1.3两种重要的文件类型两种重要的文件类型例如:例如:有一个整型数据123,在两种文件中的存放形式分别如图11.1、图11.2所示。0000000001111011001100010011001000110011图11.1在二进制文件中的存放形式图11.2在文本文件中的存放形式11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.1.3两种重要的文件类型两种重要的文件类型文本文件与二进制文件的优缺点文本文件与二进制文件的优缺点:文本文件的优点文本文件的优点:字符输出的操作中不需转换直接输出,十分方便。文本文件的缺点:文本文件的
8、缺点:一个字符占一个字节,文件占用的存储空间较多,读写时需要转换,访问的时空效率不高。二进制文件的优点二进制文件的优点:二进制文件中的数据与数据的在内存中的表示形式一致。占单元数与操作系统和数据类型有关。二进制文件在存储数据时非常紧凑,占用存储空间较少;在读写时不需进行转换,具有较高的时空效率。二进制文件的缺点:二进制文件的缺点:二进制文件无法直接以字符形式输出,必须要经过一个转换过程。11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件文件缓冲机制:文件缓冲机制:当程序读取文件内容时,系统先将外部文件中的一批批的数据放入一个文件缓冲区内,当文件缓
9、冲区中的数据达到一定数量后,才一次性地将这些数据输入到程序的数据区;反过来,当程序向文件写入数据时,文件缓冲机制也是先将数据写入到文件缓冲区中,当数据写完或缓冲区写满时,才会一次性地将这些数据写入到文件所在的外部设备中。文件缓冲区:文件缓冲区:计算机系统为要处理的文件在内存中单独开辟出来的一个存储区间,在读写该文件时,做为数据交换的临时“存储中转站”。文件缓冲机制的原理见下图。 引入文件缓冲机制的好处就是:引入文件缓冲机制的好处就是:能够有效地减少对外部设备(如磁盘、打印机等)的频繁访问,减少内存与外设间的数据交换,添补内、外设备的速度差异,提高数据读写的效率。11.1.4文件的缓冲机制文件的
10、缓冲机制11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件文文件件指指针针:C C语语言言系系统统对对文文件件的的操操作作必必须须通通过过一一个个指指向向“FILE“FILE类类型型”的的指指针来实现,我们称这种指针为针来实现,我们称这种指针为 “ “文件指针文件指针”。FILEFILE类类型型:是是C C语语言言系系统统定定义义的的一一种种标标准准类类型型,它它实实质质上上是是一一个个结结构构体体。该该结结构构体体中中定定义义了了一一组组域域,用用来来保保存存与与文文件件相相关关的的重重要要信信息息。不不同同的的C C语言系统对语言系统对“FI
11、LE“FILE类型类型”的描述会略有不同,但基本信息是一致的。的描述会略有不同,但基本信息是一致的。对对文文件件的的操操作作要要通通过过定定义义一一个个指指向向FILEFILE类类型型的的文文件件指指针针变变量量来来实实现现对对文文件件的常规操作。这一指针变量被称为的常规操作。这一指针变量被称为文件指针文件指针。文件指针的定义形式:文件指针的定义形式:FILE *FILE *文件指针变量名;文件指针变量名;例如:例如: FILE *myFile; FILE *myFile; /*/*定义了一个名为定义了一个名为myFilemyFile的文件指针。的文件指针。*/*/11.1.5FILE指针指针
12、11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件下下面面列列出出TurboC系系统统对对FILE类类型型的的定定义义(该该定定义义可可从从TurboC的的头头文文件件中中找找到):到):typedefstructshortlevel;/* level表明文件缓冲区的状态是满还是空表明文件缓冲区的状态是满还是空*/unsignedflags;/* flags为文件状态标志符为文件状态标志符 */charfd;/* fd为文件描述符为文件描述符*/unsignedcharhold;/* hold为没有文件缓冲区则不能获得字符为没有文件缓冲区则不能获
13、得字符 */shortbsize;/* bsize表明文件缓冲区的尺寸表明文件缓冲区的尺寸*/unsignedchar*buffer; /*指针指针buffer指向数据交换的缓冲区指向数据交换的缓冲区*/unsignedchar*curp;/*指针指针curp指向文件的当前活动指针指向文件的当前活动指针*/unsignedistemp;/* istemp表明文件是否是临时文件表明文件是否是临时文件 */shorttoken;/* token用于文件合法性检查用于文件合法性检查*/FILE;因此,使用文件操作的程序,必须写上:因此,使用文件操作的程序,必须写上:#include“stdio.h”
14、。11.1文件的基本概念文件的基本概念11.1.5FILE指针指针重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件C语语言言规规定定:每每一一个个文文件件都都必必须须设设置置一一个个位位置置指指针针(文文件件指指针针)来控制文件的访问位置,其规律如下来控制文件的访问位置,其规律如下。文件打开时指针自动指向文件的开始位置;文件打开时指针自动指向文件的开始位置;每每读读取取一一个个单单元元内内容容文文件件位位置置指指针针自自动动顺顺序序向向后后移移动动一一定定的偏移量(该偏移量的字节数由所读取单元的数据类型决定);的偏移量(该偏移量的字节数由所读取单元的数据类型决定);读读到到文文件
15、件的的结结尾尾,则则文文件件的的位位置置指指针针指指向向一一个个特特殊殊的的位位置置EOF。对对文文件件进进行行顺顺序序写写操操作作时时,数数据据写写入入到到文文件件位位置置指指针针所所指指向向的的位位置置。写写入入后后文文件件位位置置指指针针自自动动向向后后移移动动到到一一个个新新的的位位置置,等待下一次的写入操作。等待下一次的写入操作。 可将可将文件文件位置指针移动到任何位置,实现对文件的随机读位置指针移动到任何位置,实现对文件的随机读写访问。写访问。11.1.6文件位置指针文件位置指针11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件 文文
16、件件指指针针移移动动到到文文件件的的最最后后一一个个字字节节时时,C语语言言系系统统会会返返回回文文件件的的结结束束标标识识符符EOF。EOF是是一一个个系系统统常常量量,其其值值被被定定义义为为-1,是在头文件中被定义的。,是在头文件中被定义的。中的定义如下:中的定义如下:#defineEOF(-1)/*Endoffileindicator*/注意:注意:EOF判断文件是否结束只适用于文本文件,而不适用判断文件是否结束只适用于文本文件,而不适用于二进制文件;对于二进制文件,直接使用于二进制文件;对于二进制文件,直接使用feof()函数判断文件函数判断文件是否结束,当函数是否结束,当函数feo
17、f()的返回值为的返回值为1,则表明文件位置指针已经,则表明文件位置指针已经到达文件的结束位置,否则返回值为到达文件的结束位置,否则返回值为0,则表明文件还未结束。,则表明文件还未结束。函数函数feof()的判断方法对于文本文件也是非常有效的判断方法对于文本文件也是非常有效。11.1.7文件结束符文件结束符11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件访问文件主要操作过程如下:访问文件主要操作过程如下:打打开开文文件件(OpenFile):为为文文件件准准备备相相应应的的控控制制信信息息结结构构体体与与文文件缓冲区,并在结构体与文件之间、缓冲
18、区与文件之间建立起关联;件缓冲区,并在结构体与文件之间、缓冲区与文件之间建立起关联;读读取取文文件件操操作作(ReadFile):将将外外部部存存储储介介质质中中文文件件存存储储的的信信息读取出来放在计算机内存中;息读取出来放在计算机内存中;写入文件操作(写入文件操作(WriteFile):):将外界的信息存放到文件中去;将外界的信息存放到文件中去;关关闭闭文文件件操操作作(CloseFile):将将放放于于内内存存中中的的文文件件数数据据写写回回该该文文件件,并并释释放放文文件件占占用用的的内内存存空空间间,切切断断文文件件与与内内存存相相应应数数据据区区域的关联域的关联。11.1.8访问文
19、件访问文件11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件总总之之,文文件件文文件件操操作作必必须须是是:“先先打打开开,后后读读写写,最最后后关关闭闭”。如下图所示。如下图所示。11.1.8访问文件访问文件11.1文件的基本概念文件的基本概念重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.2.1打开文件函数打开文件函数fopen()打开文件使用打开文件使用fopen()函数实现。函数实现。打开文件格式为:打开文件格式为:FILE*fp;fp=fopen(文件名文件名,使用方式使用方式);文件名:为包含访问路径的文件名字符串
20、。文件名:为包含访问路径的文件名字符串。打开文件时,一但发生以下情况时,打开文件操作会失败,函数打开文件时,一但发生以下情况时,打开文件操作会失败,函数fopen()会返回一个不指向任何对象的会返回一个不指向任何对象的NULL值。值。文件所在的设备没有准备好;文件所在的设备没有准备好;给定的路径上没有指定的文件;给定的路径上没有指定的文件;文件名拼写错误;文件名拼写错误;试图以不正确的使用方式打开某个文件。试图以不正确的使用方式打开某个文件。编程中经常检测函数编程中经常检测函数fopen()是否返回是否返回NULL值来判断打开文件操作是值来判断打开文件操作是否成功。否成功。11.2文件的打开与
21、关闭文件的打开与关闭重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件文文件件的的使使用用方方式式列列表表11.2.1打开文件函数打开文件函数fopen()11.2文件的打开与关闭文件的打开与关闭重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.2.1打开文件函数打开文件函数fopen()【例【例111】下面的程序试着打开一个用于只读的文本文件,并检测打下面的程序试着打开一个用于只读的文本文件,并检测打开是否成功。开是否成功。#includevoidmain()FILE*fp;fp=fopen(c:ExamplemyFile.txt,r);if(fp=NULL)p
22、rintf(FailuretoOpentheSpecifiedFile!n);exit(0);如果文件打开成功,如果文件打开成功,fp就指向文件,否则就指向文件,否则fp的值为的值为NULL。当文件打开。当文件打开失败,程序输出相应的错误信息提示,并退出系统。失败,程序输出相应的错误信息提示,并退出系统。 11.2文件的打开与关闭文件的打开与关闭重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件文件操作结束前,必须关闭文件。执行关闭文件操作时,系统会对文件缓冲区中的数据写入文件,并释放文件指针指向的存放文件信息结构体的内存资源。否则可能会引发数据的丢失。关闭文件使用fclose()
23、函数。格式如下:格式如下:fclose(文件指针文件指针);其中的“文件指针”参数,就是保存打开文件操作时fopen函数返回值的FILE指针变量。11.2.2关闭文件函数关闭文件函数fclose()11.2文件的打开与关闭文件的打开与关闭重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3文件的顺序读写文件的顺序读写 顺顺序序读读写写文文件件:是指对文件的访问次序要按照数据在文件中的实际存放次序来进行,而不允许文件位置指针以跳跃的方式来读取数据或插入到任意位置写入数据。 根根据据文文件件顺顺序序读读写写的的信信息息规规模模,可可将将顺顺序序读读写写文文件件的函数分为四类:的函
24、数分为四类:一次读写一个字符; 一次读写一个字符串; 以格式化控制方式一次操作多个类型数据对象的读写函数; 以数据块为操作对象的读写函数。 下面分专题对这四类函数进行介绍。 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3.1字符读写函数字符读写函数1.读取文件中一个字符的函数读取文件中一个字符的函数fgetc()()fgetc()函数实现从一个指定的文件中读取一个字符数据的功能。fgetc()函数的调用形式:c=fgetc(文件指针);例如:FILE*fp;charc;c=fgetc(fp);fgetc()函数返回读取的字符。如果文件位置指针移到了文件结尾,则返回EOF
25、(其值为-1)。2.写入一个字符到文件的函数写入一个字符到文件的函数fputc()fputc()函数实现将一个字符数据写入指定的文件中去的功能。fputc()函数调用方式为:FILE*fp;charc;fputc(c,fp);fputc()函数具有返回值,当向文件输出字符成功,则返回输出的字符,如果输出失败,则返回一个EOF。11.3文件的顺序读写文件的顺序读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.2.1打开文件函数打开文件函数fopen()【例【例112】打开一个文本文件,并为它写入一些用户输入的字符。打开一个文本文件,并为它写入一些用户输入的字符。#inclu
26、de#includevoidmain()FILE*fp;charch;fp=fopen(e:File.txt,w);if(fp=NULL)printf(FailuretoOpentheSpecifiedFile!n);exit(0);printf(Pleaseinputdata(#tostopinput):n);/*输出提示信息输出提示信息*/ch=getchar();/*接受第一个有效字符接受第一个有效字符*/while(ch!=#)fputc(ch,fp);/*输出到文件输出到文件*/putchar(ch);/*将字符显示到屏幕将字符显示到屏幕*/ch=getchar();putchar(
27、10);/*向屏幕输出一个换行符向屏幕输出一个换行符*/fclose(fp);/*关闭文件关闭文件*/11.3文件的顺序读写文件的顺序读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3.2字符串读写函数字符串读写函数1.读取文件中读取一个字符串的函数读取文件中读取一个字符串的函数fgets()()fgets()函数实现从一个文件指针指定的文件中读取指定长度字符串的功能。fgets()函数的一般调用形式为:fgets(str,n,fp);其中:其中:参数fp为文件指针;参数str为字符数组,用来存放文件中读取来的字符串;参数n则指定要获取字符串的长度。实际上fgets()
28、函数最多只能从文件中获取n-1个字符,但在读取字符串的最后位置的后面,系统将自动添加一个0字符。如果函数在读取n-1个字符之前碰到了换行符n或文件结束符EOF,则系统会中止读入,并将遇到的换行符也作为有效的读入字符。fgets()函数在执行成功以后,会将字符数组str的地址作为返回值,如果读取数据失败或一开始读就遇到了文件结束符,则返回一个NULL值。11.3文件的顺序读写文件的顺序读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3.2字符串读写函数字符串读写函数2.写入一个字符串到文件的函数写入一个字符串到文件的函数fputs()()fputs()函数实现将一个字符串
29、写入到指定的文件中去的功能。fputs()函数的一般调用形式为:fputs(str,fp);fputs()函数具有整型的返回值,当向文件输出字符串操作成功时,则返回0值,如果输出失败,则返回一个EOF(-1)。注意:fputs()函数并不将字符串函数并不将字符串str尾部的结束符尾部的结束符“0”写入文件写入文件。字符串在文件中作为独立的一行,需要用fputs(“n”,fp)语句为这一字符串添加一个换行符;否则连续输出的多个字符串成为一个整体,这样在今后的读取数据时就无法将这些字符串有效的区分开来。11.3文件的顺序读写文件的顺序读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件
30、件【例】【例】用字符串读函数实现对文本文件内容的读取,并将行号和每行的数据显示到屏幕上。用字符串读函数实现对文本文件内容的读取,并将行号和每行的数据显示到屏幕上。#includestdio.h#includewindows.hvoidmain()charbuffer256;/*定义数据缓冲区与文件名变量定义数据缓冲区与文件名变量*/FILE*fp;intlineNum=1;/*定义用于显示行号的变量定义用于显示行号的变量lineNum*/fp=fopen(e:File.txt,r);if(fp=NULL)printf(FailuretoOpentheSpecifiedFile!n);exit(
31、0);while(fgets(buffer,256,fp)!=NULL)printf(%3d:%s,lineNum,buffer);/*显示行号与一行数据显示行号与一行数据*/lineNum+;/*行号变量自增行号变量自增*/fclose(fp);/*关闭文件关闭文件*/11.3文件的顺序读写文件的顺序读写11.3.2字符串读写函数字符串读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3.3格式化读写函数格式化读写函数1.格式化输入函数格式化输入函数fscanf()fscanf()函数实现从指定的文件中将一系列指定格式的数据读取出来的功能。fscanf()函数的原型
32、定义为原型定义为:intfscanf(FILE*fp,char*format,argument1,argument2,argumentm);即:即:intfscanf(文件指针文件指针,格式字符串格式字符串,输入表列输入表列);一般调用形式为调用形式为:fscanf(fp,format,&argument1,&argument2,&argumentm);fscanf()函数从文件指针fp指向的文件中,按照format规定的格式,将m(m=1)个数据读取出来,并分别放入到对应的m个变量argumentk(1=k=1)个变量argument1、argument2、argumentm,按照forma
33、t规定的格式,写入到文件指针fp指向的文件中。例如:例如:下列程序将一个人的信息:字符串变量name的值,整形变量age的值和实型变量salary的值,分别按%s,%d和的格式输出到fp指向的文件中。charname=”Jack”;intage=26;floatsalary=3250.00;fprintf(fp,”%s,%d,%8.2f”,name,age,salary)11.3文件的顺序读写文件的顺序读写11.3.3格式化读写函数格式化读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3文件的顺序读写文件的顺序读写注意注意: 用用fprintf()函函数数和和fsc
34、anf()函函数数对对磁磁盘盘进进行行读读写写非非常常方方便便,但但是是,由由于于在在输输入入时时要要将将数数据据的的ASC值值转转换换成成二二进进制制的的形形式式,输输出出时时又又需需要要再再将将二二进进制制形形式式转转换换成成字字符符形形式式,这这需需要要花花费费一一定定的的时时间间。因因此此在在内内存存与与磁磁盘盘频频繁繁交交换换数数据据的的情情况况下下,最最好好不不用用fprintf()函函数数和和fscanf()函数,改用函数,改用fread()函数函数和和fwrite()函数。函数。用用fscanf()函函数数从从文文件件中中进进行行格格式式化化输输入入时时,要要保保证证格格式式字
35、字符符串串所所控控制制的的数数据据格格式式与与文文件件中中的的数数据据类类型型保保持一致,否则将会出错。持一致,否则将会出错。11.3.3格式化读写函数格式化读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件【例】【例】从键盘上输入一个字符串和一个十进制整数,将它们写入到当前目录下的文本文件中,然后从键盘上输入一个字符串和一个十进制整数,将它们写入到当前目录下的文本文件中,然后再从再从文本文本文件中读出并显示到屏幕上。文件中读出并显示到屏幕上。#include#includevoidmain()chars80;inta;FILE*fp;if(fp=fopen(e:File.
36、txt,w)=NULL)printf(Cannotopenthisfile!n);exit(1);scanf(%s%d,s,&a);fprintf(fp,%s%d,s,a);fclose(fp);if(fp=fopen(e:File.txt,r)=NULL)printf(Cannotopenfile!n);exit(1);fscanf(fp,%s%d,s,&a);printf(%s%dn,s,a);fclose(fp);11.3文件的顺序读写文件的顺序读写11.3.3格式化读写函数格式化读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件11.3.4数据块读写函数数据块读写函
37、数1.读取文件中一组数据的函数读取文件中一组数据的函数fread()fread()函数实现从文件指针指定的文件中读取指定长度数据块的功能。fread()函数的原型定义为:intfread(char*buffer,intsize,intcount,FILE*fp);其中参数buffer为指向为存放读入数据设置的缓冲区的指针或作为缓冲区的字符数组;参数size为读取的数据块中每个数据项的长度(单位为字节);参数count为要读取的数据项的个数;fp是文件型指针。如果执行fread()函数时没有遇到了文件结束符,则实际读取的数据长度应为:sizecount(字节)。fread()函数在执行成功以后,
38、会将实际读取到的数据项个数作为返回值;如果读取数据失败或一开始读就遇到了文件结束符,则返回一个NULL值。11.3文件的顺序读写文件的顺序读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件2.写入一组数据到文件的函数写入一组数据到文件的函数fwrite()fwrite()函数实现将一个字符串写入到指定的文件中去的功能。fputs()函数的原型定义为:intfwrite(char*buffer,intsize,intcount,FILE*fp);其中参数buffer是一个指针,它指向输出数据缓冲区的首地址;参数size为待写入文件的数据块中每个数据项的长度(单位为字节);参数co
39、unt为待写入文件的数据项的个数;fp是文件型指针。fwrite()函数具有整型的返回值,当向文件输出操作成功时,则返回写入的数据块的个数,如果输出失败,则返回NULL。注意:利用fread()函数和fwrite()函数读写二进制文件时非常方便,可以对任何类型的数据进行读写。当fread()和fwrite()调用成功时,函数都将返回count的值,即输入输出数据项的个数。11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件【例】【例】利用键盘输入四个学生的基本信息,然后将这些信息保存到当前目录利用键盘输入四个
40、学生的基本信息,然后将这些信息保存到当前目录下的磁盘文件下的磁盘文件“”“”中。中。#include“stdio.h”#defineSIZE4structstudent_type/*将学生基本信息的数据结构定义为一个结构体将学生基本信息的数据结构定义为一个结构体*/charname10;intnum;intage;charaddr15;studSIZE;/*定义学生基本信息结构体对象数组存放四个学生的信息定义学生基本信息结构体对象数组存放四个学生的信息*/11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件v
41、oidsave()FILE*fp;inti;if(fp=fopen(stu_info.dat,wb)=NULL)/*文件打开出错文件打开出错*/printf(Cannotopenfilen);return;for(i=0;iSIZE;i+)/*利用循环写入每个学生的信息利用循环写入每个学生的信息*/if(fwrite(&studi,sizeof(structstudent_type),1,fp)!=1)/*在输出的同时检查输出是否成功失败在输出的同时检查输出是否成功失败*/printf(filewriteerrorn);/*失败失败*/fclose(fp);/*关闭文件关闭文件*/11.3文件
42、的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件/*主函数,实现从键盘输入四个学生的信息数据主函数,实现从键盘输入四个学生的信息数据*/voidmain()inti;for(i=0;iSIZE;i+)/*/scanf(%s%d%d%s,&studi.name,&studi.num,&studi.age,&studi.addr);save();/*调用函数调用函数save(),将输入的数据保存到磁盘文件中,将输入的数据保存到磁盘文件中*/上述程序仅仅实现了数据写入文件的过程。下面编写程序,读取例上述程序仅仅实现了数据写
43、入文件的过程。下面编写程序,读取例11-5生成的数据文件中的每位学生的信息记录,并显示到屏幕上。生成的数据文件中的每位学生的信息记录,并显示到屏幕上。11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件【例】【例】读取当前目录下的磁盘文件读取当前目录下的磁盘文件“”“”中的学生信息记录,并将它们显示到输中的学生信息记录,并将它们显示到输出终端上来。出终端上来。#includestdio.h#defineSIZE4structstudent_typecharname10;intnum;intage;charad
44、dr15;studSIZE;11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件/*主函数,实现从文件中读取四个学生的信息数据并显示到屏幕上主函数,实现从文件中读取四个学生的信息数据并显示到屏幕上*/voidmain()inti;FILE*fp;fp=fopen(stu_info.dat,rb);/*/for(i=0;iSIZE;i+)/*利用循环读取每个学生的信息利用循环读取每个学生的信息*/fread(&studi,sizeof(structstudent_type),1,fp);printf(%-10s
45、%4d%4d%-15sn,studi.name,studi.num,studi.age,studi.addr);/*输出输出*/fclose(fp);/*关闭文件关闭文件*/11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件图图11-7例例11-6的运行结果的运行结果不难看出,输出的内容正是例不难看出,输出的内容正是例11-5中写入文件的内容。中写入文件的内容。11.3文件的顺序读写文件的顺序读写11.3.4数据块读写函数数据块读写函数重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件 前面介绍
46、了对文件的顺序读写操作,这些操作都是从文件的第前面介绍了对文件的顺序读写操作,这些操作都是从文件的第一个有效数据(或某个位置)开始的,依照数据在文件存储设备中一个有效数据(或某个位置)开始的,依照数据在文件存储设备中的先后次序进行读写,在读写过程中,文件位置指针自动移动。但的先后次序进行读写,在读写过程中,文件位置指针自动移动。但在实际应用中,往往需要对文件中某个特定位置处的数据进行处理,在实际应用中,往往需要对文件中某个特定位置处的数据进行处理,换言之,就是读完一个字节的内容后,并不一定要读写其后续的字换言之,就是读完一个字节的内容后,并不一定要读写其后续的字节数据,可能会强制性地将文件位置
47、指针移动到用户所希望的特定节数据,可能会强制性地将文件位置指针移动到用户所希望的特定位置,读取该位置上的数据,这就是随机读写文件。位置,读取该位置上的数据,这就是随机读写文件。C语言提供了对文件的随机读写功能。在随机方式下,系统并语言提供了对文件的随机读写功能。在随机方式下,系统并不按数据在文件中的物理顺序进行读写,而是可以读取文件任何有不按数据在文件中的物理顺序进行读写,而是可以读取文件任何有效位置上的数据,也可以将数据写入到任意有效的位置。效位置上的数据,也可以将数据写入到任意有效的位置。11.4 11.4 文件的随机读写文件的随机读写 重庆电力高等专科学校重庆电力高等专科学校第第11章章
48、文文 件件C语言通过提供文件定位函数来实现随机读写功能。语言通过提供文件定位函数来实现随机读写功能。1.获取文件位置指针当前值的函数获取文件位置指针当前值的函数ftell()ftell()函数的功能是获得并返回文件位置指针的当前值。函数的功能是获得并返回文件位置指针的当前值。ftell()函数的原型定义为:函数的原型定义为:longftell(FILE*fp);其中参数其中参数fp是文件型指针,指向当前操作的文件。是文件型指针,指向当前操作的文件。ftell()函数的返回值为文件位置指针的当前位置。如果函数的返回值为文件位置指针的当前位置。如果ftell()函函数执行时出现错误,则返回长整型的
49、数执行时出现错误,则返回长整型的-1(即(即-1L)。)。11.4 11.4 文件的随机读写文件的随机读写 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件2.重置文件位置指针的函数重置文件位置指针的函数rewind()rewind()函数的功能是使文件的位置指针移到文件的开头处。函数的功能是使文件的位置指针移到文件的开头处。rewind()函数的原型定义为:函数的原型定义为:voidrewind(FILE*fp);其中参数其中参数fp是文件型指针,指向当前操作的文件。是文件型指针,指向当前操作的文件。rewind()函数没有返回值,其作用在于:如果要对文件进行多函数没有返回值,
50、其作用在于:如果要对文件进行多次读写操作,可以在不关闭文件的情况下,将文件位置指针重新设次读写操作,可以在不关闭文件的情况下,将文件位置指针重新设置到文件开头,从而能够重新读写此文件。如果没有置到文件开头,从而能够重新读写此文件。如果没有rewind()函数,函数,每次重新操作文件之前,需要将该文件关闭后再重新打开,这种方每次重新操作文件之前,需要将该文件关闭后再重新打开,这种方式不仅效率低下,而且操作也不方便。使用式不仅效率低下,而且操作也不方便。使用rewind()函数便能克服函数便能克服这一缺陷。这一缺陷。11.4 11.4 文件的随机读写文件的随机读写 重庆电力高等专科学校重庆电力高等
51、专科学校第第11章章文文 件件【例】【例】有一个文本文件,两次读写它的内容,第一次将它的内容显示在有一个文本文件,两次读写它的内容,第一次将它的内容显示在屏幕上,第二次将它的内容复制到另一个文件上。以下为实现该功能的程屏幕上,第二次将它的内容复制到另一个文件上。以下为实现该功能的程序代码。序代码。#includestdio.hvoidmain()FILE*fp1,*fp2;fp1=fopen(file1.dat,r);fp2=fopen(fiel2.dat,w);while(!feof(fp1)putchar(getc(fp1);rewind(fp1);while(!feof(fp1)putc
52、(getc(fp1),fp2);fclose(fp1);fclose(fp2);11.4 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件3.移动文件位置指针的函数移动文件位置指针的函数fseek()函数函数fseek()可以实现改变文件位置指针到指定位置的操作。可以实现改变文件位置指针到指定位置的操作。fseek()函数的原型定义为:函数的原型定义为:intfseek(FILE*fp,longoffset,intorigin);即:即:intfseek(文件类型指针,位移量,起始点文件类型指针,位移量,起始点);其中其中fp为打开的文件指针
53、,参数为打开的文件指针,参数offset为文件位置指针移动的位为文件位置指针移动的位移量(单位为字节),参数移量(单位为字节),参数origin指示出文件位置指针移动的起指示出文件位置指针移动的起始点(或称基点)位置。当执行始点(或称基点)位置。当执行fseek()函数后,文件位置指针新函数后,文件位置指针新的位置是以起始点为基准,向后(的位置是以起始点为基准,向后(offset为正值)为正值)/或向前或向前(offset为负值)移动为负值)移动offset个字节。文件位置指针的新位置可以个字节。文件位置指针的新位置可以用公式用公式“origin+offset”来计算得出。来计算得出。11.4
54、 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件 二进制文件的基点二进制文件的基点origin可以取以下三个常量值之一:可以取以下三个常量值之一:SEEK_SET(也可直接用数字(也可直接用数字0表示):此时文件位置指针从文件的开始位置表示):此时文件位置指针从文件的开始位置进行移动;进行移动;SEEK_CUP(对应值为(对应值为1):此时文件位置指针从文件的当前位置进行移动;此时文件位置指针从文件的当前位置进行移动;SEEK_END(对应值为(对应值为2):此时文件位置指针从文件的结束位置进行移动。此时文件位置指针从文件的结束位置进行移动
55、。文本文件的基点文本文件的基点origin只能取只能取SEEK_SET常量值(或取常量值(或取0值),而值),而origin的值应的值应为为0。fseek()函数常用于二进制文件中,对于文本文件则不常使用,因为文本文件要函数常用于二进制文件中,对于文本文件则不常使用,因为文本文件要进行字符的转换,这会为文件位置指针的计算带来混乱。进行字符的转换,这会为文件位置指针的计算带来混乱。fseek()函数的调用形式为:函数的调用形式为:fseek()函数返回一个整形值。如果函数执行成功,返回函数返回一个整形值。如果函数执行成功,返回0值;否则,返回一个非值;否则,返回一个非0值。值。下面给出下面给出f
56、seek()函数调用的两个例子:函数调用的两个例子:fseek(fp,50L,1),将,将fp指向的文件的位置指针向后移动到离当前位置指向的文件的位置指针向后移动到离当前位置50个个字节处;字节处;fseek(fp,-100L,2),将,将fp指向的文件的位置指针从文件末尾处向前回退指向的文件的位置指针从文件末尾处向前回退100个字节。个字节。11.4 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件【例】【例】在当前目录下有一二进制文件,文件中存储有学生信息数据。编程实现按指在当前目录下有一二进制文件,文件中存储有学生信息数据。编程实现按指
57、定位置读取该文件中的数据,显示到屏幕上,并统计文件的总字节数目,也显示到定位置读取该文件中的数据,显示到屏幕上,并统计文件的总字节数目,也显示到屏幕上。屏幕上。以下为实现该功能的程序代码。以下为实现该功能的程序代码。#includestdio.hstructstudentcharname20;intnum;/*主函数主函数*/main()inti=0;longn=0;FILE*fp=NULL;structstudenta=0;fp=fopen(information.dat,rb);if(fp=NULL)printf(Cantopen!n);exit(0);printf(Recordinfil
58、einformation.dat:n);11.4 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件for(i=1;i5;i+=2)fseek(fp,i*sizeof(structstudent),SEEK_SET);/*定位文件位置指针定位文件位置指针*/n=ftell(fp);/*获取文件位置指针当前值获取文件位置指针当前值*/fread(&a,sizeof(structstudent),1,fp);/*读取数据块读取数据块*/printf(“current:%ldthbyte,%dthrecord:%s%dn”,n,i+1,a.name,
59、a.num);fseek(fp,-3l*sizeof(structstudent),2);/*重新定位文件位置指针重新定位文件位置指针*/n=ftell(fp);/*重新读取数据块重新读取数据块*/fread(&a,sizeof(structstudent),1,fp);printf(“current:%ldthbtype,recordis:%s%dn”,n,a.name,a.num);rewind(fp);/*重置文件位置指针到文件开始重置文件位置指针到文件开始*/n=ftell(fp);/*获取文件位置指针当前值获取文件位置指针当前值*/fread(&a,sizeof(structstud
60、ent),1,fp);printf(“current:%ldthbtype,fristrecord:%s%dn”,n,a.name,a.num);fseek(fp,-0l*sizeof(structstudent),2);/*重新定位文件位置指针到文件尾部重新定位文件位置指针到文件尾部*/n=ftell(fp);/*计算文件总字节数目计算文件总字节数目*/printf(“totalbytes:%ldn”,n);/*显示文件总字节数目显示文件总字节数目*/fclose(fp);getch();11.4 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等专科学校第第11章章文文
61、 件件【例】【例】在当前目录下有一二进制文件,文件中存储有学生信息数据。编程在当前目录下有一二进制文件,文件中存储有学生信息数据。编程实现按指定位置读取该文件中的数据,显示到屏幕上,并统计文件的总字实现按指定位置读取该文件中的数据,显示到屏幕上,并统计文件的总字节数目,也显示到屏幕上。节数目,也显示到屏幕上。以下为实现该功能的程序代码。以下为实现该功能的程序代码。#includestdio.hstructstudentcharname20;intnum;/*主函数主函数*/main()inti=0;longn=0;FILE*fp=NULL;structstudenta=0;fp=fopen(i
62、nformation.dat,rb);if(fp=NULL)printf(Cantopen!n);exit(0);printf(Recordinfileinformation.dat:n);for(i=1;i5;i+=2)fseek(fp,i*sizeof(structstudent),SEEK_SET);/*定位文件位置指针定位文件位置指针*/n=ftell(fp);/*获取文件位置指针当前值获取文件位置指针当前值*/fread(&a,sizeof(structstudent),1,fp);/*读取数据块读取数据块*/printf(current:%ldthbyte,%dthrecord:%
63、s%dn,n,i+1,a.name,a.num);fseek(fp,-3l*sizeof(structstudent),2);/*重新定位文件位置指针重新定位文件位置指针*/n=ftell(fp);/*重新读取数据块重新读取数据块*/fread(&a,sizeof(structstudent),1,fp);printf(current:%ldthbtype,recordis:%s%dn,n,a.name,a.num);rewind(fp);/*重置文件位置指针到文件开始重置文件位置指针到文件开始*/n=ftell(fp);/*获取文件位置指针当前值获取文件位置指针当前值*/fread(&a,s
64、izeof(structstudent),1,fp);printf(current:%ldthbtype,fristrecord:%s%dn,n,a.name,a.num);fseek(fp,-0l*sizeof(structstudent),2);/*重新定位文件位置指针到文件尾部重新定位文件位置指针到文件尾部*/n=ftell(fp);/*计算文件总字节数目计算文件总字节数目*/printf(totalbytes:%ldn,n);/*显示文件总字节数目显示文件总字节数目*/fclose(fp);getch();11.4 11.4 文件的随机读写文件的随机读写重庆电力高等专科学校重庆电力高等
65、专科学校第第11章章文文 件件 在对文件的访问过程中,经常会因各种原因,产生读写数据的错误。在对文件的访问过程中,经常会因各种原因,产生读写数据的错误。如同人们在做数学题时,要进行错误检查一样,程序中也应该为文件处理如同人们在做数学题时,要进行错误检查一样,程序中也应该为文件处理加上一些必要的错误检测手段,这样就能够在程序运行期间检测到一些错加上一些必要的错误检测手段,这样就能够在程序运行期间检测到一些错误,以便进行必要的错误处理,增强程序的健壮性。此外,有时还需要对误,以便进行必要的错误处理,增强程序的健壮性。此外,有时还需要对文件的一些特殊的状态进行检测,以便决定进行相应的处理,从而增强程
66、文件的一些特殊的状态进行检测,以便决定进行相应的处理,从而增强程序的灵活性。序的灵活性。C语言系统专门提供了一些用于检测文件特殊状态与读写错误的函数。语言系统专门提供了一些用于检测文件特殊状态与读写错误的函数。下面简单地介绍一下这些函数的功能与用法。下面简单地介绍一下这些函数的功能与用法。1.文件结束检测函数文件结束检测函数feof()()调用格式为:调用格式为:feof(文件指针);(文件指针);它的功能是:判断文件位置指针当前是否处于文件结束位置。当处于它的功能是:判断文件位置指针当前是否处于文件结束位置。当处于文件结束位置时,返回文件结束位置时,返回1值,否则返回非零值。值,否则返回非零
67、值。11.5 11.5 文件检测文件检测 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件2.读写文件出错检测函数读写文件出错检测函数ferror()()调用格式为调用格式为:ferror(文件指针文件指针);它的功能是它的功能是:检查文件在使用输入输出函数(如:检查文件在使用输入输出函数(如putc,getc,fread,fwrite等)进行读写时,是否有错误发生。如果没有错误产生则返回非零值,否则返等)进行读写时,是否有错误发生。如果没有错误产生则返回非零值,否则返回回1。特别要注意的是:对于同一个文件,每次执行对文件的读写语句,然后马特别要注意的是:对于同一个文件,每次执行
68、对文件的读写语句,然后马上调用函数上调用函数ferror均能得到一个相应的返回值,由该值可以判断出上一次读写数均能得到一个相应的返回值,由该值可以判断出上一次读写数据是否正常。因此在调用一个输入输出函数后,应当立即对据是否正常。因此在调用一个输入输出函数后,应当立即对ferror的返回值进行的返回值进行检查,否则在下次读写数据时,函数检查,否则在下次读写数据时,函数ferror的值会丢失。的值会丢失。在执行在执行fopen函数时,函数时,ferror函数的初始值将被自动置为函数的初始值将被自动置为0。我们经常用下面的这种方式来调用我们经常用下面的这种方式来调用ferror函数:函数:if(fe
69、rror(fp)printf(“OperationofFileisError!n”);fclose(fp);exit(0);11.5 11.5 文件检测文件检测 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件3.将文件出错标志和文件结束标志置将文件出错标志和文件结束标志置0的函数的函数clearerr()()调用格式为调用格式为:clearerr(文件指针文件指针);它的功能是它的功能是:用于清除出错标志和文件结束标志,将这些标:用于清除出错标志和文件结束标志,将这些标志置为志置为0。clearerr的作用是使文件错误的标志和文件结束标志置为的作用是使文件错误的标志和文件结束标
70、志置为0。假设在调用一个输入输出函数时出现了错误,假设在调用一个输入输出函数时出现了错误,ferror函数会返回函数会返回一个非零值,此时如果调用一个非零值,此时如果调用clearerr(fp)函数,函数,ferror(fp)的值将的值将会被自动置会被自动置0。只要出现错误标志,只要出现错误标志,ferror(fp)函数的状态将会一直保留不变,函数的状态将会一直保留不变,这种状态会一直保持到对同一文件调用这种状态会一直保持到对同一文件调用clearerr函数,或者使用函数,或者使用rewind函数,或者调用其他任意输入输出函数。函数,或者调用其他任意输入输出函数。11.5 11.5 文件检测文
71、件检测 重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件1.在在C盘根目录下有一名为的顺序文本文件,其中存放着盘根目录下有一名为的顺序文本文件,其中存放着60个整数数据。顺序读出文件中的个整数数据。顺序读出文件中的60个整数数据,将它们平均分为个整数数据,将它们平均分为三组(每组有三组(每组有20个整数)。假设分出的三个数据组按先后次序分个整数)。假设分出的三个数据组按先后次序分别称为别称为A组、组、B组与组与C组,试编程实现对组,试编程实现对A、B、C三个数据组进行三个数据组进行以下处理的功能:以下处理的功能:(1)A组与组与C组位置对换,但每个组的数据对换后保持原有排组位置对
72、换,但每个组的数据对换后保持原有排列顺序不变;列顺序不变;(2)对)对B组数据的排列顺序进行逆组数据的排列顺序进行逆/反转,但组在文件中的整反转,但组在文件中的整体位置保持不变;体位置保持不变;(3)将处理后的三组数据写入到另一个名为)将处理后的三组数据写入到另一个名为“destination.dat”的顺序文本文件中,并存储到的顺序文本文件中,并存储到C盘根目录下。盘根目录下。11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件下面用一个假定的实例进一步说明题意:下面用一个假定的实例进一步说明题意:假定读出的文件中的假定读出的文件中的60
73、个整数数据如下表所示:个整数数据如下表所示:11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件解题分析:解题分析:首先要读取文件中的数据到内存中已设定好的数据结构中(此首先要读取文件中的数据到内存中已设定好的数据结构中(此处采用数组);处采用数组);编写算法,完成编写算法,完成A组与组与C组数据的位置对换功能;组数据的位置对换功能;编写算法,完成编写算法,完成B组数据的逆转运算功能;组数据的逆转运算功能;至此为止,已在内存中完成至此为止,已在内存中完成A组与组与C组位置的对换功能与组位置的对换功能与B组数组数据的逆转功能,还需将处理后的内
74、存数据结果存入文件中;据的逆转功能,还需将处理后的内存数据结果存入文件中;最后要将文件与关闭掉。最后要将文件与关闭掉。11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件/*主程序功能:通过调用函数,完成读取文件到数组主程序功能:通过调用函数,完成读取文件到数组X中,中,*/*然后对然后对X进行处理,将处理后的结果存入文件中进行处理,将处理后的结果存入文件中*/voidmain()FILE*sf,*df;intx60,i;if(sf=fopen(c:source.dat,r)=NULL)printf(Fileopenfail!n);exit
75、(0);for(i=0;i60;i+)fscanf(sf,%d,(x+i);process(x);fclose(sf);if(df=fopen(c:destination.dat,w)=NULL)printf(Fileopenfail!n);exit(0);for(i=0;i60;i+)fprintf(df,%dn,xi);fclose(df);11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件2.为比较源文件与目标文件的内容,以便检测这两个文件是否符合前面的操作要求,需要为比较源文件与目标文件的内容,以便检测这两个文件是否符合前面的操作
76、要求,需要编写另一个程序,用来对照显示两个数据文件的内容。编写另一个程序,用来对照显示两个数据文件的内容。下面给出已经调试通过的参考程序(程序文件名为)。下面给出已经调试通过的参考程序(程序文件名为)。#include/*getData()函数读取文件函数读取文件fname的数据并存入的数据并存入data数组中数组中*/voidgetData(charfname,intdata)FILE*fp;intk;if(fp=fopen(fname,r)=NULL)printf(Fileopenfail!n);exit(0);for(k=0;k60;k+)fscanf(fp,%d,(data+k);fc
77、lose(fp);11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件/*dispData函数将函数将data数组中的元素以每行十个的形式显示出来数组中的元素以每行十个的形式显示出来*/voiddispData(intdata)intk;for(k=0;k60;k+)if(k%10=0)printf(n);printf(%-6d|,datak);11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件/*主程序完成读文件、并显示数据的功能主程序完成读文件、并显示数据的功能*/voidmain
78、()intsdata60;intddata60;getData(c:source.dat,sdata);getData(c:destination.dat,ddata);printf(nThedataofSourcefile:n);dispData(sdata);printf(nnThedataofDistinationfile:);dispData(ddata);getch();11.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件第二个程序运行后的效果如下图所示。第二个程序运行后的效果如下图所示。上上图文件与的数据对照图文件与的数据对照1
79、1.6 11.6 程序综合举例程序综合举例重庆电力高等专科学校重庆电力高等专科学校第第11章章文文 件件实训目的和要求实训目的和要求掌握文件和文件指针的概念以及文件的定义方法;掌握文件和文件指针的概念以及文件的定义方法;了解文件打开和关闭的概念以及方法;了解文件打开和关闭的概念以及方法;掌握有关文件的函数。掌握有关文件的函数。实训内容和步骤实训内容和步骤从键盘输入一行字符串,然后将其一文件的形式存到磁盘上。文件的从键盘输入一行字符串,然后将其一文件的形式存到磁盘上。文件的名为;名为;从磁盘文件读如一行字符,见其中所有小写字母改为大写字母,然后从磁盘文件读如一行字符,见其中所有小写字母改为大写字母,然后输入到磁盘文件中;输入到磁盘文件中;对上面已经存在的两个文件,编程序从这两个文件中读出各行字符,对上面已经存在的两个文件,编程序从这两个文件中读出各行字符,逐个比较这两个文件中相应的行和列上的字符,如果遇到互不相同的字逐个比较这两个文件中相应的行和列上的字符,如果遇到互不相同的字符,输出它是第几行第几列的字符;符,输出它是第几行第几列的字符;利用所学的文件知识试编程序,统计一篇文章中的大写字母的个数。利用所学的文件知识试编程序,统计一篇文章中的大写字母的个数。11.7 11.7 上机实训上机实训 重庆电力高等专科学校重庆电力高等专科学校