




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第八章文件,文件系统概述标准文件操作,2,、文件,文件是存储在外部存储介质上的信息的集合。每个文件有唯一的文件名(主名.后缀)来标识。计算机实现按名对文件进行读、写等有关操作。广义上,操作系统将每一个与主机相联的输入输出设备都看作是文件。(显示器、打印机是输出文件,键盘是输入文件)。,一、文件定义与分类,文件系统概述,3,2、文件的分类,(1)按存储介质:磁盘文件、磁带文件。,(2)按文件的内容:(从程序设计的角度看)源程序、目标文件、可执行文件、数据文件。,(3)按文件的编码方式(存储形式):文本文件、二进制文件。,4,二、数据文件的存储形式,1、字符文件(文本文件):每个字符用一个ASCII码存储(即一个字符占一个字节)。2、二进制文件:以数据在内存中的形式原样存于磁盘。,如:一个短整数(short型),其二进制文件存储方式都是占个字节;而字符文件存储方式所占字节数该数的数字个数。int型数二进制文件字符文件126字节字节1268字节字节,5,例如:整数1268,文本文件形式,1的ASCII码,00110001,00110010,00110110,00111000,二进制文件形式,00000100,11110100,1268的二进制数,2的ASCII码,6的ASCII码,8的ASCII码,6,三.标准文件系统、非标准文件系统,程序数据区,输出文件缓冲区,输入,输入文件缓冲区,输出,输入,磁盘,内存,非标准文件系统:不使用缓冲区的磁盘文件系统,标准c采用缓冲文件系统,其原理图如下:,输出,7,4.文件存取方式,在C语言中,文件的存取有两种方式:,(2)随机存取,(1)顺序存取,8,标准文件操作,一、标准文件类型指针,每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息。这些信息是保存在一个结构体类型的变量中。该结构体类型是由系统定义的,取名为FILE。,1.文件类型指针概述,9,typedefstructshortlevel;unsignedflags;charfd;unsignedcharhild;shortbsize;unsignedchar*buffer;unsignedistemp;shorttoken;FILE;,FILE:一个标准的标识符,但不是关键字,10,如FILE*fp;fp是一个指向FILE类型结构体的指针变量,通过该结构体变量中的文件信息能够访问该文件。如果有N个文件,一般应设N个指针变量,使它们分别指向N个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。,FILE*指针变量标识符;,2.文件型指针变量的定义,11,标准文件操作的四个基本步骤:,1.文件类型指针的定义,2.打开标准文件,3.标准文件的读或写的操作,4.标准文件的关闭操作,12,打开文件,对文件进行读或写,关闭文件,文件的操作步骤,文件打开函数,文件读写函数,文件关闭函数,定义文件类型指针,指针定义,13,二.标准文件的打开,打开文件的含义,将文件信息从磁盘装入计算机内存,建立文件的各种有关信息,并使文件指针指向该文件,即建立文件类型指针与文件名之间的关联.,2.文件的打开函数:fopen,fp=fopen(文件名,使用文件方式);,函数原型:FILE*fopen(char*filename,char*mode);,14,FILE类型指针-成功NULL-失败,fopen()函数的返回值应赋给一个FILE指针变量,否则,此函数的返回值就会丢失,导致无法对此文件进行操作。,例如:FILE*fp;fp=fopen(”A1”,”r”);以上语句表示:要打开名字为A1的文件,使用文件的方式为“读入”,fp指向A1文件。,返回值:,15,文件打开函数的调用给编译系统的三个信息:,1.需要打开的文件名;2.使用文件的操作方式;3.让哪一个指针变量指向被打开的文件。,16,”r”(只读)为输入打开一个文本文件”w”(只写)为输出打开一个文本文件”a”(追加)向文本文件尾增加数据”rb”(只读)为输入打开一个二进制文件”wb”(只写)为输出打开一个二进制文件”ab”(追加)向二进制文件尾增加数据,3.C语言文件操作方式,r:read,w:write,a:append,b:binary,+:读写,17,”r+”(读写)为读/写打开一个文本文件”w+”(读写)为读/写建立一个新的文本文件”a+”(读写)为读/写打开一个文本文件”rb+”(读写)为读/写打开一个二进制文件”wb+”(读写)为读/写建立一个新的二进制文件”ab+”(读写)为读/写打开一个二进制文件,C语言文件操作方式(续),r:read,w:write,a:append,b:binary,+:读写,18,(1)用”r”方式打开的文件只能用于向计算机输入数据,而且该文件应该已经存在;,4.标准文件操作方式的说明(1-5),(2)用”w”方式打开的文件只能用于向该文件写数据,而不能用来向计算机输入。如果不存在该文件,则在打开时建立一个。如果存在该文件,则新写入的数据将覆盖掉以前的数据。,(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用”a”方式打开。,19,(4)用”r+”、”w+”、”a+”方式打开的文件可以用来输入和输出数据。,(5)在程序开始运行时,系统自动打开三个标准文件:标准输入(stdin)、标准输出(stdout)、标准出错输出(stderr)。,4.标准文件操作方式的说明(1-5),20,例:打开C盘根下的myfile.c文件,验证文件能否正确打开.,#includevoidmain()FILE*fa;if(fa=fopen(”c:myfile.c”,”r”)=NULL)printf(“nCannotopenthefile!”);exit(0);/*退出*/elseprintf(”nOpen!”);,?,提示:1.该文件在磁盘上不存在/存在时,比较运行结果。2.将程序中的”r”改为”w”,当该文件在磁盘上不存在/存在时,比较运行结果。,21,三.标准文件的关闭函数:fclose,关闭文件指针fp所指的文件,释放相应的文件信息区.正常关闭文件时,函数返回值为0.,函数原型:intfclose(FILE*fp);,功能:,在使用完一个文件后应该关闭它,以防止它再被误用。,22,函数原型:,四标准文件读写函数,1.读文件字符函数:fgetc,fp是指向所读文件指针变量,intfgetc(FILE*fp);,函数功能:从文件指针fp指向的文件当前位置(位置指针)读出一个字符,然后文件位置指针自动后移,指向文件中的下一个字符,返回值为读入的字符.若遇到文件结束符,则返回结束符EOF(-1).,例:ch=fgetc(fp);,23,例:将磁盘文件”mydata.txt”的信息读出并显示到屏幕上.(假设文件已经存在,若不存在,可以用记事本或其它文本编辑器编辑一个),#includevoidmain()FILE*fp;charc;if(fp=fopen(”mydata.txt”,”r”)=NULL)printf(“nFilenotexist!”);exit(0);while(c=fgetc(fp)!=EOF)putchar(c);fclose(fp);,24,例11.3编写一个程序,实现DOS中的type命令的功能.,#includevoidmain(intargc,char*argv)FILE*fp;charc;if(argcnum,,将整型变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。,如果i=5,t=5.8,则输出到磁盘文件上的是以下的字符串:5,5.80,43,例11.10按指定的格式,将学生信息写入到一个二进制文件stud.dat中.,#includestructstudentcharname10;intnum;intage;charaddr15;boy2,*pp;voidmain()FILE*fp;charch,filename20;inti;gets(filename);pp=boya;,if(fp=fopen(filename,”wb+”)=NULL)printf(”Cannotopenfile!”);getch();exit(1);printf”ninputdatan”);for(i=0;iname,iname,i+,pp+)printf(”%st%5d%7d%sn”,pp-name,pp-num,pp-age,pp-addr);fclose(fp);,程序中结构体的说明参考例11.8,45,五文件的随机读写,移动文件位置指针的操作称为文件的定位.实现随机读写的关键是要按指定的条件进行文件的定位操作。文件定位操作是通过库函数的调用来完成的。,在每个打开的文件中,有一个文件位置指针,它指向将要读写的字符位置。当对文件进行顺序读写时,每读完一个字符,该位置指针就自动移到下一个字符位置。,在实际问题中,常要求读写文件中某些指定的部分。为了避免不必要的读或写的操作,可先移动文件的位置指针到需要读写的位置,再进行读写,这种读写操作方式称为随机读写。,定位,随机读写,顺序读写,46,1.文件指针定位函数:rewind,函数原型:intrewind(FILE*fp);函数功能:把文件指针fp指向文件的内部位置指针移到文件首。,2.文件指针定位函数:fseek,函数原型:intfseek(FILE*fp,longoffset,intpos);函数功能:将文件指针fp指向文件的内部位置指针从pos指定的位置开始移动offset个字节。,47,起始点表示方法,offset为位移量,表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错,当用常量表示位移量时,要求加后缀“l”或“L”.,若offset为负数,表示向文件首方向移动,否则是向文件尾方向移动;,pos为起始点,表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾.,48,例如:fseek(fp,100L,0);文件指针从文件开始处向后移动100个字节fseek(fp,60L,1);文件指针从当前位置向后移动60个字节fseek(fp,-10L,2);文件指针从文件末尾处向前移动10个字节,注意:位移量一般被要求是long型数据,这样当文件的长度大于64K时不致出问题。,49,#include“stdio.h”voidmain()FILE*fp1,*fp2;fp1=fopen(”file1.c”,”r”);fp2=fopen(”file2.c”,”w”);while(!feof(fp1)putchar(getc(fp1);rewind(fp1);while(!feof(p1)putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);,例11.12有一个磁盘文件,第一次使它显示在屏幕上,第二次把它复制到另一文件上。,50,例11.13在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。,#includestructstudent_typecharname10;intnum;int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论