C语言程序设计教程(第2版)-课件 第10章 文件_第1页
C语言程序设计教程(第2版)-课件 第10章 文件_第2页
C语言程序设计教程(第2版)-课件 第10章 文件_第3页
C语言程序设计教程(第2版)-课件 第10章 文件_第4页
C语言程序设计教程(第2版)-课件 第10章 文件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

10.1文件的有关概念

实际应用中,信息的输入与输出不仅是键盘,而大量的信息输入和输出需要外存,外存是以文件的形式存储的.文件:存放在外部介质上数据集合

C语言执行程序输入数据10.1.1什么是文件

文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。特点:数据永久存放,需要时被方便的访问。为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名[.扩展名]例如,一个TC语言源程序名为:prg.cTC语言的目标文件名:prc.obj

TC语言的可执行文件名:prc.exe10.1.2文件的分类

根据数据的组织形式分类:文本文件:ASCII文件,每个字节存放一个字符的ASCII码,代表一个字符.二进制文件:数据按其在内存中的存储形式原样存放例如整数inta=1025,这两种文件的存储形式是不同的.两种文件在内存中的存放形式:0011001100110010001101110011011000110111文本文件1111111101111111shortint

数据32767'3'

'2'

'7'

'6'

'7'

32767的各字符的ASCII码存放形式0111111111111111二进制文件32767的二进制存放形式内存存放形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果两种文件在内存中的存放形式:高位低位

二进制文件的存储形式与数据在内存中的存储形式相同,读写是位复制,不需要转换,传输效率高,节省外存空间。

ASCII码文件是以字符形式存储,读写需要转换,传输效率低,占用外存空间较大。两种存储格式的区别:中间结果数据一般用二进制文件方式保存.供用户阅读的数据需要用ASCII玛形式存放

写文件是从内存向磁盘输出数据。首先将内存中的数据送到文件缓冲区,待文件缓冲区满,写入磁盘。

10.1.3文件缓冲区

读文件是从磁盘读出数据存入内存。首先从磁盘读出一批数据送到文件缓冲区,然后从文件缓冲区取出数据存入内存。ANSIC标准采用”缓冲文件系统”处理文件,所谓缓冲文件系统是指系统自动第在内存区为每一个正在使用的文件开辟一个”文件缓冲区”.10.1.4文件指针

每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(文件名\文件状态及文件当前位置等),这些信息保存在一个结构体变量中.typedefstruct{intlevel;/*缓冲区的空满程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/intbsize;/*缓冲区大小*/unsignedchar_FAR*buffer;/*数据缓冲区位置*/unsignedchar_FAR*curp;/*指针,当前的指向*/unsignedistemp;/*临时文件,指示器*/shorttoken;/*有效性检验*/}FILE;/*指定新类型名为FILE*/stdio.h中定义)fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。定义文件型指针变量FILE*fp;10.2文件的打开与关闭

和其他高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应关闭该文件。“打开”:是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来存放输入输出的数据),并建立文件与它们之间的联系.“关闭”:只指撤消文件信息区和文件缓冲区,断开文件与内存之间的联系.10.2.1文件的打开FILE*fp;/*定义文件型指针变量*/fp=fopen(文件名,使用文件方式);/*使指针变量指向打开的文件的信息区*/例如:fp=fopen("a1","r");/*表示要打开名字为a1的文件,使用文件方式为“读入”,同时带回指向a1文件的指针并赋给fp,这样fp和文件a1相联系了*/.fp文件缓冲区

FILE类型存放着处理文件的有关信息FILE*fp1,*fp2,*fp3;fp1=fopen(“abc”,”r”);fp2=fopen(“d:\\mydoc\\stu.dat”,”r”);fp3=fopen=(“a1.txt”,”r”);路径分割符”\\”打开文件时通知编译系统三个信息:需要打开的文件名、文件的使用方法、文件指针【实例10-1】打开文件例如:if((fp=fopen("e:\001\file1.txt","w"))==NULL){printf("file1.txt不能打开!\n");exit(1);}

对于读写模式,打开文件时,当前文件指针指向文件开始。追加模式,打开文件时,当前文件指针指向文件末尾。要特别注意,打开已存在文件,如果错选w模式或wb模式,文件中的数据全部丢失。如果函数调用成功,fopen函数的返回值是指向该文件的指针,程序可以使用这个指针对所打开的文件进行读写操作。否则返回一个空指针—NULL;

文件使用方式含义 “r”只读

为输入打开一个文本文件进行读操作 “w” 只写 为输出打开一个文本文件进行写操作 “a”追加

向文本文件尾追加数据 “rb” 只读 为输入打开一个二进制文件进行读操作 “wb” 只写 为输出打开一个二进制文件进行写操作 “ab” 追加 向二进制文件尾追加数据 “r+”读写

为读/写打开一个文本文件 “w+”读写

为读/写建立一个新的文本文件 “a+” 读写 同”r+” “rb+” 读写 为读/写打开打开一个二进制文件 “wb+” 读写 为读/写建立一个新的二进制文件,若文件不存在则创建“ab+” 读写 同”r+”

文件使用方式:指针指向文件开始指针指向末尾文件的关闭(fclose函数)

fclose函数用来关闭fp所指向的文件。该文件必须是用fopen函数打开的。如果关闭成功则返回1,否则返回0。fclose函数的一般使用方式:

fclose(文件指针);10.2.2文件的关闭main(){FILE*fp;fp=fopen(“d:\\text.c",“w");if(fp==NULL) {printf("cannotopenthisfile!\n");exit(0);}fclose(fp);}进行读写操作如果打开文件失败,则退出程序关闭文件【实例10-2】关闭文件10.3文件的读写

10.3.1字符读写函数:fgetc和fputcfputc函数的功能是将一个字符写入文件的当前位置。一般使用形式为:

fputc(ch,fp);其中ch是要输出的字符fp是文件指针变量,它从函数得到返回值。

功能:将字符数据c输出到fp所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。

返值:正常,返回ch;出错,为EOFfgetc函数从文件中读取当前位置的一个字符返回。其一般形式为:

ch=fgetc(fp);字符变量文件型指针变量

功能:从fp指向的文件中,读入一个字节(字符),同时将读写位置指针向前移动1个字节(即指向下一个字符)

返值:正常,返回读到的代码值;读到文件尾或出错,为EOF

在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc

函数后,

该位置指针将向后移动一个字节。

因此可连续多次使用fgetc函数,读取多个字符。

10.3.2文件位置指针□□□□□□□□文件指针位置指针#include"stdilb.h"main(){charfilename[20];

FILE*fp;charch;scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("can'tcreatethefile\n");exit(0);}while((ch=getchar())!='#')fputc(ch,fp);fclose(fp);}输入要打开的文件名以“w”方式打开文件从键盘输入字符,直到输入”#“结束写入文件打开的文件中【实例10-3】

:读入字符并存入文件,直到用户输入一个“#”符为止。#include"stdlib.h"main(){FILE*fp;charch;if((fp=fopen("d:\\my.dat","rb"))==NULL){printf("\nthisfiledoesnotexit\n");exit(1);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}以“r”方式打开文件从My.dat文件中读字符,直到遇到文件结束符EOF【实例10-4】从一个磁盘文件顺序读入字符并在屏幕上显示出来。C语言中使用feof()函数来判断文件是否结束。如果是文件结束,函数feof(fp)的值为1(真),否则为0(假)。10.3.3文件结束判断函数

FILE*fp;charch;if(!eof(fp))ch=fgetc(fp);#include"stdio.h“#inlude“stdlib.h”

main()

{

FILE*fp;

intch;

if((fp=fopen("d:\\my.dat","r"))==NULL)

{printf("\nthisfiledoesnotexit\n");

exit(1);}

while(!feof(fp))

{ch=fgetc(fp);

putchar(ch);}

fclose(fp);

}【实例10-5】用feof(fp)函数判断文件是否结束【实例10-6】打开一个ASCII文件,将文件内容显示到显示器上。然后输入一行字符串,将其保存到该文件中。#include"stdio.h“#include“stdlib.h”main(){FILE*fp;charc,str[100],filename[30],i=0;scanf("%s",filename);if((fp=fopen(fliename,"r+"))==NULL){printf("filecan’topen!\n");exit(0);};while((c=fgetc(fp))!=EOF)putchar(c);gets(str);while(str[i]!='\0'){fputc(str[i],fp);i++;}fclose(fp);} 10.3.4字符串的读写函数fputs和fgetsfputs函数

调用的一般格式:fputs(字符串,文件指针);功能:它将一个字符串写到指定的磁盘文件。:写成功,返回0;写失败,返回EOF(-1)。fgets函数

调用的一般格式:fgets(字符串,字符个数,文件指针);功能:它从指定的磁盘文件中读一字符串读成功,返回字符串的首地址;读失败或遇到文件结束符,返回EOF(-1)从fp所指文件读n-1个字符送入内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束)#include"stdio.h"

#include“stdlib.h”main()

{FILE*fp;

charstr[11];

if((fp=fopen("d:\\inf.c","r"))==NULL)

{

printf("Cannotopenfile");

exit(1);

}

fgets(str,11,fp);

printf("%s",str);

fclose(fp);}【实例10-7】从某个已经存在的文件中读取一个含有10个字符的字符串。#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp1,*fp2;charstr[]="123456789";

//创建文本文件wang.txt

fp1=fopen("wang.txt","w"); if(fp1==NULL)//创建文件失败

{printf("cannotopenfile:wang.txt\n");exit(0);}//将字符串“123456789”写入文件

fputs(str,fp1);//写入第一行文本的换行符和下一行文本

fputs("\nabcd",fp1);fclose(fp1);//关闭文件wang.txtfp1【实例10-8】向文件wang.txt中写入两行文本,然后分三次读出其内容。

3132333435363738390D0A61626364"123456789"回车换行符’\n’“abcd"

fp2=fopen("wang.txt","rt");//以只读方式打开wang.txt文件

fgets(str,8,fp2);//读取字符串,最大长度是7,将是"1234567"printf("%s\n",str);fgets(str,8,fp2);//读取字符串,最大长度是7,实际上将是"89\n"printf("%s\n",str);fgets(str,8,fp2);//读取字符串,最大长度是7,实际上将是"abcd"printf("%s\n",str);fclose(fp2);//关闭打开的文件}wang.txt3132333435363738390D0A61626364fp2位置指针位置指针运行结果:1234567第一次读取"1234567"位置指针第二次读取“89\n"位置指针89第三次读取“abcd"abcd有以下程序运行后,文件t1.dat中的内容是_____

#include

intwriteStr(char*fn,char*str)

{FILE*fp;

fp=fopen(fn,"w");fputs(str,fp);fclose(fp);

}

main()

{

writeStr("t1.dat","start");

writeStr("t1.dat","end");

}

A)startB)endC)startendD)endrt将一个磁盘文件中的信息读到屏幕上,请填空。#include"stdio.h"main(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");while(!feof(fp1))putchar(________)fclose(fp1);}A)p2B)getc(fp1)C)fputc(fp1)D)ch答案:B功能:按指定的格式将内存中的数据转换成对应的字符,以ASCII码形式输出到文本文件中。例如:

fprintf(fp,"%d%d",x,y);把x,y中的数按%d格式输出到fp所指的文件中。fprintf(文件指针,"格式控制字符串",输出项表)调用形式:10.3.5信息的格式化读/写1.fprintf()函数2.fscanf函数功能:从文本文件中按格式输入。例如:

fscanf(fp,"%d%d",&a,&b);从fp所指文件中读入两个整数,放入变量a,bfscanf(文件指针,"格式控制字符串",输入项表)调用形式:#include<stdio.h>#include<stdlib.h>intmain(){inti=3;floatf=(float)9.8;FILE*fp;//创建文本文件wang.txtfp=fopen("wang.txt","w");if(fp==NULL)//创建失败

{printf("can'tcreatefile:wang.dat\n");exit(0);}//将变量i和f的值格式化输出到文件中

fprintf(fp,"%2d,%6.2f",i,f);fclose(fp);//关闭文件wang.txtfp【实例10-9】将变量的值格式化写入文件中,然后从文件中格式化读出并显示。

20332C2020392E3830ASCII码对应字符'''3'',''''''9''.''8''0'%2d%6.2f#include"stdio.h"structstu{charname[10];intnum;intage;charaddr[15];}s[5],*p;main(){FILE*fp;charch;inti;p=s;if((fp=fopen("stu_list","wb+"))==NULL){printf("Cannotcreatefile!");exit(0);}例:从键盘输入5个学生数据,写入一个文件中,再读出数据显示。printf("\ninputdata\n");for(i=0;i<5;i++,p++)scanf("%s%d%d%s",p->name,&p->num,&p->age,p->addr);p=s;for(i=0;i<5;i++,p++)fprintf(fp,"%s%d%d%s\n",p->name,p->num,pp->age,p->addr);rewind(fp);/*使文件位置指针重新返回文件的开头*/for(p=s,i=0;i<5;i++,p++)fscanf(fp,"%s%d%d%s\n",p->name,&p->num,&p->age,p->addr);printf("\n\nname\tnumberageaddr\n");for(p=s,i=0;i<5;i++,p++)printf("%s\t%5d%7d%s\n",p->name,p->num,p->age,p->addr);fclose(fp);}1.fread函数的使用fread(buffer,size,count,fp);调用形式:数据块的指针,存放读入数据的起始地址每个数据块的字节数数据块个数文件指针功能:从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size*count个字节。10.3.6.fread()、fwrite()函数fwrite(buffer,size,count,fp);数据块的指针,存放输出数据的起始地址每个数据块的字节数数据块个数文件指针功能:从

buffer

开始,一次输出

size

个字节,重复

count

次,并将输出的数据存放到

fp

所指向的文件中;同时,将读写位

温馨提示

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

评论

0/150

提交评论