C++程序设计.ppt_第1页
C++程序设计.ppt_第2页
C++程序设计.ppt_第3页
C++程序设计.ppt_第4页
C++程序设计.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、2020/8/2,1,第9章 文件,本章学习重点掌握内容: 文件的概念与类型 文件指针的概念 文件的打开与关闭 文件的读写 文件的定位 文件的检测,2020/8/2,2,第9章 文件,9.1 C语言文件概述 9.2 文件类型指针 9.3 文件的打开与关闭 9.4 文件的读写 9.5 文件的定位 9.6 文件的检测 9.7 常用的文件操作函数小结 9.8 程序设计举例,2020/8/2,3,9.1 C语言文件概述,所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质上的。操作系统是以文件为单位对数据进行管理的 C把每一个文件都看成一个有序的字节流,见图所示,每一个

2、文件以文件结束符EOF(end of file marker,-1)结束。 产品代号 名称 单价 数量 dm02 mcefghij 36 485,2020/8/2,4,9.1 C语言文件概述,产品代号 名称 单价 数量 dm02 mcefghij 36 485 dm00 mcfghijk 39 418 dm04 mcefghij 45 233 dm00 mcbcdefg 30 68 dm05 mcabcdef 32 183,2020/8/2,5,9.1 C语言文件概述,从用户的角度来看,文件可分为普通文件和设备文件两种。 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目

3、标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。 aa.txt 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也可看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。 stdin(键盘) stdout(显示器),2020/8/2,6,9.1 C语言文件概述,从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件(二进制文件)两种。ASCII码文件又称为文本文件。例如,“15023”的存储形式为:,2020/8/2,7,9.1 C语言文件概述,ASCII文件与二进制文件的主要区别如下: (1)它们的存

4、储形式不同。 在ASCII码存储方式中,数据所占的字节数是随着它的大小而变化的。二进制文件存储方式中,数据所占的字节数是由数据类型决定的。 (2)两种类型的读写速度也不一样。 ASCII文件中数据的形式与内存中的数据存储形式不一样,因此在内外存数据交换时,需要进行数据存储形式的转换,而这种转换需要时间的。但二进制文件的数据存储形式是与内存中存储形式一样的,不需要转换。 (3)直接输出 由于ASCII文件中一个字节就是一个ASCII码字符,因此ASCII文件可以直接输出。但二进制文件中不是一个字节对应一个字符,不能直接输出。,2020/8/2,8,9.1 C语言文件概述,C语言对文件的处理有两种

5、系统:缓冲区文件系统和非缓冲区文件系统。 非缓冲区文件系统是指缓冲区的大小和位置由程序员根据程序需要自行设定。,2020/8/2,9,9.2 文件类型,FILE结构体的定义如下: typedef struct short level; /*缓冲区“满”或“空”的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读取字符*/ short bsize; /*数据缓冲区的大小*/ unsigned char *buffer; /*数据缓冲区的位置*/ unsigned char *curp;

6、/*指针当前指向读写的位置*/ unsigned istemp ; /*临时文件指示*/ short token; /*用于有效性检查*/ FILE;,2020/8/2,10,9.2 文件类型指针,FILE *fp; 常称这里的fp为文件类型指针。 通过文件指针变量fp能够找到与它相应的文件,就可对它所指的文件进行操作(打开、关闭、读出、写入等)。,2020/8/2,11,9.3 文件的打开和关闭,任何关于文件的操作都要先打开文件,再对文件进行读写,操作完毕后,要关闭文件。 9.3.1 文件的打开(fopen函数) fopen函数的调用方式通常为: FILE *fp; fp=fopen(“文件

7、名”,“使用文件方式”); 例如:FILE *fp; fp=fopen(file1.dat,r); fp=fopen(“c:abc.txt”,“r”);,2020/8/2,12,9.3.1 文件的打开(fopen函数),如果出错,fopen函数将返回一个空指针值NULL。因此常用如下方式打开文件并测试返回值: if(fp=fopen(file1.dat,r)=NULL) printf(Cannot open this file!n ); exit(0); exit函数的作用是关闭所有文件,终止正在执行的程序,这时用户需要检查出错误的原因,再运行。,2020/8/2,13,9.3.2 文件的关闭

8、(fclose函数),文件关闭就是将文件与对应的文件指针“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。 fclose函数的调用格式为: fclose(文件指针); 例如:fclose(fp);,2020/8/2,14,9.4 文件的读写,9.4.1 字符的读写(fgetc函数和fputc函数) 字符读写函数是以字符(字节)为单位的读写函数。每次可以从文件读出或向文件写入一个字符。 1读字符(fgetc函数) fgetc(文件指针); 例如:ch=fgetc(fp); 2. 写字符( fputc函数) fputc(字符,文件指针); 例如:fputc(ch,fp);,2020

9、/8/2,15,9.4.1 字符的读写(fgetc函数和fputc函数),例如:从磁盘文件顺序读入字符并输出到屏幕上 #include/一个一个字节(字符)读取 main() char ch; int i; FILE *fp; /*fp有记录读写位置信息*/ fp=fopen(IN1.DAT,r); /*文本文件的读*/ ch=fgetc(fp); while(ch!=EOF) printf(%c,ch); /coutch; ch=fgetc(fp); ,2020/8/2,16,9.4.1 字符的读写(fgetc函数和fputc函数),3fgetc和fputc函数使用举例 【例9.1】将键盘输

10、入的一组字符(遇“#”结束)写入到磁盘文件中去,并将写入文件中的字符再输出到屏幕上。N-S图如图9-1。,2020/8/2,17,#include #include #include void main( ) FILE *fp; char ch,filename10; coutInput filename:endl; gets(filename); /输入文件名 if( fp=fopen(filename, w)=NULL) coutCant create this file!endl; exit(0); coutPlease input text(# is end):endl; while(

11、ch=getchar( )!=#) /判断输入字符是否# fputc(ch,fp); fclose(fp); if( fp=fopen(filename, r)=NULL) coutCant open this file!endl; exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp); ,2020/8/2,18,9.4.1 字符的读写(fgetc函数和fputc函数),【例9.2】把一个磁盘文件中的内容复制到另一个磁盘文件中。N-S图如图9-2。,2020/8/2,19,#include #include #include voi

12、d main( ) FILE *fp1,*fp2; char ch,inname10,outname10; cout“Please input the infile name:”endl; gets(inname); cout“Please input the outfile name:”endl; gets(outname); if( fp1=fopen(inname, r)=NULL) /以读文本文件方式打开原有文件 coutCant open infile!endl; exit(0); if( fp2=fopen(outname, w)=NULL) /以写文本文件方式打开目标文件 cou

13、tCant open outfile!endl; exit(0); while(!feof(fp1) ch=fgetc(fp1); /从原有磁盘文件中读一个字符 fputc(ch,fp2); /把该字符写入目标磁盘文件 fclose(fp1);fclose(fp2); ,2020/8/2,20,9.4.2 字符串的读写(fgets函数和fputs函数),1字符串输入(fgets函数) 其调用格式为: fgets(字符数组名,n,文件指针); 其中:n是一个正整数 例如:fgets(str,n,fp); /读取n-1个字符 2字符串输出(fputs函数) 其调用格式为: fputs(字符串,文件

14、指针); 例如:fputs(hello! ,fp); 其意义是把字符串“hello! ”写入fp所指向的文件中。,2020/8/2,21,9.4.3 二进制数据块的读写(fread函数和fwrite函数),1数据块输入(fread函数) 其调用格式为: fread(buffer,size,count,fp); 例如:fread(score,4,2,fp); 其中score是一个实型数组名。一个实型变量占4个字节。这个函数从fp所指向的文件读入2个实数存入数组score中。 2数据块输出(fwrite函数) 调用格式为: fwrite(buffer,size,count,fp); 一般地,用fr

15、ead和fwrite函数进行读写操作时,文件应以二进制方式打开,这样输入输出都不会发生字符转换,从而保证原样读写。,2020/8/2,22,9.4.3 数据块的读写(fread函数和fwrite函数),又如:有一个如下的结构体类型表示学生信息: struct student char name10; int num; float score; ; 为了表示某一班级的学生,声明结构体数组; student std30; 可以用for语句和fread函数读入30个学生的数据: for(i=0;i30;i+) fread(,2020/8/2,23,3fread和fwrite函数使用举例 【例9.4】

16、从键盘上输入N名学生的记录(学号、姓名、年龄、性别),存入磁盘文件STUDENTS.TXT中。再从文件中调出女生记录显示到屏幕上。N-S图如图9-4。,9.4.3 数据块的读写(fread函数和fwrite函数),2020/8/2,24,【例9.4】从键盘上输入N名学生的记录(学号、姓名、年龄、性别),存入磁盘文件STUDENTS.TXT中。再从文件中调出女生记录显示到屏幕上。,#include #include #include #define N 5 struct student int num; char name10; int age; char sex; ;,2020/8/2,25,

17、void main() int i; FILE *fp; student stdN; if(fp=fopen(“STUDENTS.TXT”,”wb+”)=NULL)/”wb+”即可写可读方式 stdi.agestdi.sex; fwrite( ,2020/8/2,26,9.4.4 文本文件格式化的读写(fscanf函数和fprintf函数),1格式化输入(fscanf函数) 其调用格式为: fscanf(文件指针,“格式控制字符串”,输入项地址列表); 功能:从文件指针指向的文件中读取格式化的数据到指定的输入项中。 例如:fscanf(fp, %d %

18、f, 就是从fp所指向文件中读出一个整数和一个实数分别赋值给变量a和x。 scanf(“格式控制字符串”,输入项地址列表); 等价于: fscanf(stdin,“格式控制字符串”,输入项地址列表);,2020/8/2,27,2格式化输出(fprintf函数) 其调用格式为: fprintf(文件指针,“格式控制字符串”,表达式列表); 例如:fprintf (fp, %d %6.2f ,x,y); 就是将变量x和y的值按指定格式写入到fp所指向的文件中。 printf(“格式控制字符串”,表达式列表); 等价于: fprintf(stdout,“格式控制字符串”,表达式列表);,9.4.4

19、格式化的读写(fscanf函数和fprintf函数),2020/8/2,28,标准的格式化输入输出函数: scanf(“格式控制字符串”,输入项地址列表); printf(“格式控制字符串”,表达式列表); 等价于: fscanf(stdin,“格式控制字符串”,输入项地址列表); fprintf(stdout,“格式控制字符串”,表达式列表);,9.4.4 格式化的读写(fscanf函数和fprintf函数),2020/8/2,29,9.5 文件的定位,顺序访问是系统自动实现的。但是,要想读写其中的某几个数据就要进行随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。,20

20、20/8/2,30,9.5.1 位置指针复位(rewind函数),其调用格式为: rewind(文件指针); 功能:把文件内部的位置指针重新移到文件首。 返回值:无。,2020/8/2,31,9.5.2 位置指针随机定位(fseek函数),fseek函数就可以移动文件内部位置指针到任意指定位置。 其调用格式为: fseek(文件指针,位移量,起始点); 功能:将文件指针所指文件的位置指针以起始点为基准,移动“位移量”个字节数。 返回值:若移动成功,返回值为0,否则返回值为非0。,2020/8/2,32,9.5.2 位置指针随机定位(fseek函数),其中:“位移量”可以为正或负值。表示从起始点

21、向前(文件尾方向)或向后(文件头方向)移动。位移量是长整型的数值,这样当位移量超过64KB时也不至于出现错误。当用常量表示位移量时,要求加后缀“L”。“起始点”有三个:文件开始、当前位置和文件末尾。可以选择标识符表示或数字表示。见表9.2所示。,表9.2 起始点表示方法,2020/8/2,33,【例9.6】在磁盘文件students.dat上存有10个学生的数据(学号、姓名、年龄、性别)。要求将第2、4、6、8、10个学生数据读出并在屏幕上显示出来。N-S图如图9-6。,2020/8/2,34,#include #include #include struct student int num;

22、 char name10; int age; char sex; ; void save( );,【例9.6】在磁盘文件students.dat上存有10个学生的数据(学号、姓名、年龄、性别)。要求将第2、4、6、8、10个学生数据读出并在屏幕上显示出来。,2020/8/2,35,void main() int i; FILE *fp; student std10; save( ); if(fp=fopen(“students.dat”,”rb”)=NULL) cout“Cannot open this file.”endl; exit(0); for(i=1;i10;i+=2) fseek(

23、fp,i*sizeof(student),0); fread( ,2020/8/2,36,void save( ) /从键盘上输入学生记录函数,创建磁盘文件:students.dat student std10; int i; FILE *fp; if(fp=fopen(“students.dat”,”wb”)=NULL) stdi.agestdi.sex; fwrite( ,2020/8/2,37,9.5.3 检测当前位置指针的位置(ftell函数),由于文件中的位置指针经常移动,人们往往不容易知道其当前位置在哪里。用ftell函数可以得到文件指针的

24、当前位置。 其调用格式为: ftell(文件指针); 功能:检测当前位置指针的位置距离文件头有多少个字节的距离。 返回值:成功则返回值就是文件的当前位置,其位置用相对于文件头的位移量(长整型)来表示,如果出错,则返回值为1L。 例如:利用这个函数,可以测试一个文件的长度。 fseek(fp,0L,2);/将位置指针移到文件尾 w=ftell(fp);/w中存入了文件尾到文件头的字节数,2020/8/2,38,9.8 程序设计举例,【实例一】有5名职工,从键盘输入每名职工的数据(包括工号、姓名和四个季度的奖金),计算出全年奖金总数,将原有数据和计算出的全年奖金总数存入磁盘文件“zhigong.d

25、at”中。N-S图如图9-7。,#include #include struct employee int num; char name10; int money4; int total; emp5;,2020/8/2,39,void main() int i,j,sum; FILE *fp; for(i=0;iempi.num; ; sum=0; for(j=0;jempi.moneyj; sum+= empi.moneyj; empi.total=sum; fp=fopen(“zhigong.dat”,”wb”); for(i=0;i5;i+) if(fwrite( ,2020/8/2,40,【实例二】将实例一“zhigong.dat”文件中的职工数据,按全年奖金总数进行降序处理,将已排序的职工数据存入一个新文件“zhg_sort.dat”中。N-S图如图9-8。,#include #include #include #define N 5 struct employee int num; char name10; int money4; int total; empN,change;,2020/8/2,41,void main() int

温馨提示

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

评论

0/150

提交评论