下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第八章 文件,文件系统 概述 标准文件操作,2,、文件,文件是存储在外部存储介质上的信息的集合。 每个文件有唯一的文件名(主名.后缀)来标识。计算机实现按名对文件进行读、写等有关操作。 广义上,操作系统将每一个与主机相联的输入输出设备都看作是文件。(显示器、打印机是输出文件,键盘是输入文件)。,一、文件定义与分类,文件系统 概述,3,2、文件的分类,(1)按存储介质: 磁盘文件、磁带文件。,(2)按文件的内容:(从程序设计的角度看) 源程序、目标文件、可执行文件、数 据文件。,(3)按文件的编码方式(存储形式): 文本文件、二进制文件。,4,二、数据文件的存储形式,1、字符文件(文本文件)
2、:每个字符用一个 ASCII码 存储(即一个字符占一个字节)。 2、二进制文件:以数据在内存中的形式原样存于磁盘。,如:一个短整数(short型), 其二进制文件存储方式都是占个字节; 而字符文件存储方式所占字节数该数的数字个数。 int型数二进制文件字符文件 126 字节 字节 1268 字节 字节,5,例如:整数1268,文本文件形式,1的ASCII码,00110001,00110010,00110110,00111000,二进制文件形式,00000100,11110100,1268的二进制数,2的ASCII码,6的ASCII码,8的ASCII码,6,三.标准文件系统、非标准文件系统,程序
3、数据区,输出文件缓冲区,输入,输入文件缓冲区,输出,输入,磁盘,内存,非标准文件系统:不使用缓冲区的磁盘文件系统,标准c 采用缓冲文件系统,其原理图如下:,输出,7,4.文件存取方式,在C语言中,文件的存取有两种方式:,(2)随机存取,(1)顺序存取,8,标准文件操作,一、 标准文件类型指针,每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息。 这些信息是保存在一个结构体类型的变量中。该结构体类型是由系统定义的,取名为FILE。,1.文件类型指针概述,9,typedef struct short level; unsigned flags; char fd; unsigned ch
4、ar hild; short bsize; unsigned char *buffer; unsigned istemp; short token; FILE;,FILE: 一个标准的标识符,但不是关键字,10,如 FILE *fp; fp是一个指向FILE类型结构体的指针变量,通过该结构体变量中的文件信息能够访问该文件。 如果有N个文件,一般应设N个指针变量,使它们分别指向N个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。,FILE *指针变量标识符;,2. 文件型指针变量的定义,11,标准文件操作的四个基本步骤:,1. 文件类型指针的定义,2. 打开标准文件,3. 标准文件
5、的读或写的操作,4. 标准文件的关闭操作,12,打开文件,对文件进行读或写,关闭文件,文件的操作步骤,文件打开函数,文件读写函数,文件关闭函数,定义文件类型指针,指针定义,13,二. 标准文件的打开,打开文件的含义,将文件信息从磁盘装入计算机内存,建立文件的各种有关信息,并使文件指针指向该文件,即建立文件类型指针与文件名之间的关联.,2.文件的打开函数: fopen,fp=fopen(文件名,使用文件方式);,函数原型: FILE *fopen(char *filename,char *mode);,14,FILE类型指针-成功 NULL -失败,fopen( )函数的返回值应赋给一个FILE
6、指针变量, 否则,此函数的返回值就会丢失,导致无法对此文件进行操作。,例如: FILE *fp; fp=fopen(”A1”, ”r”); 以上语句表示: 要打开名字为A1的文件,使用文件的方式为“读入”,fp指向A1文件。,返回值:,15,文件打开函数的调用给编译系统的三个信息:,1. 需要打开的文件名; 2. 使用文件的操作方式; 3 .让哪一个指针变量指向被打开的文件。,16,”r” (只读) 为输入打开一个文本文件 ”w” (只写) 为输出打开一个文本文件 ”a” (追加) 向文本文件尾增加数据 ”rb” (只读) 为输入打开一个二进制文件 ”wb” (只写) 为输出打开一个二进制文件
7、 ”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 ,+: 读写,
8、18,(1 ) 用”r”方式打开的文件只能用于向计算机输入数据,而且该文件应该已经存在;,4. 标准文件操作方式的说明(1-5),(2) 用”w”方式打开的文件只能用于向该文件写数据,而不能用来向计算机输入。 如果不存在该文件,则在打开时建立一个。 如果存在该文件,则 新写入的数据将覆盖掉以前的数据。,(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用”a”方式打开。,19,(4) 用”r+”、 ”w+” 、 ”a+”方式打开的文件可以用来输入和输出数据。,(5) 在程序开始运行时,系统自动打开三个标准文件:标准输入(stdin)、标准输出(stdout)、标准出错输出(s
9、tderr)。,4. 标准文件操作方式的说明(1-5),20,例:打开C盘根下的myfile.c文件,验证文件能否正确打开.,#include void main() FILE *fa; if(fa=fopen(”c:myfile.c”,”r”)=NULL) printf(“n Cannot open the file!”); exit(0); /*退出*/ else printf(” n Open! ”); ,?,提示: 1. 该文件在磁盘上不存在/存在时,比较运行结果。 2. 将程序中的”r”改为”w” ,当该文件在磁盘上不存在/存在时,比较运行结果。,21,三. 标准文件的关闭函数: f
10、close,关闭文件指针fp所指的文件,释放相应的文件信息区. 正常关闭文件时,函数返回值为0.,函数原型: int fclose(FILE *fp);,功能:,在使用完一个文件后应该关闭它,以防止它再被误用。,22,函数原型:,四 标准文件读写函数,1. 读文件字符函数:fgetc,fp是指向所读文件指针变量,int fgetc(FILE *fp) ;,函数功能: 从文件指针fp指向的文件当前位置(位置指针)读出一个字符,然后文件位置指针自动后移,指向文件中的下一个字符,返回值为读入的字符. 若遇到文件结束符,则返回结束符EOF(-1).,例: ch=fgetc(fp);,23,例: 将磁盘
11、文件”mydata.txt”的信息读出并显示到屏幕上.(假设文件已经存在,若不存在,可以用记事本或其它文本编辑器编辑一个),#include void main() FILE *fp; char c; if (fp=fopen( ”mydata.txt” , ”r” )=NULL) printf(“n File notexist!”);exit(0); while(c=fgetc(fp)!=EOF) putchar( c ); fclose(fp); ,24,例11.3 编写一个程序,实现DOS中的type命令的功能.,#include void main(int argc,char *arg
12、v) FILE *fp; char c; if (argc2)printf(”n NO file name”); exit(0); if (fp=fopen( ”mydata.txt” , ”r” )=NULL) printf(” n File not exist! ”);exit(0); while(c=fgetc(fp)!=EOF) putchar( c ); fclose(fp); ,25,2 . 文件写入字符函数: fputc,函数返回值: 输出成功, 返回值就是输出的字符; 输出失败, 返回一个EOF(值为-1)。,功能:把一个字符ch写到fp指向的磁盘文件上去。,函数原型:,int
13、 fputc(int ch, FILE *fp);,例: FILE *fp; char ch= A; fputc(ch,fp),26,putchar函数就是从fputc函数派生出来的。 putchar(c)是用#define定义的宏: # define putchar( c ) fputc(c,stdout),同理,getchar函数是从fgetc函数派生出来的。 getchar(c)是用#define定义的宏: # define getchar( c ) fgetc(stdin),注,27,例11.4 从键盘输入一些字符存到一个磁盘文件data.dat中,以“#” 结束。,#include
14、void main() FILE *fp; char c; if (fp=fopen( ”data.dat” , ”w” )=NULL) printf(” n File cannot open! ”);exit(0); while(c=getchar( )!=”#” ) fputc ( c,fp ); fclose(fp); ,28,例11.5 将文件filea.dat的内容复制到文件fileb.dat中。,#include void main() FILE *f1,*f2; if (f1=fopen( ”filea.dat” , ”r” )=NULL) printf(” n File can
15、not open! ”);exit(0); if (f2=fopen( ”fileb.dat” , ”w” )=NULL) printf(” n File cannot creat! ”);exit(0); while(c=fgetc(f1 )!=EOF ) fputc ( c,f2 ); fclose(f1); fclose(f2); ,29,3. 读文件字符串函数:fgets,从指针 fp指向的文件中读取 len 1 个字符,把它送到由指针buf 指向的字符数组中。,char * fgets ( char * buf , int len , FILE *fp) ;,函数原型:,函数功能:,
16、字符数组的长度应大于len,可存放len-1个字符,字符数组的最后一个元素为0.,若在读入len-1个字符前遇到换行符n或文件结束符号EOF,立即结束读入操作.,30,例11.6 利用函数fgets,将文本文件filea.txt中的内容全部读出并显示在屏幕上。,分析:,(1)一般地,文本文件以行为单位,每行最多80个字符,再加上一个行结束符号即换行符n,则每行至少需要81个字节的存储空间。 (2)使用函数fgets读取字符串时,若在读入len-1个字符完成之前遇到换行符n或文件结束符号EOF,立即结束读入操作。无论读入的字符是否等于或小于len-1个,函数为读入的字符串之后加一个0。因此,读入
17、的字符(包括0)只有len个。 (3)定义文件指针。 (4)以只读方式打开文件。 (5)当文件未结束时,反复读出字符串并输出。 (6)关闭文件。,31,#include void main() FILE *fp; char str81; if(fp=fopen(”aa.txt”,”rt”)=NULL) printf(”Cannot open file!”); getchar();exit(1); while(fgets(str,81,fp)!=NULL) puts(str); fclose(fp); ,例: 利用函数fgets,将文本文件filea.txt中的内容全部读出并显示在屏幕上。,32
18、,4. 将字符串写入文件的函数: fputs( ),char * fputs ( char * buf, FILE * fp ) ;,把由指针buf 指向的字符数组中的字符串写入由指针 fp指向的文件中。,buf :字符串常量,字符数组名,指针变量,函数原型:,函数功能:,#include void main() FILE *fp; char buf 81; if( (fp=fopen(”data.txt”, ”a” ) = =NULL) printf(” File cannot open! ” );exit(0); while (fgets(buf,81,stdin)!=NULL ) fpu
19、ts(buf,fp); fclose(fp); ,例 从键盘输入若干行字符,将它们添加到磁盘文件data.txt中.,34,5. 数据块读写函数:fread和fwrite,buffer:是一个指针。 对于fread,它是读入数据的存放地址。 对于fwrite,是要输出数据的地址(起始地址)。 size: 要读写的字节数。 count:要进行读写多少个size字节的数据项。 fp: 文件型指针。,int fread(void *buffer,int size,int count,FILE *fp);,int fwirte(void *buffer,int size,int count,FILE
20、(fp);,函数原型:,35,例11.8 从键盘输入两个学生的信息,写入磁盘文件student.dat中.,分析: (1)建立学生信息的结构体。 (2)定义文件指针。 (3)打开指定的文件。 (4)将学生信息写入文件。 (5)关闭文件。,36,#include sstruct student char name10; int num; int age; char addr15; boy2, *pp; #define size sizeof(struct student),37,void main() FILE *fp; char ch,filename20; int i; gets(filen
21、ame); /*输入文件名*/ fp=fopen(filename,”wb+”); /*以读写方式打开二进制文件,也省略了检测*/ printf(”ninput datan”); pp=boy; for(i=0;iname,,将整型变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。,如果i=5,t=5.8,则输出到磁盘文件上的是以下的字符串: 5, 5.80,42,例11.10 按指定的格式,将学生信息写入到一个二进制文件stud. dat中.,#include struct student char name10; int num; int age; char addr1
22、5; boy2,*pp; void main() FILE *fp; char ch, filename20; int i; gets(filename); pp=boya;,if(fp=fopen(filename,”wb+”)=NULL) printf(”Cannot open file!”);getch();exit(1); printf ”ninput datan”);for(i=0;iname,iname,i+,pp+) printf(”%st%5d%7d%sn”, pp-name,pp-num,pp-age, pp-addr); fclose(fp); ,程序中结构体的说明参考例1
23、1.8,44,五 文件的随机读写,移动文件位置指针的操作称为文件的定位. 实现随机读写的关键是要按指定的条件进行文件的定位操作。文件定位操作是通过库函数的调用来完成的。,在每个打开的文件中,有一个文件位置指针,它指向将要读写的字符位置。当对文件进行顺序读写时,每读完一个字符,该位置指针就自动移到下一个字符位置。,在实际问题中,常要求读写文件中某些指定的部分。为了避免不必要的读或写的操作,可先移动文件的位置指针到需要读写的位置,再进行读写,这种读写操作方式称为随机读写。,定位,随机读写,顺序读写,45,1. 文件指针定位函数:rewind,函数原型: int rewind(FILE *fp);
24、函数功能: 把文件指针fp指向文件的内部位置指针移到文件首。,2.文件指针定位函数:fseek,函数原型: int fseek(FILE *fp,long offset,int pos); 函数功能: 将文件指针fp指向文件的内部位置指针从pos指定的位置开始移动offset个字节。,46,起始点表示方法,offset为位移量,表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错,当用常量表示位移量时,要求加后缀“l”或“L”.,若offset为负数,表示向文件首方向移动,否则是向文件尾方向移动;,pos为起始点,表示从何处开始计算位移量,规定的起始点有三种:文
25、件首,当前位置和文件尾.,47,例如: fseek(fp,100L,0); 文件指针从文件开始处向后移动100个字节 fseek(fp,60L,1); 文件指针从当前位置向后移动60个字节 fseek(fp,-10L,2); 文件指针从文件末尾处向前移动10个字节,注意:位移量一般被要求是long型数据,这样当 文件的长度大于64K时不致出问题。,48,#include “stdio.h” void main() FILE *fp1,*fp2; fp1=fopen(”file1.c”, ”r”); fp2=fopen(”file2.c”, ”w”); while(!feof(fp1) putc
26、har(getc(fp1); rewind(fp1); while(!feof(p1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); ,例11.12 有一个磁盘文件,第一次使它显示在屏幕上,第二次把它复制到另一文件上。,49,例11.13 在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。,#include struct student_type char name10; int num; int age; char sex; stud10;,50,void main() int i; FILE
27、*fp; if (fp=fopen(stud.dat, rb)=NULL) printf(cannot open filen); exit(0); ,51,for(i=0;i10;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread( ,52,六. 文件的检测函数,1文件结束检测函数feof 函数原型:int feof(FILE *fp); 函数功能:判断fp指向的文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。,2文件出错检测函数ferror 函数原型: int ferror(FILE *fp); 函数功能:检查文件fp在
28、用各种输入输出函数进行读写时是否出错。若出错,返回值为1,否则返回0。,3文件出错标志和文件结束标志置0函数clearerr函数 函数原型:int clearerr(FILE *fp); 函数功能:用于清除出错标志和文件结束标志,使它们为0值。,53,12.3 非标准文件操作,标准文件的输入和输出称为高层I/O。,非标准文件的输入和输出称为低层I/O。,在非标准文件系统中,系统不会自动提供文件缓冲区,没有FILE文件指针,读写文件时和文件联系的是一个整数,称为文件号,54,一. 非标准文件的打开、关闭,1打开文件函数open,函数原型: int open(char *filename,int
29、mode); 函数功能: 按mode指定的方式打开名为filename的文件,打开成功,函数返回一个正整数称为文件号,否则返回-1。filename是任意DOS文件名,可以是字符串常量或变量;mode是打开方式,可以用相应的符号常量或文件号 .,常用mode打开方式,55,例如: fp=open(”ABC”, O_WRONLY); 或 fp=open(”ABC”,2); 表示以只写方式打开一个名为”ABC”的文件. 若文件打开成功,将文件号赋给fd,否则fd为-1。,函数open与函数fopen相似,都是打开文件。,两者的区别:,fopen是一个高级库函数,功能比open强。,open是系统调用,是一个低级的内部函数,直接进入操作系统处理,56,2关闭函数close 函数原型: int close(int fd); 函数功能: 用于关闭文件。其中,fd为文件号。若关闭文件成功返回0,否则返回-1。,57,二. 非标准文件的读与写操作,1. 读取数据函数read 函数原型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地震应急预案流程
- 设计专业招生分享
- 2026急性胃炎护理查房
- 蝴蝶主题毕业服装设计开发
- 2026癫痫患者的护理解读
- 过渡界面设计细部
- 创新美术荷花课件
- 诚信教案设计
- 美术鱼化石艺术演变解析
- 数据分析数学活动实施纲要
- 雨课堂学堂在线学堂云《国学通论(吉大 )》单元测试考核答案
- 科研助理聘用协议书
- 2025年国家义务教育质量监测小学四年级劳动教育模拟测试题及答案
- 2025年生物会考成都真题及答案
- 2024集中式光伏电站场区典型设计手册
- 新媒体伦理与法规-形成性考核一(第1-3章权重15%)-国开-参考资料
- GB/T 46075.3-2025电子束焊机验收检验第3部分:电子束电流特性的测量
- 生物医药创新药物研发成本效益可行性研究报告
- 24节气固元灸课件
- 青田县小溪流域仁宫至巨浦段综合治理工程项目环评报告
- 仪表联锁培训课件
评论
0/150
提交评论