《C语言程序设计教程第实用教案》由会员分享,可在线阅读,更多相关《C语言程序设计教程第实用教案(30页珍藏版)》请在金锄头文库上搜索。
1、文件(wnjin)的分类:ASCII 码文件(文本文件):文件的每一个字节(z ji)放 一个ASCII代码,代表一个字符。 二进制文件 :把内存中的数据按其在内存中的存 储形式原样(yun yn)输出到文件上。 根据数据在内存的组织形式不同可分为两类文件 ASCII 码文件(文本文件) 二进制文件 根据数据读写方式不同可分为两类文件 顺序存取文件 随机存取文件 第1页/共29页第一页,共30页。三、文件(wnjin)的基本操作 (1) 打开打开(d ki)文件文件 把文件名等目录信息从磁盘上把文件名等目录信息从磁盘上读读(2) 入内存并存入结构体。入内存并存入结构体。 关闭文件关闭文件 把内
2、存把内存(ni cn)结构体中的文件名等结构体中的文件名等目录目录 信息写入磁盘。信息写入磁盘。(3) 写文件写文件 向文件写内容。向文件写内容。 (4) 读文件读文件 从文件读内容。从文件读内容。 四、 文件的输入输出方式 C语言对文件进行处理分为: 非缓冲文件系统 缓冲文件系统第2页/共29页第二页,共30页。非缓冲文件系统 程序与外设直接(zhji)进行数据交换。 特点(tdin) 每读写一次都要启动外设。 缓冲文件系统 程序与外设通过内存(ni cn)缓冲区进行 数据交换。(常用的方式) 特点 只有内存缓冲区满(写盘)或空(读盘)才 启动外设。 程序数据区输出文件缓冲区输入文件缓冲区磁
3、盘第3页/共29页第三页,共30页。1. 文件类型(FILE) 每个被使用的文件都在内存中开辟一个区,用来存放(cnfng)文件的有关信息(如文件名,状态,当前位置等)。这些信息保存在一个结构体类型的变量中。结构体类型由系统定义为“FILE”。 有的C版本在 stdio.h文件中有如下定义:typedef struct int _fd;; /* 文件号 */ int _cleft; /* 缓冲区中剩下的字符 */ int _mode; /* 文件操作模式(msh) */ char *_nexttc; /* 下一个字符位置 */ char *_buff; /* 文件缓冲区位置 */ FILE;1
4、3.1. 文件(wnjin)指针第4页/共29页第四页,共30页。2. 定义FILE类型指针(zhzhn)变量 FILE 类型(lixng)的指针变量定义方法 FILE *指针(zhzhn)变量名;例如:FILE *fp;含义:fp是一个指向FILE类型结构体的指针变量。 可以使可以使fpfp指向某个文件的结构体变指向某个文件的结构体变量,从而通过该结构体变量中的文件信量,从而通过该结构体变量中的文件信息能够访问该文件。息能够访问该文件。 第5页/共29页第五页,共30页。13.2 13.2 文件(wnjin)(wnjin)的打开与关闭 13.2.1 文件(wnjin)的打开函数(fopen函
5、数) (1) (1) 调用(dioyng)(dioyng)方式: FILE *fp ;fp= fopen(文件名,文件的使用方式);所要打开的文件名。所要打开的文件名。必须是用双引号引起的字符串常量。 具有特定含意的符号具有特定含意的符号也必须由双引号引起用户定义的文件类型指针变量功能:以指定的方式打开指定的文件,若操作 成功,则返回一个指向该文件的指针,若打 开文件时出现错误,则返回空指针NULL。 例 FILE *fp; fp=fopen(stu.dat,r);第6页/共29页第六页,共30页。文件使用(shyng)方式 基本方式字符(z f)(单独使用是对文本文件): r 仅为读而打开。
6、仅为读而打开。 ( (只读文件只读文件) ) w 仅为写而打开。仅为写而打开。 ( (建立新文件建立新文件) ) a 仅为添加而打开。仅为添加而打开。( (写旧文件写旧文件) ) 按二进制格式(g shi)读写文件(基本方式字符+“b”) b 辅助说明,按二进制格式读写文件。辅助说明,按二进制格式读写文件。 同时进行读写文件(基本方式字符+“b”+“+”) + 辅助说明,可同时进行读和写文件。辅助说明,可同时进行读和写文件。 例如:fp=(“stu.dat”,“rb”);例如:fp=(“stu.dat”,“r+”);第7页/共29页第七页,共30页。例:#include main() FILE
7、 *fp; if(fp=fopen(stu.dat,r) =NULL) printf(file not found.); exit(0); else printf(file opened ok!); fclose(fp); 程序运行结果: 如果磁盘上存在文件stu.dat,屏幕(pngm)上会显示file open ok!,否则屏幕(pngm)上显示file not found.。常使用此方法打开(d ki)一个文件exit函数的功能是关闭所有文件,终止程序运行。exit(0)为正常(zhngchng)终止程序第8页/共29页第八页,共30页。13.2.2 文件的关闭(gunb)函数(fclo
8、se函数) (1) 调用(dioyng)方式: fclose(文件(wnjin)指针); 功能:关闭由文件指针指定的文件,把缓冲区 中的数据(未装满缓冲区的数据)输出 到磁盘上,释放文件指针。例如: FILE *fp; fp=fopen(“output.dat”,“r+”); /* 进行读写操作 */ fclose(fp);注意:fopen函数和fclose函数总是成对出现的。 无fclose函数时会导致部分数据丢失!第9页/共29页第九页,共30页。13.3 13.3 文件(wnjin)(wnjin)的读写 13.3.1 单个字符操作(cozu)的读写函数 这两个函数是以字符为单位(dnwi
9、)进行文件读写的函数。1. fputc1. fputc函数函数一般调用形式: fputc(fputc(字符常量或变量字符常量或变量, ,文件指针文件指针); ); 功能:把指定字符存入文件指针所指的文件中。 如果输出失败,则返回一个EOF(-1)。例如:fputc(ch,fp); (其中ch为字符变量,fp为文件指针) 含义:将ch的值输出到fp所指向的文件中去。(EOF是在stdio.h文件中定义的符号常量,值为-1)第10页/共29页第十页,共30页。2. fgetc2. fgetc函数函数(hnsh)(hnsh)一般(ybn)调用形式: 字符字符(z f)(z f)变量变量=fgetc(
10、=fgetc(文件文件指针指针); ); 功能:从文件指针所指文件中读一个字符赋给指 定的字符变量。当遇文件结束符,返回一 个文件结束标志EOF(-1)。例如:ch=fgetc(fp); 其中ch为字符变量,fp为文件指针。 含义:从fp所指向的文件中读入一个字符赋 给字符变量ch。第11页/共29页第十一页,共30页。例: 阅读程序。 #include stdio.h #define NULL 0 main() FILE *fp; int count=0; char c; if(fp=fopen(“file.txt”,“r”)=NULL) printf(“Cant Open File n”)
11、; exit(0); c=fgetc(fp); while(c!=EOF) count+; c=fgetc(fp); printf(“count=%dn”,count); fclose(fp); 若文件(wnjin)file.txt的内容是: abcd1234ABCD输出(shch)结果:12这是读一个文本文件(wnjin)中字符,并判断文件(wnjin)是否结束的常用方法第12页/共29页第十二页,共30页。13.3.2 字符串的读写函数(hnsh)这两个函数是以字符串为单位(dnwi)进行文件读写的函数。一般(ybn)调用形式: fputs(fputs(字符串字符串, ,文件指针文件指针)
12、;); 1. fputs函数功能:向指定文件输出一个字符串。例如:fputs(str,fp); (其中str是字符数组名)含义:向fp 所指向的文件中输出str中的字符串。2. fgets函数fgets(fgets(字符串字符串, ,字符串长度字符串长度, ,文件指针文件指针);); 功能:从指定文件中读入一个字符串。 例如:fgets(str,n,fp); (其中str是字符数组名)含义:从fp指向的文件读取长度为n-1的字符串, 最后加一个0存入字符数组str中。调用形式: 第13页/共29页第十三页,共30页。13.3.3 数据(shj)块的读写函数一般(ybn)调用形式: fread(
13、buffer,size,count,fp); fwrite(buffer,size,count,fp); 其中(qzhng):buffer:是一个指针。(是起始地址)。 对fread来说,它是读入数据的存放地址。 对fwrite来说,它是输出数据的地址。size :要读写的字节数。 count:要进行读写多少个size字节的数据项。 功能:对fp所指的文件读写buffer所指的size*count 个字节数据。 例如:fread(f,4,2,fp); (其中f是实型数组名)第14页/共29页第十四页,共30页。例1 把数组a写入文件(wnjin)fa;再从fa读入数组b。 #include s
14、tdio.h main() FILE* fp; int a100=1,5,6,78,21,34,67,87,23,b100, i ; fp=fopen(tmp,wb); fwrite(a,sizeof(a),1,fp); /* fwrite(a,sizeof(int),100,fp);*/ fclose(fp); fp=fopen(tmp,rb); fread(b,sizeof(a),1,fp); for(puts(),i=0;i10;i+)printf(%6d,bi); fclose(fp);第15页/共29页第十五页,共30页。13.3.4 格式化读写函数(hnsh)这两个函数是进行格式(
15、g shi)读写文件的函数 。一般调用(dioyng)形式: fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列) ; 例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式将数据写到指定文件中。 或从指定文件按格式输入数据。又如:fscanf(fp,“%d,%f”,&i,&x);第16页/共29页第十六页,共30页。13.4 13.4 文件的定位(dngwi)(dngwi)与出错检测 1. rewind函数(hnsh)一般调用(dioyng)形式: rewind(rewind(文件指针文件指针);); 功能:使位置指针重新返
16、回文件的开头。2. fseek函数 一般调用形式: fseek(fseek(文件指针文件指针,位移量,起始点) ); 起始点:用0、1、2或其对应的名字SEEK_SET、 SEEK_CUR、SEEK_END代替,分别表 示文件开始、文件当前位置、文件末尾。 位移量:指以起始点为基点,向前(-)或向后移动的 字节数。ANSI C标准规定在数字末尾加一个 字母L,表示long型。 第17页/共29页第十七页,共30页。功能:把文件的读写位置指针(zhzhn)移到指定的位置。 例如(lr):fseek(fp,128L,SEEK_SET); 将位置指针移到离文件头128个字节处。例如:fseek(fp
17、,-10L,2); 将位置指针从文件末尾处向后退(hutu)10个字节。注意:fseek函数一般用于二进制文件。 3. ftell函数 一般调用形式: ftell(ftell(文件指针文件指针);); 功能:返回文件位置指针的当前值。例如:pos=ftell(fp); 获取fp指向文件的当前读写位置,并将其值 赋给变量pos 。 第18页/共29页第十八页,共30页。.ferror()函数ferror()函数用来确定文件操作系统中是否出错。其函数原型为:intferror(FILE*fp);如果ferror()函数返回值为0,则表示此前的文件操作成功;否则,若返回一个非 0值,则表示最近一次文
18、件操作出错。由于对文件的每次I/O操作都会形成新的出错码,所以在每次文件操作后应立即调用 ferror()函数查看此次操作是否成功,否则会丢失信息。 表示上述功能常用(chnyn)的语句的是:if(ferror(fp) printf(file can not I/On); fclose(fp); exit(0); 第19页/共29页第十九页,共30页。5.clearer()函数clearer()函数的函数原型(yunxng)为:voidclearer(FILE*fp);功能是清除文件结束标志和文件出错标志(设置为0)。本函数没有返回值。6exit函数 当文件出现错误时,为了避免数据丢失,正常(
19、zhngchng)返回操作系统,可以调用过程控制函数exit关闭文件,终止程序的执行。一般形式为:exit(status);第20页/共29页第二十页,共30页。13.5 13.5 文件(wnjin)(wnjin)综合实例 编写一个程序,从data.datdata.dat文本文件中读出一个字符,将其加密后写入data1.datdata1.dat文件中,加密方式是字符的ASCIIASCII码加1 1。 分析:先打开data.datdata.dat文本文件并建立data1.datdata1.dat文件,从前者读出一个字符c c,将(c+1)%256(c+1)%256这个(zh ge)ASCII(z
20、h ge)ASCII码对应的字符写入后者中。直到读完为止。 第21页/共29页第二十一页,共30页。#includevoidmain()FILE*fp,*fp2;charc;if(fp=fopen(data.dat,r)=NULL)printf(不能打开文件(wnjin)n);return;if(fp1=fopen(data1.dat),w)=NULL)printf(不能建立文件(wnjin)n);return;while(!feof(fp)c=fgetc(fp);c=(c+1)%256;fputc(c,fp1);fclose(fp);fclose(fp);第22页/共29页第二十二页,共30
21、页。 编写程序,创建数据文件goods.dat用于存储商品信息。已知每一个(y )商品 包括:名称,单价,进货量,和库存4项数据。按指定的格式读写.第23页/共29页第二十三页,共30页。#includemain()int count ,amount,stock;float price;char name20;FILE *fp;if(fp=fopen(“goods.dat”,”wb”)= =NULL)printf(“can not open file.n”);exit(0);第24页/共29页第二十四页,共30页。for(count=0; ;count+)fprintf(“%d”,count+
22、1);scanf(“%s%d%d”,name,&price,&amount,&stock);if(price=0)break; printf(fp,”%sn%.2f,%d,%d”,name,price,amount,stock);第25页/共29页第二十五页,共30页。fclose(fp);fp=fopen(“goods.dat”,”rb”);printf(“overstock goods is:n”);while(!feof(fp)fscanf(fp,”%s%f,%d,%d”,name,&price,&amount,&stock);if(stock=amount/2);printf(“%s,
23、%.2f,%d,%dn”,name,price,amount,stock);fclose(fp);第26页/共29页第二十六页,共30页。13.6 13.6 小 结(1)(1)文件是指存储在外部介质上的数据集合。 (2)(2)对文件的操作(cozu)(cozu)包括文件的打开、关闭、读、写、文件的定位和出错的检验等。现在分别介绍如下:在C C语言中使用fopen()fopen()函数完成对文件的打开操作(cozu)(cozu)。其一般调用方式为:fopen(fopen(文件名,操作(cozu)(cozu)方式););关闭文件用函数fclose()fclose()函数来实现,其调用的形式为:fc
24、lose(fp);fclose(fp);文件的读函数包括fgetc()fgetc()函数、fgets()fgets()函数、freadfread()()函数和fscanf()fscanf()函数。 fgetc() fgetc()函数的功能是从指定的文件中读入一个字符。 fgets() fgets()函数的功能是从文件指针所指向的文件中,读入一个字符串。 fscanf() fscanf()函数为格式化输入函数,其功能是从指定的文件中读取指定格式的数据。 fread() fread()函数的功能是从指定文件中读入一组数据。有关写操作(cozu)(cozu)的函数主要有fputc()fputc()函
25、数、fputsfputs()()函数、fwrite()fwrite()函数和fprintf()fprintf()函数。第27页/共29页第二十七页,共30页。 fputs() fputs()函数,功能是将字符串写入文件指针所指的文件中。fputsfputs()()函数带返回值。如输出成功,返回值为0 0,否则返回文件结束标志EOFEOF其值为-1-1。 fprintf() fprintf()函数为格式化输出函数,其功能是把输出数据发送到指定文件中。 fwrite() fwrite()函数的功能是将bufferbuffer所指向的内存区域中的数据写入文件指针fpfp所指的文件中,这些数据共有co
26、unt count 项,每项长度为sizesize个字节,因此(ync)(ync)字节总数为count*sizecount*size。 文件定位函数,我们主要介绍了rewind()rewind()函数、fseek()fseek()函数和ftellftell()()函数。 rewind() rewind()函数,rewind()rewind()函数也叫重置位置指针函数。 fseek() fseek()函数即随机定位函数,其函数原型为: int fseek(FILE *fp,long offset,int origin); int fseek(FILE *fp,long offset,int or
27、igin); ftell() ftell()函数,ftell()ftell()函数又叫定位当前位置指针的函数,ftellftell()()函数的功能是返回当前文件位置指针的位置,常用于保存当前文件指针位置。 对于出错的检验函数,我们主要介绍ferror()ferror()函数和clearer()clearer()函数。第28页/共29页第二十八页,共30页。感谢您的欣赏(xnshng)!第29页/共29页第二十九页,共30页。内容(nirng)总结文件的分类:。如果磁盘上存在文件stu.dat,屏幕上会显示。(其中ch为字符变量,fp为文件指针)。printf(“count=%dn”,count)。功能:按指定格式将数据写到指定文件中。SEEK_CUR、SEEK_END代替(dit),分别表。c=(c+1)%256。fp=fopen(“goods.dat”,”rb”)。第28页/共29页。感谢您的欣赏第三十页,共30页。