c语言第10章文件课件_第1页
c语言第10章文件课件_第2页
c语言第10章文件课件_第3页
c语言第10章文件课件_第4页
c语言第10章文件课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第十章文件本章内容掌握文件的基本概念掌握文件类型指针的含义的使用方法熟练掌握文件的打开和关闭掌握文件的读写1西华大学电气信息学院郑海春10.1

C文件概述10.2

文件类型指针10.3

文件的打开与关闭10.4

文件的读写本章目录2西华大学电气信息学院郑海春10.1C文件概述文件:存储在外部介质上数据的集合。文件分类

文本(ASCII码)文件:每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放使用数据文件的目的1、数据文件的改动不引起程序的改动——程序与数据分离2、不同程序可以访问同一数据文件中的数据——数据共享3、能长期保存程序运行的中间数据或结果数据3西华大学电气信息学院郑海春如int型数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果4西华大学电气信息学院郑海春10.2文件类型指针文件结构体FILE:缓冲文件系统为每个正使用的文件在内存开辟文件信息区;文件信息用系统定义的名为FILE的结构体类型描述;FILE定义在stdio.h中。指针变量说明:FILE*fp;用法:fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量。从而通过该结构体变量中的文件信息能够访问该文件。也即,通过文件指针变量能够找到与它相关的文件。文件打开时,系统自动把存储该文件信息的FILE类型结构体变量的地址返回来,程序通过fp变量保存该地址,从而可以获得文件的信息,进而实现访问文件的功能。文件关闭后,fp指向的文件结构体变量所占的内存空间被释放。

fpFILE文件5西华大学电气信息学院郑海春10.3文件的打开与关闭C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件-->文件读/写-->关闭文件系统自动打开和关闭三个标准文件:标准输入------键盘stdin(系统定义的文件指针)标准输出------显示器stdout(….)标准出错输出-----显示器stderr(….)6西华大学电气信息学院郑海春打开文件函数fopen⑴函数:FILE*fopen(char*name,char*mode)功能:按指定方式打开文件返回值:正常打开,返回值为指向文件结构体的指针;打开失败,返回值为NULL指针。要打开的文件名文件使用方式“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为输入打开一个文本/二进制文件(文件必须存在)为输出打开(清除已有数据)或建立一个文本/二进制文件为读/写打开一个文本/二进制文件(读为主,文件必须存在)为读/写打开或建立一个文本/二进制文件(写为主,写后可读)为读/写打开或建立一个文本/二进制文件(同“a”,可读)为追加打开(保留已有数据)或建立一个文本/二进制文件文件使用方式含义7西华大学电气信息学院郑海春关闭文件函数fclose⑴函数:intfclose(FILE*fp)功能:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。返回值:正常关闭为0;出错时,非0。文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:不关闭文件可能会丢失数据fclose8西华大学电气信息学院郑海春10.4文件的读写字符输出与输入函数(fputc与fgetc)调用fputc函数输出一个字符函数原型:intfputc(charch,FILE*fp);功能:将字符ch写到文件指针fp指向的文件中返回值:成功,返回所输出的字符;失败,则返回一个EOF值,EOF是在“stdio.h”库函数文件中定义的符号常量,其值等于-1。9西华大学电气信息学院郑海春例题:把从键盘输入的文本按原样输出到名为file_a.dat文件中,用字符@作为键盘输入结束标志。#include"stdio.h"#include"stdlib.h"voidmain(){ FILE*fp; charch; if((fp=fopen("file_a.dat","w"))==NULL) {printf("Cann'topenfile!\n");exit(0);} ch=getchar(); while(ch!='@') {fputc(ch,fp);ch=getchar();} fclose(fp);}10西华大学电气信息学院郑海春调用fgetc函数输入一个字符函数原型:intfgetc(FILE*fp);功能:从文件指针fp指向的文件中读入一个字符,并把它作为函数返回值。返回值:成功,返回读到的字符的ASCII码值;读到文件尾或出错,则返回一个EOF值。11西华大学电气信息学院郑海春例题:把一个存在磁盘上的file_a.dat文本文件中的内容原样输出到终端屏幕上。#include"stdio.h"#include"stdlib.h"voidmain(){ FILE*fp; charch; if((fp=fopen("file_a.dat","r"))==NULL) {printf("Cann'topenfile!\n");exit(0);} ch=fgetc(fp); while(ch!=EOF) {putchar(ch);ch=fgetc(fp);} fclose(fp);}12西华大学电气信息学院郑海春判断文件结束的feof函数程序从一个磁盘文件中挨个读取字符并输出到屏幕上显示,在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放,我们知道ASCII代码值的范围是0到255,不可能出现-1,因此可以用EOF作为文件结束标志。但当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一问题,ANSIC提供一个feof函数,用来判断文件是否结束。如果遇到文件结束,函数feof(fp)的值为1,否则为0。feof函数既可用以判断二进制文件又可用以判断文本文件。函数原型:

intfeof(FILE*fp);13西华大学电气信息学院郑海春例题:编写程序,用于把一个文本文件复制到另一个文件中;源文件名和目的文件名由命令行输入。命令行形式如下:可执行程序名源文件名目的文件名参考书上P338页#include"stdio.h"#include"stdlib.h"voidmain(intargc,char*argv[]){ FILE*fpin,*fpout; charch; if(argc!=3) {printf("Thenumberofargumentisnotcorrect!\n");exit(1);} if((fpin=fopen("file_a.dat","r"))==NULL) {printf("Cann'topeninfile!\n");exit(0);} if((fpout=fopen("file_b.dat","w"))==NULL) {printf("Cann'topenoutfile!\n");exit(0);}

ch=fgetc(fpin); while(!feof(fpin)) {fputc(ch,fpout);ch=fgetc(fpin);} fclose(fpin);fclose(fpout);}14西华大学电气信息学院郑海春格式化I/O函数(fscanf和fprintf)fscanf函数函数格式:fscanf(文件指针,格式控制字符串,输入项表);功能:只能从文本文件中按格式输入。例如,若文件指针fp已指向一个已打开的文本文件,a、b分别为整型变量,则以下语句从fp所指向的文件中读取两个整数放入变量a和b中:fscanf(fp,"%d%d",&a,&b);注意:语句fscanf(stdin,"%d%d",&a,&b);等价于scanf("%d%d",&a,&b);stdin代表终端键盘15西华大学电气信息学院郑海春格式化I/O函数(fscanf和fprintf)fprintf函数函数格式:fscanf(文件指针,格式控制字符串,输出项表);功能:将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中。例如,若文件指针fp已指向一个已打开的文本文件,x、y分别为整型变量,则以下语句把x和y两个整型变量中的整数按%d格式输出到fp所指向的文件中:fprintf(fp,"%d%d",x,y);注意:语句fprintf(stdout,"%d%d",x,y);等价于printf("%d%d",x,y);stdout代表终端键盘16西华大学电气信息学院郑海春#include"stdio.h"voidmain(){ FILE*fp; inti=3;floatt=4.5; fp=fopen("file_c.dat","w");fprintf(fp,"%d,%6.2f",i,t); fclose(fp);}17西华大学电气信息学院郑海春#include<stdio.h>main(){chars[80],c[80];inta,b;FILE*fp;if((fp=fopen("test","w"))==NULL){puts("can'topenfile");exit(0);}fscanf(stdin,"%s%d",s,&a);/*readfromkeyboard*/fprintf(fp,"%s%d",s,a);/*writetofile*/fclose(fp);if((fp=fopen("test","r"))==NULL){puts("can'topenfile");exit(0);}fscanf(fp,"%s%d",c,&b);/*readfromfile*/fprintf(stdout,"%s%d",c,b);/*printtoscreen*/fclose(fp);}18西华大学电气信息学院郑海春字符串I/O函数(fgets和fputs)fgets函数函数原型:char*fgets(char*s,intn,FILE*fp);功能:fgets从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束读入)返回值:fgets正常时返回s的首地址;出错时返回NULLfputs函数函数原型:

intfputs(char*s,FILE*fp)功能:fputs把s指向的字符串写入fp指向的文件返回值:成功,返回0;失败,返回EOF。19西华大学电气信息学院郑海春注意:用fputs函数进行输出时,字符串中最后的‘\0’并不输出,也不自动加‘\n’(这一点不同于puts函数)。因此调用fputs函数输出字符串时,文件中各字符串首尾相接,它们之间将不存在任何间隔符。20西华大学电气信息学院郑海春数据块I/O函数(fread和fwrite)fread函数函数原型:intfread(char*buffer,unsignedsize,unsignedcount,FILE*fp);功能:fread函数用来读取二进制文件。fwrite函数函数原型:intfwrite(char*buffer,unsignedsize,unsignedcount,FILE*fp);功能:fwrite函数用来向二进制文件写入数据。说明:buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针21西华大学电气信息学院郑海春#include<stdio.h>voidmain(){ FILE*fp; intx=10000; fp=fopen("binary1.dat","wb"); fwrite(&x,sizeof(x),1,fp); fclose(fp); fp=fopen("binary2.dat","w"); fprintf(fp,"%d",x); fclose(fp);}22西华大学电气信息学院郑海春例从键盘输入4个学生数据,把他们转存到磁盘文件中去#include<stdio.h>#include<stdlib.h>#defineSIZE2structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];voidsave(){FILE*fp;inti;if((fp=fopen("stu_dat","wb"))==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1) printf("filewriteerror\n");fclose(fp);}23西华大学电气信息学院郑海春voiddisplay(){FILE*fp;inti;if((fp=fopen("stu_dat","rb"))==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structstudent_type),1,fp); printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num, stud[i].age,stud[i].addr);}fclose(fp);}voidmain(){inti;for(i=0;i<SIZE;i++) scanf("%s%d%d%s",stud[i].name,&stud[i].num ,&stud[i].age,stud[i].addr);save();display();}24西华大学电气信息学院郑海春fseek函数函数原型:fseek(FILE*fp,longoffset,intwhere)功能:改变文件位置指针的位置文件指针位移量(以起始点为基点,移动的字节数)>0

向后移动<0

向前移动起始点文件开始SEEK_SET0文件当前位置

SEEK_CUR1文件末尾SEEK_END2例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);ftell函数函数原型:longftell(FILE*fp)功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L,例磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示main(){inti;

温馨提示

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

最新文档

评论

0/150

提交评论