c语言学习,c语言课件第12章_第1页
c语言学习,c语言课件第12章_第2页
c语言学习,c语言课件第12章_第3页
c语言学习,c语言课件第12章_第4页
c语言学习,c语言课件第12章_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1212章章 文文 件件本章学习意图本章学习意图领会文件的概念领会文件的概念. . 谙练把握文件类型指针的使用谙练把握文件类型指针的使用. . 把握文件的根基操纵把握文件的根基操纵. . Return在程序运行时,程序自已和信息一样都存放在内存中.当程序运行结束后,存放在内存中的信息被释放.似果需要恒久保留程序运行所需的原始信息,或程序运行产生的结论,便必须以文件形式存储到外部存储介质上.12.1 语言文件概述12.2 文件的打开与封闭12.3 文件的读写12.4 文件定位12.5 文件的犯错探测12.1 语言文件概述语言文件概述 1 1文件与文件名文件与文件名 文件是指存放在外部存储介质

2、上的信息集合文件是指存放在外部存储介质上的信息集合. .为标识一个文件为标识一个文件, ,每个文件都必须有一个文件名每个文件都必须有一个文件名, ,其其一样结构为一样结构为: :主文件名主文件名.扩展名扩展名 文件命名法那么文件命名法那么, ,遵循操纵系统的商定遵循操纵系统的商定. .2 2文件分类文件分类能够从差别的角度对文件履行分类能够从差别的角度对文件履行分类: :(1 1)依照文件的内容)依照文件的内容, ,可分为程序文件和信息文件可分为程序文件和信息文件, ,程序文件又可分为源文件、意图文件和可履行文件程序文件又可分为源文件、意图文件和可履行文件. .(2 2)依照文件的组织形式)依

3、照文件的组织形式, ,可分为次序存取文件和可分为次序存取文件和随机存取文件随机存取文件. .12.1.1 文件的概念及分类文件的概念及分类 (3)依照文件的存储形式,可分为ASCII码文件和二进制文件. ASCII码文件的每1个字节存储1个字符,因而便于对字符履行追个操作.但一样占用存储空间较多,并且要破费变形时候(二进制与ASCII码之间的变形).二进制文件是把内存中的信息,原样输出到磁盘文件中.能够节流存储空间和变形时候,但1个字节同时不对应1个字符,不能直截了当输出字符形式.12.1.2 文件的操纵流程文件的操纵流程 通环节序对文件履行操纵,达到从文件中读信息或向文件中写信息的意图,涉及

4、到的操纵有:创站文件、打开文件、从文件中读数或向文件中写数、封闭文件等.一样遵循的环节为:(1)创站打开文件(2)从文件读取信息或向文件写信息.(3)封闭文件 打开文件是履行文件读写操纵之前的必要环节.打开文件便是将指定的文件与程序联系起来,为下面履行的文件读写做好筹办.当为履行写操纵而打开一个文件时,似果那个文件不存在,那么系统会创站那个文件,同时打开它.当为履行读操纵而打开一个文件时,文件应该是差不多存在的,否那么会犯错. 所谓读文件是指,将磁盘文件中的信息传送到统计机内存的操纵. 所谓写文件是指,从统计机内存向磁盘文件中传送信息的操纵. 封闭文件便是勾销程序与指定的信息文件之间的联系,示

5、意文件操纵的结束. 所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开发一个缓冲区.从内存向磁盘输出信息时,必须第一步输出到缓冲区中.待缓冲区装满后,再共同输出到磁盘文件中.从磁盘文件向内存读入信息时,那么正好相反:第一步将一批信息读入到缓冲区中,再从缓冲区中将信息追个送到程序信息区.12.1.3 12.1.3 缓冲文件系统与非缓冲文件系统缓冲文件系统与非缓冲文件系统 1. 1. 缓冲文件系统缓冲文件系统 所谓所谓“非缓冲文件系统非缓冲文件系统”是指系统不自动开发是指系统不自动开发确定大小的缓冲区确定大小的缓冲区, ,而由程序为每个文件设定缓冲区而由程序为每个文件设定缓冲区. .非

6、缓冲文件系统依靠于操纵系统非缓冲文件系统依靠于操纵系统, ,通过操纵系统的通过操纵系统的功能对文件履行读写功能对文件履行读写, ,是系统级的输入输出是系统级的输入输出, ,它不设它不设文件结构体指针文件结构体指针, ,只能读写二进制文件只能读写二进制文件, ,但功效高、但功效高、速度快速度快. .在已往使用的在已往使用的C C版本(似版本(似UNIXUNIX系统下使用的系统下使用的C C)撑持上述两种对文件操作的方式撑持上述两种对文件操作的方式, ,但是但是 ANSI C ANSI C 规规格不再包罗非缓冲文件系统格不再包罗非缓冲文件系统, ,所以定见大伙儿最好不所以定见大伙儿最好不要挑选它要

7、挑选它. . 2.2.非缓冲文件系统非缓冲文件系统 12.1.4 12.1.4 文件指针文件指针 ANSI C为每个被使用的文件在内存开发一块用于存放上述信息的小区,操纵一个结构体类型的变量存放.该变量的结构体类型由系统取名为FILE,在头文件stdio.h中定义似下: typedef structshort level; *缓冲区“满”或“空”的程度*unsigned flages; *文件状态标记*char fd; *文件描述符*unsigned char hold; *似无缓冲区不读取字符*short bsize; *缓冲区的大小*unsigned char *baffer; *缓冲区的

8、读写位置*unsigned char *curp; *文件读写位置*unsigned istemp; *临时文件,指示器*short token; *用于有效性的查抄* FILE; 在操纵文件往常,应先定义文件类型的指针,定义的一样标准:FILE *指针变量标识符例似:FILE *fp1,*fp2; 依照上面的定义,fp1和fp2均为指向结构体类型的指针变量,分不指向一个可操纵的文件,换句话讲,一个文件有一个文件类型指针,从此对文件的会见,会转化为面向文件类型指针的操纵. 12.2 12.2 文件的打开与封闭文件的打开与封闭12.2.1 12.2.1 文件的打开文件的打开fopen()fope

9、n()函数函数 1 1用法用法:FILE :FILE * *fopen(“fopen(“文件名文件名”,“,“操纵方式操纵方式”);); 2 2功能功能: :返回一个指向指定文件的指针返回一个指向指定文件的指针. . 3 3函数原型函数原型:stdio.h .:stdio.h . 注注: :对文件操纵的库函数对文件操纵的库函数, ,函数原型均在头文件函数原型均在头文件stdio.hstdio.h中中. .后续函数不再赘述后续函数不再赘述. . 对文件履行操纵之前,必须先打开该文件;使用结束后,应站即封闭,以免信息丢失. 语言规定了规格输入输出函数库,用fopen()函数打开一个文件,用fclo

10、se()函数封闭一个文件.(1)“文件名”是指要打开(或创站)的文件名.似果使用字符数组(或字符指针),那么不使用双引号.(2)“操纵方式”似表12-2所示.例似,FILE *fp; fpfopen(data.99,r);3讲明(1)似果不能实现打开指定文件的操纵,那么fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为).为增加程序的靠得住性,常用下面的方式打开一个文件: if(fp=fopen(文件名,操纵方式)=NULL) printf(can not open this filen); exit(0); 对于exit()函数1)用法:void exit(程序

11、状态值);2)功能:封闭已打开的全部文件,结束程序运行,返回操纵系统,同时将“程序状态值”返回给操纵系统.当“程序状态值”为时,示意程序正常退出;非值时,示意程序犯错退出.(2)“r(b)+”与“a(b)+”的区不:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾.(3)使用文本文件向统计机系统输入信息时,系统自动将回车换行符变形成一个换行符;在输出时,将换行符变形成回车和换行两个字符.使用二进制文件时,内存中的信息形式与信息文件中的形式完全一样,便不再履行变形.(4)有些编译系统,大概同时不完全提供上述对文件的操纵方式,或采纳的示意符号差别,请注重所使用系统的规定.

12、(5)在程序最先运行时,系统自动打开三个规格文件,同时分不定义了文件指针: 1)规格输入文件stdin:指向终端输入(一样为键盘).似果程序中指定要从stdin所指的文件输入信息,便是从终端键盘上输入信息.2)规格输出文件stdout:指向终端输出(一样为表现器).3)规格错误文件stderr:指向终端规格错误输出(一样为表现器).12.2.2 文件的封闭fclose()函数1用法: int fclose(FILE *文件指针);2功能:封闭“文件指针”所指向的文件.似果正常封闭了文件,那么函数返回值为;否那么,返回值为非.例似,fclose(fp);*封闭fp所指向的文件*12.3 12.3

13、 文件的读写文件的读写文件打开之后,便能够对它履行读与写的操纵了.下面按文件的性质分类履行操纵.面向文本文件和二进制文件的差别性质,对文本文件来讲,可按字符读写或按字符串读写;对二进制文件来讲,可履行成块的读写或标准化的读写. 12.3.1 12.3.1 读写一个字符读写一个字符 C提供fgetc和fputc函数对文本文件履行字符的读写. 读字符函数读字符函数fgetc fgetc fgetc()fgetc()函数的原型存于函数的原型存于stdio.hstdio.h头文件中头文件中, ,标准为标准为: : int fgetc(FILE int fgetc(FILE * *fp); fp); 功

14、能:从指定的文件中读一个字符,同时将文件的位置指针移到下一个字符处,似果已到文件尾,函数返回EOF. fgetc()函数调用形式为:字符变量fgetc(文件指针); 例似: ch=fgetc(fp);*从fp指向的文件中读取一个字符送入ch变量中* 2. 2. 写字符函数写字符函数fputc fputc fputc()函数的原型为:int fputc(int ch,FILE *fp) 功能:将字符ch的值写入所指定文件的当前位置处,同时将文件指针后移一位.fputc()函数的返回值是所写入字符的值,犯错时返回EOF. 函数的调用形式:fputc(字符,文件指针);例似: fputc(a,fp)

15、;*将字符常量a写入fp所指向的文件中* 【例【例12-112-1】将存放于磁盘的指定文本文件按读写字符方式追个】将存放于磁盘的指定文本文件按读写字符方式追个地从文件读出地从文件读出, ,接着再将其表现到屏幕上接着再将其表现到屏幕上. .(采纳带指标的(采纳带指标的main(),main(),指定的磁盘文件名由号令行方式通过键盘给定指定的磁盘文件名由号令行方式通过键盘给定. .)*exam12_1*#include stdio.h#include stdlib.hint main(int argc, char *argv) char ch;FILE *fp; int i; (续)(续)if(a

16、rgctype test.txt I love china! (表现内容)讲明从键盘写入的字符已存入文件test.txt中. 注重:应转入当前路径后使用type号令,这个地方假定当前路径是c:tc.能够履行“file”菜单的“OS Shell”菜单项临时转入DOS号令行方式.2.3.2 2.3.2 读写一个字符串读写一个字符串 C语言提供fgets()和fputs()函数来实现对文件以字符为单位履行读写,因为这两个函数在使用中往往是一次读写一行,所以也称行读写函数. 1. 1. 读字符串函数读字符串函数fgets fgets C提供读字符串的函数原型在stdio.h头文件中,其函数形式为:ch

17、ar *fgets(char *str,int num,FILE *fp)fgets() 函数的调用形式为:fgets(字符数组名,n,文件指针); 功能: 从文件指针所指向的文件中读取到多n-1个字符,在读入的末了一个字符后加上串结束标记0,同时把它们放入字符数组中.读取环节中似果遇到了换行符或EOF(文件结束符),那么读取结束. 【例【例12-312-3】从】从test.txttest.txt文件中读入一个含文件中读入一个含1010个字符的字符串个字符的字符串. . * *exam12_3exam12_3* *#include stdio.h#include stdio.h#include

18、 stdlib.h#include stdlib.hint main(void)int main(void) FILE FILE * *fp; fp; * *定义文件指针定义文件指针* *char str11;char str11;if(fp=fopen(test.txt,r)=NULL)if(fp=fopen(test.txt,r)=NULL)* *以只读方式打开文件以只读方式打开文件* * printf(cannot open file!n); printf(cannot open file!n);exit(0) ;exit(0) ; fgets(str,11,fp);fgets(str,

19、11,fp);printf(“n%sn”,str); printf(“n%sn”,str); * *将字符串输出到屏幕将字符串输出到屏幕* *fclose(fp);fclose(fp);return 0;return 0; 演示注重:编译时使用“change dir”号令修改任务目录为test.txt所在目录.2. 2. 写字符串函数写字符串函数fputs fputs C提供写字符串的函数原型在stdio.h头文件中,其函数形式为:int fputs(char *str,FILE *fp)其调用的一样形式为:fputs(字符串,文件指针); 功能:将字符串写入文件指针所指向的文件.操纵顺遂时,

20、函数返回0值,失败返回非零值. 【例【例12-412-4】写入多个字符串到磁盘文本文件】写入多个字符串到磁盘文本文件test.txt. test.txt. *exam12_4*#include stdio.h#include stdlib.h#include string.hint main(void) FILE *fp;char str128;if(fp=fopen(test.txt,w)=NULL) *打开只写打开只写的文本文件的文本文件* printf(cannot open file!);exit(0);(续)(续)能够写出test.txt的绝对路径,似:c:examplestest.

21、txt.while(strlen(gets(str)!=0) *如果串长度为零如果串长度为零,那么结束那么结束*fputs(str,fp); *写入串写入串*fputs(n,fp); *写入回车符写入回车符* fclose(fp); *关文件关文件* return 0; Hello! How do you do Good-bye! c:tctype test.txt Hello!How do you doGood-bye!运行后输入用type号令验证结论注重:应转入当前路径后使用type号令.演示12.3.3 读写一个信息块读写一个信息块fread()和和fwrite()现实应用中,常常要求1

22、次读写1个信息块.为此,ANSI C 规格设置了 fread( ) 和fwrite()函数. 1用法:int fread(void *buffer,int size,int count,FILE *fp);int fwrite(void *buffer,int size,int count,FILE *fp);2功能:fread()从fp所指向文件的当前位置最先,一次读入size个字节,重复count次,同时将读入的信息存放到从buffer最先的内存中;同时,将读写位置指针向前移动size*count个字节.其中,buffer是存放读入信息的起始地址(即存放那边).fwrite()从buffe

23、r最先,一次输出size个字节,重复count次, 同时将输出的信息存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节.其中,buffer是要输出信息在内存中的起始地址(即从那边最先输出).似果调用fread()或fwrite()顺遂,那么函数返回值等于count.fread()和fwrite()函数,一样用于二进制文件的操作.【例【例12-512-5】向磁盘写入标准化信息】向磁盘写入标准化信息, ,再从该文件读出表现到屏幕再从该文件读出表现到屏幕. . * *exam12_5exam12_5* *#include stdio.h#include stdio.h

24、#include stdlib.h#include stdlib.hint main(void)int main(void) FILE FILE * *fp1;fp1;int i;int i;struct stu struct stu * *定义结构体定义结构体* *char name15;char name15;char num6;char num6;float score2;float score2; student; student;if (fp1=fopen(test.txt,wb)=NULL)if (fp1=fopen(test.txt,wb)=NULL) * *以二进制只写方式打开

25、文件以二进制只写方式打开文件* *printf(cannot open file);printf(cannot open file);exit(0);exit(0); (续)(续)printf(input data:n);printf(input data:n);for( i=0;i2;i+) for( i=0;i2;i+) scanf(%s %s %f %f,,student.num,scanf(%s %s %f %f,,student.num,&student.score0,&student.score1); &stu

26、dent.score0,&student.score1); * *输入一记录输入一记录* *fwrite(&student,sizeof(student),1,fp1); fwrite(&student,sizeof(student),1,fp1); * * 成块写入文件成块写入文件* * fclose(fp1);fclose(fp1);if (fp1=fopen(test.txt,rb)=NULL)if (fp1=fopen(test.txt,rb)=NULL) * *再一次以二进制只读打开文件再一次以二进制只读打开文件* *printf(cannot open fi

27、le);printf(cannot open file);exit(0);exit(0); (续)(续)printf(output from file:n);printf(output from file:n);for (i=0;i2;i+)for (i=0;i2;i+) fread(&student,sizeof(student),1,fp1); fread(&student,sizeof(student),1,fp1);* * 从文件成块读从文件成块读* *printf(%s %s %7.2f %7.2fn,,student.num,printf(%

28、s %s %7.2f %7.2fn,,student.num,student.score0,student.score1);student.score0,student.score1);* * 表现到屏幕表现到屏幕* * fclose(fp1);fclose(fp1);return 0;return 0; input data:xiaowan j001 87.5 98.4 xiaoli j002 99.5 89.6 output from file:xiaowan j001 87.50 98.40 xiaoli j002 99.50 89.60 运行情况:演示12.3.

29、4 对文件履行标准化读写对文件履行标准化读写 前面的程序设计中,我们讲解过操纵scanf()和printf()函数从键盘标准化输入及在表现器上履行标准化输出.对文件的标准化读写便是在上述函数的前面加一个字母f成为fscanf()和fprintf().其函数原型为:int fscanf(FILE *stream,char *format,arg_list)int fprintf(FILE *stream,char *format,arg_list)这两个函数的一样调用形式为:fscanf( 文件指针,标准操纵串,输入地址表列);fprintf(文件指针,标准操纵串,输出表列);在使用上与规格的输

30、入输出函数一样,只是fscanf()和fprintf()的输入输出是对文件履行.事实上scanf()和printf()从广义上讲也是对文件履行,操纵对象是对规格输入(stdin)输出(stdout)文件. 【例【例12-612-6】将部分标准化的信息写入文本文件】将部分标准化的信息写入文本文件, ,再从该文件中以再从该文件中以标准化方式读出表现到屏幕上标准化方式读出表现到屏幕上, ,其标准化信息是两个学生记录其标准化信息是两个学生记录, ,包罗姓名、学号、两科成绩包罗姓名、学号、两科成绩. . * *exam12_6exam12_6* *#include stdio.h#include std

31、io.h#include stdlib.h#include stdlib.hint main(void)int main(void) FILE FILE * *fp;fp;int i;int i;struct stu struct stu * *定义结构体类型定义结构体类型* *char name15;char name15;char num6;char num6;float score2;float score2; student; student; * *讲明结构体变量讲明结构体变量* *(续)(续)if (fp=fopen(test.txt,w)=NULL) *以文本只写方式打开文件*p

32、rintf(cannot open file);exit(0); printf(input data:n);for( i=0;i时)或后(当位移量时)移动的字节数.在ANSI C规格中,要求位移量为long int型信息.fseek()函数一样用于二进制文件.12.4.3 12.4.3 返回文件当前位置的函数返回文件当前位置的函数ftell()ftell()因为文件的位置指针能够随意率性移动因为文件的位置指针能够随意率性移动, ,也常也常常移动常移动, ,往往简单迷失当前位置往往简单迷失当前位置,ftell(),ftell()便能够解便能够解决那个咨询题决那个咨询题. . 1 1用法用法:long ftell(:long ftell(文件指针文件指针);); 2 2功能功能: :返回文

温馨提示

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

评论

0/150

提交评论