第8章文件计算机科学技术学院_第1页
第8章文件计算机科学技术学院_第2页
第8章文件计算机科学技术学院_第3页
第8章文件计算机科学技术学院_第4页
第8章文件计算机科学技术学院_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 文件长春理工大学计算机科学技术学院主要内容8.1 文件的有关概念8.2 流的创建与撤销8.3 文件的顺序读写8.4 文件的随机读写8.5 文件操作的出错检测8.1 文件的有关概念8.1.1 文件及其分类 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。 程序设计有关的文件分类:源程序文件、目标程序文件、可执行程序文件和数据文件等。 本章主要讨论数据文件,即如何将程序处理的数据组织成文件保存到外部介质上,以及怎样从外部介质上读取这些数据。使用数据文件的目的1、数据文件的改动不引起程序的改动程序与数据分离2、不同程序可以访问同一数据文件中的数据数据共享3、能长期保存程序运行的中

2、间数据或结果数据8.1 文件的有关概念文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成(语言将文件看作是由一个一个字节组成的)。按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件: ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放8.1 文件的有关概念如 short型数100000010011100010000内存存储形式0010011100010000二进制形式00 0000001100000011000

3、0ASCII形式文本文件特点:占用空间大、速度慢、便于对字符操作二进制文件特点:占用空间小、速度快、便于存放中间结果8.1 文件的有关概念8.1.2 文件名 一个文件必须有一个文件名。文件名包括三部分:文件路径、文件名主干和文件名后缀。 文件路径表明文件的存储位置。如 f:exe3file1.txt 在C语言程序中,由于反斜杠符()是作为转义字符的起始符号,因此如果想用反斜杠符时要用两个反斜杠符表示。即要写成 f:exe3file1.txt8.1.3 文件的位置指针与读写方式 为了进行读写,系统要为每个文件设置一个位置指针,用于指向当前的读写位置。 当要进行读或写时,文件的位置指针的初始值为文

4、件头。 当要为文件追加数据时,文件的位置指针指向文件尾。 在ASCII文件中,通常,每进行一次读或写,位置指针就自动加1,指向下一个字符位置,为下一次读或写作准备,形成顺序读写方式。8.2 流的创建与撤销 8.2.1 FILE类型指针 FILE类型 FILE类型指针 标准文件8.2.1 FILE类型指针FILE结构体类型 缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构体描述FILE定义在stdio.h中typedef struct short level; /* 缓冲区“满”或“空”的程度 */ unsigned flags; /* 文件状态标志*/

5、char fd; /* 文件描述符 */ unsigned char hold; /* 如无缓冲区不读取字符 */ short bsize; /* 缓冲区大小*/ unsigned char *buffer; /* 缓冲区的位置 */ unsigned char *curp; /* 指针,当前的指向 */ unsigned istemp; /* 临时文件,指示器 */ short token; /* 用于有效性检查 */ FILE; FILE类型指针指针变量说明: FILE *fp;用法:文件打开时,系统自动开辟文件结构体变量,用来存放文件的相关信息,并把该变量的指针返回来,程序通过这个指针获

6、得文件信息,访问文件。文件关闭后,它的文件结构体变量被释放。8.2.1 FILE类型指针程序数据区输入缓冲区输出缓冲区外部介质文件处理方法缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区缓冲文件系统:8.2.2 流 建立了与文件相应的流,与该文件相应的文件结构体变量(即文件的信息区)才会有具体的值,FILE类型的指针也就会指向相应的文件的结构体变量。文件1的信息区fp1文件2的信息区fp2文件3的信息区fp38.2.2 流C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件-文件读/写-关闭文件8.

7、2.3 文件的打开与关闭流的创建与撤销8.2.3 文件的打开与关闭流的创建与撤销1. 文件的打开 fopen (文件名,文件操作方式);功能:按指定方式打开文件返回值:正常打开,返回一个FILE类型的指针值;打开失败,为NULL值。操作方式操作方式符号对文本文件对二进制文件读打开rrb写生成wwb追加aab读写打开r+rb+/r+b读写生成w+wb+/w+b读写追加a+ab+/a+b8.2.3 文件的打开与关闭流的创建与撤销文件操作方式例 文件打开与测试 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp=NULL) printf(“File open error!n”

8、); exit(0); 例 FILE *fp; char *filename=“test.dat” fp= fopen(filename,”r”); 例 FILE *fp; fp= fopen (“test.dat”, “r”); 8.2.3 文件的打开与关闭流的创建与撤销2. 文件的关闭 fclose(文件指针变量)功能:关闭fp指向的文件返值:正常关闭为0;出错时,非0作用:使文件指针变量与文件“脱钩”,释放文件结构体变量,指针变量也不再指向该文件。例如: FILE *fp; fp=fopen(data.c,r); fclose(fp);/*关闭fp所指向的文件*/8.2.3 文件的打开与

9、关闭流的创建与撤销8.3 文件的顺序读写8.3.1 文件的字符读写8.3.2 文件的字符串读写8.3.3 文件的格式化读写8.3.4 文件的记录读写8.3.1 文件的字符读写 fputc调用方式: fputc( ch, fp)功能:把ch中一个字符写入fp指向的文件中返值:正常,返回所写字符;出错,为EOF(-1)fgetc调用方式: fgetc(fp)功能:从fp指向的文件中读取一个字符返值:正常,返回读取的字符;读到文件尾或出错,为EOF8.3.1 文件的字符读写#include #include int main(void)FILE *fp;int ch;if (fp=fopen(“f:

10、C3exfile1.txt”,”w”)=NULL)printf(“cannot open this file.n”);exit(1);while (ch=getchar()!=n)fputc(ch,fp);fclose(fp); return 0;运行情况如下,当键入: I love China.时,这些字符将逐个被输出到磁盘文件file1.txt中。例8.18.3.1 文件的字符读写#include #include int main(void)FILE *fp;char ch;if ( fp=fopen(“f:C3exfile1.txt”,”r”)=NULL) printf(“cannot

11、 open this file.n”); exit(1); while ( ch=fgetc(fp)!=EOF) putchar(ch);fclose(fp);return 0;程序运行显示如下结果:I love China.例8.2while (!feof(fp) ch=fgetc(fp); putchar(ch);fgets(s, n,fp)fputs(s,fp)功能:从fp指向的文件读/写一个字符串返值:fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLfputs正常时返回非负值;出错为EOFfgets从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个0(若读

12、入n-1个字符前遇换行符或文件尾(EOF)即结束)调用方式:fputs把s指向的字符串写入fp指向的文件fputs(china,fp);fgets(str,n,fp);8.3.2 文件的字符串读写8.3.2 文件的字符串读写#include #include #include int main(void)FILE *fp;char string81;if (fp=fopen(“f:C3exefile2.txt”,”w”)=NULL) printf(“cant open file”);exit(1); while (strlen (gets(string)0) fputs(string, fp)

13、;fputs(“n“,fp);fclose(fp);return 0;例8.5fscanf(文件指针,格式字符串,地址表);fprintf(文件指针,格式字符串,输出表);功能:按格式对文件进行I/O操作返值:成功,返回I/O的个数;出错或文件尾,返回EOF例 fprintf(fp,“%d,%6.2f”,i,t); /将i和t按%d,%6.2f格式输出到fp文件 fscanf(fp,“%d,%f”,&i,&t); /若文件中有3,4.5 ,则将3送入i, 4.5送入t调用方式:8.3.3 文件的格式化读写#include #include #include int main(void)FILE

14、 * fp;char name20;int num;float score;if (fp=fopen(“f:C3exefile3.txt”,”w”)=NULL)printf(“cant open file”);exit(1); 8.3.3 文件的格式化读写例8.6printf(“type name,num,score:”);scanf(“%s %d %f”,name,&num,&score);while (strlen (name)1)fprintf(fp,“%s %d %f”,name, num, score);printf(“type name, num, score:”); scanf(

15、“%s %d %f”,name, &num, &score);fclose (fp);return 0;8.3.3 文件的格式化读写将数据文件file3.txt的数据读回程序并输出到屏幕上#include #include int main()FILE *fp;char name20;int num;float score;if (fp=fopen(“f:c3exefile3.txt”,”r”)=NULL) printf(“cant open file”); exit(1); while (fscanf(fp, “%s %d %f”,name, &num, &score)!=EOF)print

16、f(“%-20s %6d %6.2fn”, name, num, score);fclose (fp);return 0;8.3.3 文件的格式化读写8.3.4 文件的记录读写fread(buffer, size, count, fp);fwrite(buffer, size, count, fp);功能:读/写数据块返值:成功,返回读/写的块数;出错或文件尾,返回0说明:用法:fp-文件指针。buffer-是一个指针。对fread来说,是读入数据存放地址, 对fwrite来说,是输出数据的地址。size-数据块的字节数。count-要读写多少个size字节的数据块。例 float f2; F

17、ILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);for(i=0;i2;i+) fread(&fi,4,1,fp);例 struct student int num; char name20; char sex; int age; float score3; stud10; for(i=0;i0 前进移动0 后退移动起始点文件开始 SEEK_SET 0文件当前位置 SEEK_CUR 1文件末尾 SEEK_END 2例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); 8.4.1 文件位置指

18、针的定位2. ftell函数用法:fell(文件指针);功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L。8.4.1 文件位置指针的定位3. rewind函数用法: rewind(文件指针);功能:重置文件位置指针到文件开头8.4.1 文件位置指针的定位例 对一个磁盘文件进行显示和复制两次操作#include main() FILE *fp1,*fp2; fp1=fopen(“file1.c,r); fp2=fopen(“file2.c,w); while(!feof(fp1) putchar(fgetc(fp1); rewind(fp

19、1); while(!feof(fp1) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);8.4.1 文件位置指针的定位8.4.2 文件随机读写程序举例例:求文件长度#includestdio.h main() FILE *fp; long length; fp=fopen(“e:wanga.txt”,r); if(fp=NULL) printf(file not found!n); else fseek(fp,0L,SEEK_END); length=ftell(fp); printf(Length of File is %1d bytesn,

20、length); fclose(fp); 以下程序的功能是( )。#includemain() FILE *fp; fp=fopen(“abc.txt, r+); while(!feof(fp) if(fgetc(fp)=*) fseek(fp,-1L,SEEK_CUR); fputc($,fp); fseek(fp,ftell(fp),SEEK_SET); fclose(fp);A. 将abc文件中所有*替换为$ B. 查找abc文件中所有*C. 查找abc文件中所有$ D. 将abc文件中所有字符替换为$A练习题. 下面的程序执行后,文件testxt.t中的内容是( )。 #include

21、 void fun(char *fname,char *st) FILE *myf; int i; myf=fopen(fname,w ); for(i=0;istrlen(st); i+) fputc(sti,myf); fclose(myf); main() fun(test.txt,new world); fun(test.txt,hello,); A. hello, B. new worldhello, C. new world D. hello, rldA用W方式:如果原来不存在该文件,则打开时新建一个文件,如果原来已经存在,则打开时将该文件删除,重新建立一个文件.程序运行后的输出结果是( )。#include main() FILE *fp; int i=20,j=30,k,n; fp=fopen(d1.dat, w); fprintf(fp, %dn,i); fprin

温馨提示

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

评论

0/150

提交评论