文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt
《文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt》由会员分享,可在线阅读,更多相关《文件操作系统管理数据的基本单位存储在外存储器上的数据的.ppt(61页珍藏版)》请在三一文库上搜索。
1、,文件 操作系统管理数据的基本单位 存储在外存储器上的数据的集合 使用文件的目的 程序与数据分离:数据文件的改动不引起程序的改动 数据共享:不同程序可以访问同一数据文件中的数据 能长期保存程序运行的中间数据或结果数据,第9章 文件操作,本章要求:,掌握C语言中文件的概念 掌握打开文件的不同模式 掌握使用各种操作函数对文件进行读写的方法 能编写与文件有关的程序,本章难点: 掌握文件的各种操作函数,能对文件进行读写数据操作。,本章重点: 掌握文件的各种操作函数,能对文件进行读写数据操作。,第9章 文件操作,9.1.1 文本文件与二进制文件,C语言把文件看作一个字节序列,即由一连串的字节组成,称为“
2、流”,每一个字节都可以单独读取,每一个文件或者以文件结束标志结束,或者在特定的字节号处结束。 按数据的组织形式分类 1、文本文件 又称ASCII文件,每个字节对应一个字符,用于存放该字符的ASCII码,输入输出时对字符逐个处理。 文本文件由文本行组成,每行中可以有0个或多个字符,并以行终止符n结尾,文件结尾是文件结束标志,该标志后再没有字符出现了。 2、二进制文件 数据按其在内存中的存储形式原样存放,00100111 00010000,内存存储形式,00100111 00010000,二进制形式,00110001 00110000 00110000 00110000 00110000,ASCI
3、I形式,文本文件特点: 速度慢、便于对字符操作,二进制文件特点: 速度快、便于存放中间结果,【例】整数10000,9.1.2 缓冲文件系统,缓冲文件系统:系统自动地为每一个正在使用的文件在内存中开辟一个缓冲区。 对输入输出进行缓冲,可以大块地转移信息,而不再是一个个字节进行操作。 内存缓冲区的大小,影响着操作外存的次数。内存缓冲区越大,则操作外存的次数就少,执行速度就快、效率高。,9.1.3 文件类型指针,C语言的缓冲文件系统中,用文件类型指针来表示文件。 定义文件类型指针的一般形式:,FILE *指针变量名;,C编译系统定义的一种结构体类型,其中的成员用于存放有关文件的一些信息(文件名、文件
4、状态和文件当前读写位置等),指针变量用于指向一个文件,实际上是用于存放文件缓冲区的首地址。,FILE结构体是在头文件中定义的,对文件操作的程序,在最前面都应写上文件包含命令: #include C语言通过文件指针变量对文件进行打开、读、写及关闭操作。,FILE结构体类型在头文件stdio.h中定义如下: typedef struct short level; /*文件缓冲区占用程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*若无缓冲区不读取字符*/ short bsize; /*文件缓冲区大小*/
5、 unsigned char *buffer; /*数据缓冲区的位置*/ unsigned char *curp; /*指针当前的位置*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于操作有效性检查*/ FILE; /*文件类型符*/,9.1.3 文件类型指针,在编程时不必关心FILE结构的具体细节,只需在使用I/O函数时用这个文件指针变量来指定所操作的文件。,9.1.3 文件类型指针,在C语言程序中使用文件,需要完成以下工作: 1)声明一个FILE类型的文件指针变量; 2)打开文件: 调用fopen函数将此文件指针变量和某一个实际的磁盘文件相联
6、系。要求指定文件名,并且说明对该文件是输入操作还是输出操作。 3)读写文件: 调用适当的文件操作函数完成必要的I/O操作。 对输入文件来说,函数从文件中将数据读取至程序中; 对输出文件来说,函数将程序中的数据转移到文件中去。 4)关闭文件: 调用fclose函数表明文件操作结束,断开文件指针与实际文件之间的联系。,9.2 文件的打开与关闭,9.2.1 文件的打开,打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件; 缓冲文件系统借助文件指针来对文件进行管理和访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。,“文件名”和“文件打开模式”都是字符串常量或字符数组。,文
7、件指针名=fopen(“文件名“,“文件打开模式“),需要打开的文件的名字,确定文件的 数据操作方式,打开文件使用函数fopen 其调用的一般形式为:,举 例,FILE *fp; fp=fopen(“source.txt“,“r“);,作用: 以读的方式(“r”模式即表示读“read”)打开当前目录下文件名为source.txt的文件。 如果打开文件成功,则返回一个指向source.txt文件信息区的起始地址的指针,并赋值给fp,即fp指向了文件source.txt。其后所有对该文件的操作都必须通过fp指针来实现。 如果文件打开失败,则返回一个空指针NULL,赋值给fp。 说明: 文件名可以包
8、含路径和文件名两部分。 写路径时,因为转义字符以反斜杠开头,所以“”才是表示一个反斜杠。 【例】若路径和文件名为:“c:tcsource.txt”,则应写成“c:tcsource.txt”。,9.2.1 文件的打开,文件的打开模式,9.2.1 文件的打开-模式说明,1)“r”模式: 只能用于输入(读操作),且只能打开一个已经存在的文件。 2)“w”模式: 只能用于输出(写操作)。 如果指定的文件不存在,则新建一个文件; 如果文件存在,则把原来的文件删除,再重新建立一个空白的文件。 3)“a”模式: 用于追加操作。 如果指定的文件不存在,则新建该文件; 如果文件存在,保留该文件原有的数据,在原文
9、件的末尾添加新的数据。 4)打开方式带上“b”表示是对二进制文件进行操作。带上“+”表示既可以读,又可以写。而对待文件存在与否的不同处理则按照“r”、“w”、“a”各自的规定。 5)如果在打开文件时发生错误,即打开失败,fopen返回一个空指针NULL。,文件打开可能出现的错误有: 试图以“读”模式(带“r”的方式)打开一个并不存在的文件; 试图以“写”方式(带“w”或“a”的方式、“r+”或“rb+”方式)打开被设置为“只读”属性的文件。 新建一个文件,而磁盘上没有足够的剩余空间或磁盘被写保护。 用不正确的模式打开一个文件可能会破坏文件的内容。 为避免因上述原因的出错,常用以下的方法来打开一
10、个文件:,9.2.1 文件的打开-模式说明,if(fp=fopen(“source.txt“,“r“)=NULL) printf(“This file could not be opened !n“); exit(0) /*返回操作系统*/ else /*此处编写对文件读/写的代码*/ ,#include ,9.2 文件的打开与关闭,9.2.2 文件的关闭,【例】fclose(fp) 关闭由指针fp指定的文件,同时根据需要刷新缓冲区。 如果文件成功关闭,fclose函数将返回值0,否则返回EOF。,fclose(文件指针变量);,对文件的操作完成后,应确保关闭程序中打开的文件,以避免文件的数据
11、丢失。 关闭文件指断开指针与文件之间的联系,也就禁止再对该文件进行操作。 磁盘已满、磁盘被移走或者出现I/O错误等都会导致fclose函数执行失败。,9.2 文件的打开与关闭,不关闭文件可能会丢失数据,9.3 文件的读写,使用fopen成功打开文件后,都会有属于该文件的一个文件读写位置指针,表示文件内部即将要读写的位置。 文件指针和文件内部的读写位置指针是不同的,9.3.1 文件读写函数概述,9.3 文件的读写,文件指针和文件内部的读写位置指针是不同的 文件指针指向整个文件,在程序中定义,只要不重新赋值,文件指针的值不变。 文件内部的读写位置指针用于指示文件内部的当前读写位置,每读写一次,该指
12、针均自动向后移动,指向下一个读写单元。它不需在程序中定义,由系统自动设置。 以“r”或“w”方式打开文件后,该文件读写位置指针初始值指向文件开头; 以“a”方式打开文件后,该文件读写位置指针初始值指向文件末尾。,9.3 文件的读写,对文件进行读写操作时,需要判断当前读写位置,如果文件读操作到最后,再进行读写操作就会出错。 为了避免出错,C提供了下面的方式判断文件是否读完 1、对于文本文件,结束标记是EOF(即-1,在stdio.h中定义),可以通过读取的字符是不是结束标记来判断文本文件是否读完; 2、对于二进制文件,没有EOF的结束标志,只能使用系统提供的feof函数来判断; 其中,fp是文件
13、指针变量,如果文件读取结束则返回非0值,没结束返回0值。 3、文本文件可使用feof函数按上面形式来判断是否读取结束。,while( !feof(fp) /*此处写入读操作语句*/ ,使用格式是: feof(fp),9.3 文件的读写,9.3.2 字符读写函数,(1)字符读函数fgetc( ) 功能:从指定的文件中读一个字符; 函数调用的一般形式: 字符变量=fgetc(文件指针变量); 【例】 ch=fgetc(fp1); /*从fp1指向的文件中读取一个字符并送入变量ch中*/ 说明: 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的 读取成功返回文件当前位置的一个字符; 读错
14、误时返回EOF。,9.3 文件的读写,9.3.2 字符读写函数,(2)字符写函数fputc( ) 功能:将一个字符写入到指定文件中; 函数调用的一般形式: fputc(字符变量,文件指针变量); 【例】 fputc(ch,fp2); /* 将字符变量ch中的字符写入到fp2所指的文件中 */ 说明: fputc函数也有返回值 若写操作成功,则返回向文件所写的字符; 否则返回EOF,表示写操作失败。,例 9-1 用依次读取字符的方式,将source.txt文件的内容复制到destination.txt文件中。,9.3 文件的读写,void main() FILE *fp1,*fp2; char
15、ch; if(fp1=fopen(“C:source.txt“,“r“)=NULL) printf(“File could not be opened!n“); exit(0); if(fp2=fopen(“C:destination.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); while(ch=fgetc(fp1)!=EOF) fputc(ch,fp2); fclose(fp1); fclose(fp2); ,9.3.3 字符串读写函数,(1)字符串读函数fgets( ) 功能:从指定的文件中读取一个字符串到程
16、序中的字符数组 函数调用的一般形式: 参数n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。因为要在读入的最后一个字符后加上字符串结束标志0。 说明: fgets函数从文件中读取字符直到遇见回车符或EOF为止,或直到读入了所限定的字符数(至多n-1个字符)为止。 函数读成功返回字符数组首地址;失败返回空指针NULL。,9.3 文件的读写,fgets(字符数组名,n ,文件指针);,9.3.2 字符读写函数,(2)字符串写函数fputs( ) 功能:将一个字符串写入到指定文件中 函数调用的一般形式: 字符串可以是字符串常量,也可以是字符数组名,或字符指针变量。 【例】char *ch=
17、“You Are Good!“ fputs(ch,fp2); /* 将字符指针ch指向的字符串写入到文件fp2中 */ 说明: 若函数调用fputs返回值为EOF时,表明写操作失败。,9.3 文件的读写,fputs(字符串,文件指针),例9-2 修改例9-1程序,用读取字符串的方式,将source.txt文件的内容复制到destination.txt文件中。,9.3 文件的读写,void main() FILE *fp1,*fp2; char ch80; if(fp1=fopen(“C:source.txt“,“r“)=NULL) printf(“File could not be opene
18、d!n“); exit(0); if(fp2=fopen(“C:destination.txt“,“w“)=NULL) printf(“File could not be opened!n“); exit(0); while(!feof(fp1) fgets(ch,81,fp1); fputs(ch,fp2); fclose(fp1); fclose(fp2); ,9.3 文件的读写,字符读写函数: fgetc()和fputc() 字符串读写函数:fgets()和fputs() 格式读写函数: fscanf()和fprintf() 数据块读写函数:fread()和fwrite(),9.3.4
19、格式读写函数,(1)格式化读函数fscanf 功能:从指定的文件中按照一定的格式读取数据到程序中 fscanf与scanf功能相似,区别在于fscanf的读取对象是磁盘文件,scanf的读取对象是键盘。 函数调用的一般形式: 其中,格式字符串和输入表列和scanf函数相似。 【例】fscanf(fp,“%5d“, 说明: 函数的返回值若为EOF,表明格式化读错误;否则读数据成功。,9.3 文件的读写,fscanf(文件指针,“格式字符串“,输入表列);,(2)格式化写函数fprintf 功能:把格式化的数据写到指定文件中 fprintf与printf功能相似,区别在于fprintf是向文件中输
20、出,而printf是向屏幕输出。 函数调用的一般形式: 其中,格式控制字符串和输出项列表和printf函数相似。 【例】 fprintf(fp,“%5d“,ai); 说明: 函数的返回值为实际写入文件中的字符个数(字节数); 若写错误,则返回一个负数。,9.3 文件的读写,9.3.4 格式读写函数,fprintf(文件指针,“格式控制字符串“,输出项列表);,例9-3 随机产生20个10,99之间的整数,以每行5个数据输出到文本文件c:data.txt中,要求每个数据占5个宽度,并且数据之间用逗号分隔。然后将其读出按升序排序后,按同样格式追加写在原文件后,与原数据之间空出2行。 编程分析: 采
21、用模块化程序设计 将产生数据、将数据输出到文件、从文件中读取数据,排序和追加数据到文件分别写成GetData( )、PutDataToFile( )、GetDataFormFile( )和sort( )、AppendDataToFile( )函数,9.3 文件的读写,void main() int a20,i; GetData(a,20); PutDataToFile(a,20); /*调用scandata()函数将数据读入到数组a中*/ GetDataFormFile(a,20); sort(a,20); /*调用sort()函数将数组a的数据排序*/ /*调用AppedDataToFile
22、( ) 函数将排序后的数组a的数据写入到文件中*/ AppendDataToFile(a,20); void GetData(int a,int n) int i; srand(time(NULL); /* 初始化随机种子数 */ for(i=0;in;i+) ai=(rand()%90)+10; /* 产生10,99的随机整数 */ ,9.3 文件的读写,void PutDataToFile(int a,int n) int i; OpenFile(“c:data.txt“,“w“); for(i=0;in;i+) if(i%5=0) fprintf(fp,“%5d“,ai); else f
23、printf(fp,“,%5d“,ai); if(i+1)%5=0) fprintf(fp,“n“); fclose(fp); void GetDataFormFile(int a,int n) /* 从文件读数据函数 */ int i; OpenFile(“c:data.txt“,“r“); for(i=0;in;i+) if(i%5=0) fscanf(fp,“%5d“, ,9.3 文件的读写,void sort(int a,int n) int i,j,k,t; for(i=0;iaj)k=j; t=ai; ai=ak; ak=t; void OpenFile(char *file,ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 操作 系统管理 数据 基本单位 存储 在外 存储器
链接地址:https://www.31doc.com/p-2378583.html