分社教学资源汇总曾cc第七章_第1页
分社教学资源汇总曾cc第七章_第2页
分社教学资源汇总曾cc第七章_第3页
分社教学资源汇总曾cc第七章_第4页
分社教学资源汇总曾cc第七章_第5页
免费预览已结束,剩余31页可下载查看

下载本文档

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

文档简介

1、1第七章 文件7.1 文件概述7.2 文件的打开与关闭7.3 文件的读/写7.4 应用举例2 7.1 文件概述 程序通过键盘输入数据,通过显示器显示处理结果的方式无法让数据永久保存。若要将经常使用的数据做永久的保存,则应将将这些数据记录在外部介质上,这就是文件。文件是存储在外存(如磁盘)上的用文件名标识的数据的集合。操作系统以文件为单位对数据进行管理。文件名是处理文件的依据。读取存放在外存上的数据时,必须先按文件名找到所指定的文件,再从该文件中读取数据;向外存写入数据时必须先建立一个文件(以文件名标识),再向它输出数据。 37.1.1 C/C+文件C和C+文件的逻辑结构都是流式文件,是由一个个

2、字符或字节组成的序列,即流式文件。C语言文件处理的关键是定义一个文件指针,通过该指针对文件的打开、读写、关闭等进行操作。C+语言的文件处理则是在定义一个输入输出流类对象的基础上,通过封装在输入输出流类内部的成员函数实现对文件的操作。本书中只讨论C语言的文件处理方法。41、C语言文件分类 ASCII文件是指把内存中的数据转换成ASCII码存储在文件上,每个ASCII码代表一个字符;二进制文件是把内存中的数据按其内存中的存储形式不进行格式转换直接存放在文件上。 按访问模式分类: 可分为顺序文件和随机文件。按照数据组织形式分类:分为文本文件(又称ASCII文件) 和二进制文件。 5 例如,整数123

3、在内存中占两个字节(00 7B)H,如果按ASCII形式存放在磁盘文件上,则占有3个字节:(31 32 33)H,而按二进制形式存放,则占有2个字节:(00 7B)H。占用较多的存储空间,需要花时间转换数据,因一个字节代表一个字符,故能直接编辑和显示 节省存储空间和转换时间,但与字符没有直接对应关系,所以不能直接编辑和显示 62、C语言文件的读写程序处理文件的三个步骤:打开文件进行读写操作关闭文件对文件的处理通过调用标准的输入输出库函数实现。文件操作一般采用“缓冲文件系统”的方式,即文件与程序之间的数据通讯不是直接的,而是通过文件缓冲区来联系。 调用输出函数把程序中变量的值输出到外部文件中,称

4、为“输出”或“写”文件操作。调用输入函数从外部文件中输入数据赋给程序中的变量,称为“输入”或“读”文件操作;77.1.2 文件指针 在C语言“缓冲文件系统”中,每一个被打开的文件在内存中都开辟了一个区,用来存放文件的有关信息(如文件的名字,文件当前位置等)。这些信息保存在一个类型名为FILE的结构体变量中。处理文件是通过指向FILE类型的文件指针进行的。其中,FILE是由C语言系统在stdio.h文件中定义的。文件指针的定义形式如下: FILE *文件指针标识符; 例如:FILE *fp1, *fp2;定义两个文件指针fp1和fp2,再通过fopen函数使得他们能够分别指向各自的文件缓冲区,程

5、序就可以利用他们来访问文件。 87.2 文件的打开与关闭7.2.1 文件的打开 打开文件,是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。 原型: FILE *fopen(char *fname, char *mode) 功能: 打开一个由fname所指定的文件,返回一个指向文件的指针。 若打开文件失败,则返回一个空指针(NULL)。mode参数指示了文件打开后可以进行的处理方式,其值及其意义如下:9mode功 能r打开一个文本文件,对该文件只能进行读操作。w建立一个新的文本文件(空文件),对该文件只能进行写操作。a打开一个文本文件,对该文件只能在文件末尾追加数据。rb打开

6、一个二进制文件,对该文件只能进行读操作。wb建立一个新的二进制文件(空文件),对该文件只能进行写操作。ab打开一个二进制文件,对该文件只能在文件末尾追加数据。r+打开一个文本文件,对该文件既可以读又可以写。w+建立一个新的文本文件(空文件),对该文件既可以读又可以写。a+打开一个文本文件,可以在该文件末尾追加数据,也可以读。rb+打开一个二进制文件,对该文件既可以读又可以写。wb+建立一个新的二进制文件(空文件),对该文件既可以读又可以写。ab+打开一个二进制文件,可以在该文件末尾追加数据,也可以读。10说明:(1) 用含有字母r(r、rb、r+和rb+)的方式打开的文件,用于向计算机输入数据

7、,即从文件读取数据。文件必须已经存在,否则fopen函数将返回一个出错信息(NULL)。(2) 用含有字母w (w、wb、w+和wb+)的方式打开的文件,用于向文件输出数据。如果文件已经存在,则文件的内容将被删除,成为一个空文件,因此使用时必须小心。(3) 用含有字母“a” (“a”、“ab”、“a+”和“ab+”)的方式打开文件,是向文件的末尾添加新的数据。与含有字母“r”的方式类似,文件必须已经存在,否则fopen函数也将返回一个出错信息(NULL)。(4) 希望对文件既能够进行写操作又能够进行读操作,则应使用含有字母+(r+、w+、a+、rb+、wb+和ab+)的方式。 (5)如果要打开

8、一个二进制文件,则应使用含有字母 “b”的方式。11(6) 为了程序的通用性,文件名应在程序运行时输入。 例如:FILE *fp;char fname15;coutfname;fp = fopen(fname,r);注意: 在fopen函数中,如果文件名直接给出,则路径中的应写成;如果文件名在程序运行时输入,则路径中的分隔符直接输入字符。 12(7) 为保证程序的正常运行,通常要对fopen函数的返回值进行检验,以判断文件是否成功地打开。有关的语句如下: if (fp=fopen(fname,mode) = = NULL) coutcant open filen; exit(1); 该段程序使

9、得文件打开失败时,显示提示信息,然后调用exit函数,该函数将结束程序的运行。137.2.2 文件的关闭原型: int fclose(FILE *stream)功能: 关闭文件指针stream所指向的文件。如果fclose( )调用成功,则返回0值,否则返回一个非0值。说明:1)如果程序中没有使用fclose函数关闭文件,则在程序运行结束时系统会自动关闭所有打开的文件。2)应该养成及时关闭文件的习惯,防止误操作或其他原因造成丢失数据的情况发生。147.3 文件的读写 C语言提供四种读写函数: 字符读写、字符串读写、格式读写和数据块读写。7.3.1 文件的字符读写 用于一次从文件读出或向文件写入

10、一个字符。1. fgetc函数原型:int fgetc(FILE *stream)功能:从stream所指的文件中读取一个字符,该字符作为函数的返回值,并且使文件的当前位置后移一个字符。15说明:1)当到达文件结束标志或出错时,返回EOF。EOF是被定义成-1的符号常量。2)实际使用时,经常用feof(fp )判别fp所指向的文件的当前状态是否是“文件结束”。若是,则feof(fp)的值为1,否则为0。 如: while(!feof(fp) c=fgetc(fp); putchar(c); 162. fputc函数原型: int fputc(int ch,FILE *stream)功能: 把c

11、h中的字符(高位字节被忽略掉)写入stream所指的文件当前位置处,并使文件的当前位置加1。如果该函数的写操作成功,则返回该字符值,否则返回EOF。17【例7.1】编写程序首先建立一个文本文件abc.txt,其内容为26个小写英文字母。然后再将该文件的内容显示在屏幕上。分析 程序涉及文本文件的读写两种操作,且对同一个文件以两种不同的方式打开。程序#include stdlib.h#include iostream.h#include stdio.hvoid main() FILE *fp; if(fp=fopen(“abc.txt”, “w”)=NULL) /以写的方式打开文件abc.txt

12、coutcant open filen;exit(1); 18 char ch=a; while(ch=z) fputc(ch,fp); ch+; fclose(fp); /abc.txt文件将以读的方式重新被打开,所以必须先关闭 if(fp=fopen(“abc.txt”, “r”)=NULL) /以读的方式打开文件abc.txt coutcant open filen; exit(1); while(!feof(fp) ch=fgetc(fp); coutch; fclose(fp); 197.3.2 文件的字符串读写 一次可从文件读出或向文件写入一串字符。1fputs()函数原型:int

13、 fputs(char *s, FILE *stream)功能: 将字符串s的内容输出到stream所指向的文件中。其中,s可以是字符串常量、指向字符串的指针或存放字符串的字符数组名等。注意:用此函数进行输出时,字符串中最后的0并不输出,也不自动加n,即文件中各字符串将首尾相接,他们之间将不存在任何间隔符。202fgets函数原型:char *fgets(char *s, int n, FILE *stream) 功能: 从stream所指文件中读入n-1个字符放入s为起始地址的空间内。其中s是存放字符串的起始地址;n是一个int类型变量。注意:如果在未读满n-1个字符之时,已读到一个换行符或

14、一个文件结束符,则结束本次读操作,读入的字符串中最后包含读到的换行符或文本结束符。读入结束后,系统将自动在最后加0,并以s作为函数值返回。21【例7.2】字符串读写函数示例。#include stdio.h#include stdlib.h#include iostream.hvoid main()FILE *fp;char s100;if(fp=fopen(file1.TXT, w)=NULL)coutcant open filen;exit(1); fputs( I love my homeland!, fp); fclose(fp); if(fp=fopen(file1.TXT, r)=

15、NULL) coutcant open filen; exit(1); fgets(s,10,fp); /将文件中的9个字符读入到字符串s中 puts(s);227.3.3 文件的块读写 用于一次从文件读出或向文件写入一组数据,如结构类型数据。1. fread函数 原型: int fread(void *buffer,int size, int count,FILE *fp) 功能: 从文件指针fp所指的地方读取长度为size的count个数据块,存到buffer所指的存储区中。如果成功,则返回实际所读的数据块数,否则返回0。232. fwrite函数 原型: int fwrite(void

16、*buffer,int size,int count,FILE *fp) 功能: 将以buffer为起始地址的长度为size的count个数据块输出到文件指针fp所指的地方去。如果成功,则返回输出数据块的数量,否则返回0。说明:buffer是一个指针。对于fread,buffer是一个指向用来接受从文件中读取的数据存储区的指针;对于fwrite,buffer是一个指向将被写到文件中去的那些数据的指针。size是数据块的大小。count指示共有多少个数据块要被读写。fp是文件指针。24 一般,只要文件以二进制方式打开,fread和fwrite就可以读写任何类型信息,最常用于读写数组或结构。 例如

17、,假设fp指向以二进制形式打开的可读写文件,并有如下的说明:float f; double d10;常见的块读写应用示例:fwrite (&f,sizeof(float),1,fp);/把浮点数f以块形式写入文件fwrite(d,sizeof(double),10,fp);/把数组d中所有数以块形式写入 文件fread (&f,sizeof(float),1,fp);/从文件中以块形式读一浮点数到 变量f中fread(d,sizeof(double),10,fp);/从文件中以块形式读10个浮点数 到数组d中 25【例7.3】将sin(x)在i(2/360)(i=0,1,359)上的值保存在文

18、件中。#include iostream.h#include “stdio.h#include math.h#include stdlib.h#define SIZE 360#define PI 3.14159void main( )FILE *fp; int i; double dataSIZE; for(i =0; iSIZE; i+)datai = sin(2*i*PI/360); if(fp=fopen(sin_data,wb)=NULL) coutcant open filen;exit(1); fwrite (data, sizeof(double),SIZE, fp); fclo

19、se(fp);也可写做:for(i=0;i360;i+)fwrite (&datai, sizeof(double),1, fp);还可写做:fwrite (data, sizeof(data),1, fp);注意:二进制文件不能直接打开编辑显示267.3.4 文件的格式化读写1fprintf()函数 原型: int fprintf(FILE *stream, const char *format, argument, .) 功能: 按格式向流中输出数据,其用法和printf()相同,但该函 数不是将数据写到显示器,而是写到stream所指向的文件中。 如: fprintf(fp,%2d%s,

20、4,China); 表示将整数4和字符串China写入fp所指的文件中。272fscanf()函数 原型: int fscanf(FILE *stream, const char *format, address, .) 功能: 从流中按格式读取数据。其用法和scanf()相同,但该函数不是从键盘读取,而是从stream所指向的文件读取数据。如: fscanf(fp,%d%d ,&x,&y); 表示从fp所指的文件中顺序读取两个整数给变量x和y。 287.3.5 文件的随机读写顺序读写文件只能从头开始,顺序读写各个数据。 随机读写可按需要只读写文件中某些指定的部分。 随机读写的关键是要按要求移

21、动位置指针,即进行文件的定位。实现文件定位、移动文件内部位置指针的函数主要有 rewind 函数和fseek函数。 1.rewind 函数 原型: void rewind(FILE *stream); 功能: 使指示文件位置的指针重新返回到文件开始。292. fseek函数 原型: int fseek(FILE *stream, long offset, int whence) 功能: 一般用于二进制模式打开的文件中,定位到流中指定的位置,如果成功返回0,参数offset是移动的字符数,用长整型表示;whence是移动的基准,常用符号常量表示。符号常量值基 准 位 置SEEK_SET0文 件

22、开 头SEEK_CUR1当前读写的位置SEEK_END2文 件 尾 部30 例如: fseek(fp,1234L,SEEK_CUR); 其功能是把读写位置从当前位置向后移动1234字节(L后缀表示长整数)。 又如: fseek(fp,0L,2); 其功能是把读写位置移动到文件末尾。注意: 由于随机读写的一般是一个数据块,因此该函数常配合fread和fwrite函数使用。317.4 应用举例本章重点介绍数据文件的概念及使用方法。文件使用的一般过程可概括如下: 定义一个文件指针。 以正确的方式打开文件,让文件指针指向相关的存储于磁盘上的某数据文件。在正确打开文件的前提下,对文件进行定位(随机文件需

23、要此操作)、读或写的操作。文件操作完毕后,关闭文件。32【例7.4】编写一个程序实现文本文件的复制。假设“ABC.TXT”是已经存在于D盘根目录下的一个文本文件,内部存放了若干字符型数据,要求将其内容复制到同一位置的“DES.TXT”中,同时还要求将源文件中的字符总数写入目的文件的最后。分析 根据题意,需以读写两种方式分别打开源文件和目的文件,同时由于要求将源文件中的字符总数写入目的文件中,因此在源文件的内容复制完毕后,再使用一个fprintf函数实现数据的写入。33#include stdio.h#include stdlib.h#include iostream.hvoid main( )

24、 FILE *source,*target; char ch; int num=0; if(source=fopen(D:ABC.TXT, r)=NULL)/注意路径中的分隔符应为 coutcant open filen; exit(1); if(target=fopen(D:DES.TXT, w)=NULL) coutcant open filen; exit(1); while(ch=fgetc(source)!=EOF)/注意运算符的优先级和括号的正确使用 fputc(ch,target); num+; fprintf(target,%d,num); /字符总数写入目的文件 fclose(source);fclose(target);34【例7.5】从键盘上

温馨提示

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

评论

0/150

提交评论