




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、11.1 文件概述 11.2 标准文件操作 11.3 非标准文件操作,第十一章 文件,11.1 文件概述,文件是指存放在外存储器上的信息的集合。 文件按照保存的内容可区分为程序文件和数据文件。 数据文件的存储形式 字符文件或文本文件(ASCII文件) 以字符形式存储数据(按数据的ASCII形式存储) 二进制文件 按数据在内存中的二进制代码形式存储,数据文件的两种存储形式,文本文件和二进制文件,字符文件的每1个字节存储1个字符,因而便于对字符进行逐个处理,便于阅读。但一般占用存储空间较多,而且要花费转换时间,即ASCII码与二进制之间的转换(输入时,需要先把字符转换成二进制形式,才能存入内存;输
2、出时,需要先把数据转换成字符代码再输出)。 二进制文件可以节省存储空间和转换时间(不需要进行二进制和字符ASCII码之间的转换),但1个字节并不对应1个字符,不能直接输出字符形式。,文本文件和二进制文件的比较,从时间和空间的要求角度考虑,一般选择二进制文件 但如果数据是作为文档使用阅读的,应采用字符文件,它们可以方便地通过显示器或打印机直接输出。,相对于内存而言,磁盘是慢速设备,在C语言的文件操作中,如果每向磁盘写入一个字节或读出一个字节的数据,都要启动磁盘操作,将会大大降低系统的效率,而且还会降低磁盘驱动器的使用寿命。,标准文件与非标准文件,因此,在文件系统中,往往使用缓冲技术,即系统在内存
3、中为每个正在读写的文件开辟一个“缓冲区”,利用缓冲区完成文件的读写操作。,当从内存向磁盘输出数据时,首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。,1、标准文件系统:利用缓冲区对磁盘文件进行操作的文件系统称为缓冲(或高层)文件系统,用户使用方便。 2、非标准文件系统:不使用缓冲区的磁盘文件系统称为非缓冲(或低层)文件系统。编程难度较大,但程序的执行效率高,占用内存资源较少。,标准文件与非标准文件,在C语言中,无论是使用标准文件系统还是非标准文件系统,都是利用I/O库函数完
4、成文件操作的。,文件的存取方式,标准I/O提供了4种文件存取方法 读写一个字符 读写一个字符串,将多个字符组成的字符串写入文件或从文件中读出。 格式化读写,根据格式控制指定的数据格式对数据进行转换存取。 成块读写,也称做按记录读写。,文件的存取方式,4种存取方式和C语言的对应的函数关系:,要建立或调用一个磁盘文件,必须了解以下的信息: 文件当前的读写位置 与该文件对应的内存缓冲区的地址 文件操作的方式 是文本文件还是二进制文件 等等,11.2 标准文件操作,一、标准文件FILE结构指针,2、标准文件系统借助FILE数据结构对文件进行管理,利用文件指针读写文件。 每当程序成功打开一个文件,系统就
5、在内存建立一个与该文件对应的FILE结构体变量,并返回该变量的指针(地址)。,标准文件系统在内存中为每一个文件开辟一个“文件信息区”,用来存放文件的上述有关信息。 这些信息保存在一个结构体变量中,该结构体类型是由系统定义的,取名为FILE。,3、在程序中定义一个文件指针变量,用以保存已打开文件所对应的FILE结构在内存的地址,此后用户程序就可用此FILE指针来实现对指定文件的存取操作。 定义文件指针变量的一般形式为: FILE *文件结构指针变量名 例如:FILE *fp; 注意: 1)只有通过文件指针,才能调用相应的文件。 2)对文件操作的库函数,函数原型均在头文件stdio.h中。 3)文
6、件操作的过程:对磁盘文件的操作必须“先打开,再 读写,最后关闭”。,FILE 类型定义,typedef struct short level; /*缓冲区满空程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*无缓冲则不读取字符*/ short bsize; /*缓冲区大小*/ unsigned char *buffer; /*数据缓冲区*/ unsigned char *curp; /*当前位置指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效
7、性检查*/ FILE;,“打开”文件的含义:以某中方式从磁盘上查找指定的文件或 创建一个新文件。 1. 文件的打开fopen()函数 形式: FILE * fopen( char *filename,char *mode); filename: 文件名(可以包含驱动器、路径、文件名、扩展名) mode: 打开方式 FILE *:返回值1)如果成功打开,返回一个指向被打开文件的文件信息区 的起始地址; 2)如果打开失败,返回一个NULL指针(其值在头文件stdio.h中被定义为) 。,二、标准文件的打开操作,2.文件打开模式,3、说明: 1) 用“r”方式打开的文件应该已经存在,如果不存在则打开
8、失败; 2) 用“w”方式打开的文件,如果不存在该文件,则新建立一个; 如果存在该文件,则在打开时将该文件删去,然后重新建立一个新文件; 3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”追加方式打开;,为增强程序的可靠性,常用下面的方法打开一个文件: if(fp=fopen(文件名,操作方式)=NULL) printf(can not open this filen); exit(0); 关于exit( )函数 1)用法:void exit( 程序状态值 ); 2)功能:关闭已打开的所有文件,结束程序运行,并将“程序状态值”返回给操作系统。 当“程序状态值”为时(ex
9、it(0),表示程序正常退出; 为非值时(如exit(1) ,表示程序出错退出。,三、标准文件的关闭,程序对文件的读写操作完成后,必须关闭文件,以保证文件的完整性。,格式: fclose(文件指针); 1、fclose(fp); 关闭 fp所指的文件,并返回一个整数值。 若成功地关闭了文件,则返回一个0值;否则返回一 个非零值。 2、fcloseall( ); 同时关闭程序中已打开的多个文件(标准设备文件除 外),将各文件缓冲区未装满的内容写到相应的文件中 去,并释放这些缓冲区,返回关闭文件的数目。,四、标准文件的读、写操作,1、字符读写函数 fgetc( ) 和fputc( ) int fg
10、etc(FILE *fp)-从fp所指的文件中读一个字符,返回读得的字符。int fputc(int c, FILE *fp)-把字符c写入fp所指的文件 对于文本文件,遇文件结尾时返回EOF,用if(fgetc(fp1)=EOF)判别是否遇文件结尾 。 (EOF在头文件stdio.h中被预定义为-1)。 对于二进制文件,用if( feof(fp)=1) 判别是否遇文件结尾。如果feof(fp)=1说明遇文件结尾。,例1(1)函数fopen()、fclose()、fgetc()和fputc()的使用,#include stdio.h main( ) FILE *fp1,*fp2; char c
11、h; fp1=fopen(“d:data1.txt”, r” ); if(fp1=NULL) printf(can not open this filen); exit(0); fp2=fopen(“d:data2.txt”, “w”); /*若以“a”方式?*/ if(fp2=NULL) printf(can not open this filen); exit(0); ch=fgetc(fp1); while(ch!=EOF) fputc(ch,fp2); ch=fgetc(fp1); fclose(fp1); fclose(fp2); ,例1(2)函数fopen()、fclose()、f
12、getc()和fputc()的使用,#include stdio.h main( ) FILE *fp1,*fp2; char file120,file220, ch; printf(input file1s name:); scanf(%s,file1); fp1=fopen(file1,r); if(fp1=NULL) printf(can not open filen); exit(0); ,printf(input file2s name:); scanf(%s,file2); fp2=fopen(file2,w); if(fp2=NULL) printf(can not open f
13、ilen); exit(0); ch=fgetc(fp1); while(ch!=EOF) fputc(ch,fp2); ch=fgetc(fp1); fclose(fp1); fclose(fp2); ,2、字符串读写库函数 fgets( )和fputs( ) fgets( )从文件中读出一个字符串 1)用法: char * fgets(char *str, int n, FILE *fp); 2)功能:从fp所指的文件中读n-1个字节到str,str最后一个字节加0。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。 fputs( )向fp所指文件写入一个字符串 1)用法: in
14、t fputs(const char *str, FILE *fp) 2)功能:把str写入fp所指的文件。,例2、函数fputs( )和fgets( )的使用 #include main( ) FILE *fp; char str120=“string”,str220; fp=fopen(“d:data1.txt,w+); if(fp=NULL) printf(“can not open this filen); exit(0); fputs(str1,fp); rewind(fp); /*用于把文件指针移到文件的开头。*/ fgets(str2,strlen(str1)+1,fp); pr
15、intf(%s,str2); fclose(fp); ,3、格式化读写函数 fscanf和fprintf 形式: fscanf (文件指针,格式控制,变量地址列表); fprintf(文件指针,格式控制,变量列表); 除增加“文件指针”外,与scanf()和printf()函数的功能相似。 例如: . int i=3; float f=9.80; . fprintf(fp,%2d,%6.2f, i, f); . fprintf()函数的作用是,将变量i按%2d格式、变量f按%6.2f格式,以逗号作分隔符,输出到fp所指向的文件中:3,9.80(表示1个空格)。,例3、函数fscanf( )和f
16、printf( )的使用,main( ) FILE *fpr,*fpw; int j; fpr=fopen(d:data1.txt,r); fpw=fopen(d:data2.txt,“w); if(fpr=NULL | fpw=NULL) printf(can not open filen); exit(0); ,#define N 3 #include struct student int num; char name10; int score; ; struct student stuN;,for(j=0;jN;j+) fscanf(fpr,%d%s%d, ,int fwrite(voi
17、d *buffer, unsigned size, unsigned count, FILE *fp); /* 功能:将buffer地址开始的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。 */ struct student long num; char name10; int age; ; struct student stu3;,4、读写一个数据块fread()fwrite(),for(j=0;jnumber;j+) fwrite( /*功能:从文件fp中读入count次,每次读size字节,读入的信息 存在buffer指针指向
18、的缓冲区。函数返回值等于实际读入的次 数(可能少于count)。*/ struct student long num; char name10; int age; ; struct student test3; 作用:按数据项(即数据块)进行操作,通过它们可以方便地对程序中的数组、结构体数据进行整体输入输出。函数操作完成后,将返回读出或写入的数据项项数。,for(j=0;jnumber;j+) fread(,文件读写函数的选用原则:,从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读写操作。但为方便起见,依下列原则选用: 1)读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。 2)读/写1个字符串时:选用fgets()和fputs()函数。 3)整体读/写结构体或数组时:选用fread()和fwrite()函数。 4)读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。,文件的操作步骤: 1)定义文件指针(FI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 14496-10:2025 EN Information technology - Coding of audio-visual objects - Part 10: Advanced video coding
- 单位工程划分课件编写
- 赫山区考编数学试卷
- 黄陂四年级数学试卷
- 汉中龙岗初一数学试卷
- 2025年山东省齐河县一中高一物理第二学期期末质量跟踪监视模拟试题含解析
- 2025年中国旋转吊具行业市场发展前景及发展趋势与投资战略研究报告
- 2025年卫浴树脂项目可行性分析报告
- 2025年高空作业车项目投资分析及可行性报告
- 高炉布袋除尘器项目投资可行性研究分析报告(2024-2030版)
- 【诗歌鉴赏】2025届高三下4月名校模考试题
- 口腔科针刺伤处理流程
- 鸡蛋库房管理制度
- 小学生书法知识讲座课件
- 新能源汽车故障诊断技术 教案 教案4- BMS故障诊断检修
- 北师大版五年级下册数学口算题题库1200道带答案可打印
- 完整版高中古诗文必背72篇【原文+注音+翻译】
- 空天地协同网络的边缘计算与资源分配的优化策略与实践
- 普通话测试命题说话(2024年新版)50则
- 《工业机器人编程》课件 任务2 单工件搬运任务实现
- 2025年传染病防控技能竞赛笔试理论考试题库600题(附答案)
评论
0/150
提交评论