《C语言程序设计》第十章文件课件

PPT
  • 阅读 87 次
  • 下载 0 次
  • 页数 50 页
  • 大小 248.000 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
《C语言程序设计》第十章文件课件
可在后台配置第一页与第二页中间广告代码
《C语言程序设计》第十章文件课件
可在后台配置第二页与第三页中间广告代码
《C语言程序设计》第十章文件课件
可在后台配置第三页与第四页中间广告代码
《C语言程序设计》第十章文件课件
《C语言程序设计》第十章文件课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 50
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】《C语言程序设计》第十章文件课件.ppt,共(50)页,248.000 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2142.html

以下为本文档部分文字说明:

1第十章文件10.1C文件概述10.2文件的打开与关闭函数10.3文件的读/写函数10.4文件处理的其它常用函数10.5文件应用程序设计举例2文件概述一、文件的概念和分类:文件:一个存储在外部介质上的数据的集合。数据文件--如果文件中存放的都是数据。程序文件--

如果文件中存放提源程序清单或是编绎连接后成的可执行文件。磁盘文件--存放在磁盘上,关闭计算机后文件仍存在,下次开机,可以从磁盘文件中读取数据。1、文件名:能唯一标织某个磁盘文件的就是"磁盘文件名"。盘文件名的一般组成:盘

符:路径\文件主名.扩展名,文件主名是由字母开头的字母数字等字符组成的,长度≤8个字符。扩展名也是由字母开头的字母数字等字符组成的,长度≤3个字符。32、磁盘文件的打开与关闭通常把从磁盘文件中读取数据到内存称为“文件的打开”;把

内存中的数据存回到磁盘文件称为“文件的关闭”。使用文件要先打开,使用后,必须关闭。3、缓冲文件系统和非缓冲文件系统缓冲文件系统:系统自动设定缓冲区,随着一个文件夹的打开,自动设置一段内存区域作为这个文件的缓冲区

。非缓冲文件系统:系统不自动设置缓冲区,要求用户在程序中的打开的文件设置缓冲区。这个内存区是磁盘文件和程序中存放数据的变量、数组之间交换数据的缓冲区域,称为“文件缓冲区”。44、磁盘文件的分类按数据格

式分类:二进制文件、文本文件按读写方式分类:顺序文件、随机文件5、设备文件输入/输出设备也看成文件,称为设备文件。常用输入设备是键盘,称标准输入设备;常用输出设备是显示器,称标准输出设备;还有一个专用于输出错误信息的标准错误输出设备,也是指显

示器。从输入设备上读取数据,可以看成是从输入设备文件中读取数据;将数据写到输出设备上,可以看成是写到输出设备文件中。5C语言规定,对上述三种标准的输入/输出设备进行数据的读写操作,不必事先打开设备文件,操作后,也可不必关闭设备文件。二、文件型指针C语言规定文件类型是一种

特殊的“结构型”。对这个结构类型,系统已经在名为“stdio.h”的头文件中按下列格式进行了定义:typedefstruct{int_fd;int_cleft;int_mode;char*nextc;char*buff;}FILE;6用“FILE”定义的指

针变量通常称为“文件型指针”,是专用于文件处理的。文件型指针的定义方法如下:FILE*文件型指针名1,*文件型指针名2,...;其中的“文件型指针名”是用户选取的标识符。7文件的打开与关闭函数一、打开文件函数【函数头】FILE*fopen(char*filename,char*mode)【参数】

filename字符型指针,指向的字符串是要打开的磁盘文件名。mode字符型指针,指向的字符串是文件使用的方式。这两个参数对应的实参可以是字符串常量,也可以是字符数组首地址,或者是指向字符串的指针变量。8文件使用

方式可以是下列字符串:"r"打开一个已经存在的文本文件,只能读取数据。"w"打开一个文本文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去旧文件,建立一个同名新文件,接受写入的数据。"a"打开一个已存在的文本文件,

只能写入数据并且追加在文件尾部。“r+”打开一个已存在的文本文件,可以读取数据,也可以写入数据。"w+"打开一个文本文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去旧文件,建立一个同名新文件,接受写入的数据。"a+"打开一个已经存在的

文本文件,可以读取数据,也可以写数据到文件尾部。9"rb"打开一个已经存在的二进制文件,只能读取数据。"wb"打开一个二进制文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去

旧文件,建立一个同名新文件,接受写入的数据。"ab"打开一个已存在的二进制文件,只能写入数据并且追加在文件尾部。"rb+"打开一个已存在的二进制文件,可以读取数据,也可以写入数据。"wb+"打开一个二进制文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已

存在,则删去旧文件,建立一个同名新文件,接受写入的数据。"ab+"打开一个已经存在的二进制文件,可以读取数据,也可以写数据到文件尾部。10【功能】以mode指定的“使用方式”,打开filename指定的“文件名”对应的文件,同时自动给该文件分配一个内存缓

冲区。【返回值】能正确打开指定的文件,则返回一个指向“文件型变量”的地址;如果打开文件出现错误,返回值为“NULL”,表示打开文件错误。“NULL”代表空,其值为“0”。在文件打开之前,应该定义文件型指针,以便接受打开文件函数返回的地址。打开文件时,一般要对返回值进行判断,如

果返回值为“NULL”,则表示文件打开出错,不能使用这个文件,应提示用户,并中止程序的运行。11二、关闭文件函数【函数头】intfclose(FILE*fp)【参数】fp文件型指针,通过fopen()

函数获得的、已指向某个打开的文件。【功能】关闭fp所指向的文件,同时自动释放分配给文件的内存缓冲区。【返回值】能正确关闭指定的文件,则返回0;否则返回非0。12下面的程序说明了文件的打开与关闭的常用方式:#incl

ude"stdio.h"FILE*fp;...if((fp=fopen("文件名","文件使用方式"))==NULL){printf("filecannotopen!\n");exit(0);}...fclose(fp);1

3三、标准设备文件的打开与关闭三种标准输入/输出设备的使用不必事先打开对应的设备文件,因为在系统启动后,已自动打开这三个设备文件,并且为它们各自设置了一个文件型指针,名称如下:标准设备名称对应文件型指

针名标准输入设备(键盘)stdin标准输出设备(显示器)stdout标准错误输出设备(显示器)stderr14文件的读/写函数一、文件尾测试函数【函数头】intfeof(FILE*fp)【参数】fp文件型指针,通

过fopen()函数获得的,已指向某个打开文件。【功能】测试fp所指向的文件是否到达文件尾。是文件尾返回非0,否则返回0。【返回值】若当前是文件尾,返回非0,否则返回0。15二、字符读/写函数1、写字符函数【

函数头】intfputc(charch,FILE*fp)【参数】ch写到文件中的字符,可以是字符常量、字符变量等。fp文件型指针,通过fopen()函数获得的、已指向某个打开的可写文件。该文件可以是文本文件,也可以是二进制

文件。【功能】将ch中的字符写到fp所指向的文件的当前位置。【返回值】正确,则返回刚写到文件中的字符;错误,则返回EOF(符号常量,其值为-1)。16例1从键盘输入10个字符,写到a盘根目录下名为“char2.txt”

的文本文件中。程序清单如下:#include"stdio.h"main(){FILE*fp;inti;charc;if((fp=fopen("a:\char2.txt","w"))==NULL){printf("filecannotopen!

\n);exit(0);}for(i=0;i<10;i++){c=getchar();fputc(c,fp);}fclose(fp);}172、读字符函数【函数头】intfgetc(FILE*fp)【参数】fp文件型指针,通过

fopen()函数获得的、已指向某个打开的可读文件。该文件可以是文本文件、也可以是二进制文件。【功能】从fp所指向的文件当前位置读取单个字符。【返回值】正确,则返回读取的单个字符;错误,则返回EOF(-1)。18例2从a盘根目录下名为“char2.txt”的文本文件中读取前10个字符,依

次显示在屏幕上。如果文本文件中不足10个字符,则有多少个字符读取并显示多少个字符。程序清单如下:#include"stdio.h"main(){FILE*fp;inti;charc;if((fp=fopen("a:\char2.txt","r"))==NULL){print

f("filecannotopen!\n");exit(0);}19for(i=0;i<10;i++){if(feof(fp))break;c=fgetc(fp);putchar(c);}fclose(fp);}例3编一个函数完成文本文件的复制,源

文件和目标文件名作为函数参数。函数清单如下:#include"stdio.h"voidmy_copy(fname1,fname2)char*fname1;char*fname2;20{FILE*fp1,*fp2;if((fp1=fopen(fname1,"r"))==NULL){printf("f

ilecannotopen!\n");exit(0);}if((fp2=fopen(fname2,"w"))==NULL){printf("filecannotopen!\n");exit(0);}while(!feof(fp1))fputc(fgetc(

fp1),fp2);fclose(fp1);fclose(fp2);return;}21三、字符串读/写函数读/写字符函数处理的文件类型是文本文件,读写的数据是以字符串的单位。1、写字符串函数【函数头】

int*fputs(char*str,FILE*fp)【参数】str字符型指针,可以是字符串常量,或存放待输出字符串的字符数组首地址,也可以是指向待输出字符串的指针变量。fp文件型指针,通过fopen()函数获得的、已指向打开的可写文本文件。【功能】将str指向的一个字

符串,舍去结束标记‘\0’后写入fp所指向的文件中。22【返回值】正确,则返回写入文件的实际字符数;错误,则返回EOF(-1)。例4从键盘上读取3个字符串,依次写入a盘根目录下名为“string1.txt”的文本文件。程序清单如下

:#include"stdio.h"main(){FILE*fp;inti;chars1[3][100],s2[3][100];for(i=0;i<3;i++)gets(s1[i]);if((fp=fopen("a:\string1.tx

t","w"))==NULL){printf("filecannotopen!\n");exit(0);}23for(i=0;i<3;i++)fputs(s1[i],fp);fclose(fp);}2、读字符串函数【函数头】char*fgets(char*str,in

tn,FILE*fp)【参数】str字符型指针,可以是存放字符串的字符数组首地址,也可以是指向某个能存放字符串的内存区域的指针变量。n整型,可以是整型常量、变量或表达式。fp文件型指针,通过fopen()函数

获得的、已指向打开的可读文本文件。24【功能】从fp所指向的文件当前位置读取n-1个字符,在其后补充一个字符串结束标记‘\0’,组成字符串并存入str指定的内存区。如果读取的前n-1个字符时有“回车符”,则只读到回车符为止,补充结束标

记‘\0’组成字符串(包括回车符),回车符后的字符将不再读取。如果读取的前n-1个字符时遇到文件尾,则将读取的字符后面补充结束标记'\0'组成字符串。【返回值】正确,则返回str对应的地址;错误,则返回NULL(0)。当正确地读取了1个字符串后,文件内部指针会自

动后移1个字符串的位置。25例5从a盘根目录下名为“string1.txt”的文本文件中读取一个字符串或前20个字符组成字符串,并显示在屏幕上。程序清单如下:#include"stdio.h"main(){FILE

*fp;chars[21];if((fp=fopen("a:\string1.txt","r"))==NULL){printf("filecannotopen!\n");exit(0);}fgets(s,21,fp);fputs(s,

stdout);fclose(fp);}26虽然可以使用以前介绍的puts()函数将字符串输出到显示器,但fputs()函数在输出时是舍弃了这个结束标记'\0'。四、数据读/写函数读写数据函数处理的文件类型主要是二进制文件,也可

以是文本文件(数据是字符型)。读写的数据可以是字符型、整型、实型,也可以是结构型等。1、写数据函数【函数头】intfwrite(char*buf,unsignedsize,unsignedn,FILE*fp)27【参数】buf字符型指针,可以是存放

数据的变量地址或数组首地址,也可以是指向某个变量或数组的指针变量。size无符号整型,可以是整型常量、变量或表达式。代表写入文件的每个数据所占用的字节总数。通常使用表达式“sizeof(数据类型符)”。n无符号整型,可以是整型常量、变量或表达式。代表写入文

件的数据的个数(注意每个数据是size个字节)。fp文件型指针,通过fopen()函数获得的、已指向打开的可写文件。28【功能】将buf指向的n个数据(每个数据的字节数为size)写入fp指向的文件。【返回值】正确,则返回n值;错误,则返回NULL(0)。当正确地

写入文件n个数据后,文件内部指针会自动后移n×size个字节的位置。例6从键盘上读取10个整型数据,写入a盘根目录下名为“intb1.dat”的二进制数据文件中。程序清单如下:29#include"stdio.h'm

ain(){FILE*fp;inta[10],*p=a;if((fp=fopen("a:\intb1.dat","wb"))==NULL){printf("filecannotopen!\n");exit(0);}whil

e(p<a+10)scanf("%d",p++);fwrite(a,sizeof(int),10,fp);fclose(fp);}302、读数据函数【头函数】intfread(char*buf,unsignedsize,unsignedn

,FILE*fp)【参数】buf字符型指针,可以是存放数据的变量地址或数组首地址,也可以是指向某个变量或数组的指针变量。size无符号整型,可以是整型常量、变量或表达式。代表读取文件的每个数据所占用的字

节总数。通常使用表达式“sizeof(数据类型符)”。n无符号整型,可以是整型常量、变量或表达式。代表读取文件的数据(size个字节)的个数。fp文件型指针,通过fopen()函数获得的、已指向打开的可读文件。31【功能】从fp所指向的文件当前

位置读取n个数据,每个数据的字节数为size,共组成n个长度为size的数据存入but指定的内存区。【返回值】正确,则返回n值;错误,则返回NULL(0)。当正确地读取了n个数据后,文件内部指针会自动后移n×size个字节的位置。例7从a盘根目

录下名为“intb1.dat”的二进制数据文件中读取10个整数,输出到显示器上。程序清单如下:32#include"stdio.h"main(){FILE*fp;inti,a[10];if((fp=fopen("a:\intb1.dat","rb"))==NULL)

{printf("filecannotopen!\n");exit(0);}fread(a,sizeof(int),10,fp);for(i=0;i<10;i++)printf("%d",a[i]);fclose(fp);}33文件处理的其它常用函数1、文件头定位函数【函数头】intrewind

(FILE*fp)【参数】fp文件型指针,通过fopen()函数获得的、已指向某个打开的文件。【功能】将文件内部指针置于fp所指向的文件开头。【返回值】正确,返回0;错误,返回非0。例8复制a盘当前目录下名为“char2.txt”的文本文件到b盘根目录下,文

件名相同。然后再显示这两个文件中的内容。程序清单如下:34#include"stdio.h"main(){FILE*fp1,*fp2;charc;char*fname1="a:\char2.txt",*fname2="b:\char2.t

xt";if((fp1=fopen(fname1,"r"))==NULL){printf("filecannotopen!\n");eixt(0);}if((fp2=fopen(fname2,"w"))==NULL){printf("filecannotopen!\

n");eixt(0);}while(!feof(fp1)){c=fgetc(fp1);fputc(c,fp2);}rewind(fp1);35while(!feof(fp1)putchar(fgetc(fp1);fclose(fp2);if((fp2=fopen(f

name2,"r"))==NULL){printf("filecannotopen!\n");exit(0);}while(!feof(fp2))putchar(fgetc(fp2));fclose(fp1);fclose(fp2);}362、文件随机定位函数【

函数头】intfseek(FILE*fp,longoffset,intfrom)【参数】fp文件型指针,通过fopen()函数获得的、已指向某个打开的文件。offset长整型表达式,表示从from为起始位置的偏移字节数。可以取正数(向文件尾方向移动)、0(不移动)

、负数(向文件头方向移动)。from确定起始位置的参数。可以选取下列整型数或名称:整数012名称SEEK_SETSEEK_CURSEEK_END起始位置文件头内部指针的当前位置文件尾37【功能】将fp所指向的文件内部指针从from指定的起始位置移动offset个字节,

指向新的位置。【返回值】正确,返回0;错误,返回非0。例如:fseek(fp,20L,1)表示从当前位置后移20个字节的位置;fseek(fp,-10L,SEEK_END)表示从文件尾开始前移10个字节的位置。注意,偏移量如果使用常数,则必须是长整型的

,即整数后要加“L”,或“l”。如果使用表达式,可以用“(long)(表达式)”强制转换成长整型。38例9设a盘根目录下有一个名为“intb1.dat”的二进制文件,其中连续存放了10个整数。要求读取并显示其中第1、3、5和第9、10个数据。程序清单如

下:#include"stdio.h"main(){FILE*fp;inti,x;if((fp=fopen("a:\intb1.dat","rb"))==NULL){printf("filecannotopen!\n");exit(0);}for(i=0;i<3;i+

+){fseek(fp,(long)(i*sizeof(int)),0);fread(&x,sizeof(int),1,fp);printf("%d...%d\n",2*i+1,x);}39fseek

(fp,-2L*sizeof(int),SEEK_END);fread(&x,sizeof(int),1,fp);printf(%d...%d\n",9,x);fseek(fp,-1L*sizeof(int),SEEK_END);fread(&x,sizeof(int

),1,fp);printf("%d...%d\n",10,x);fclose(fp);}403、错误测试函数【函数头】intferror(FILE*fp)【参数】fp文件型指针,通过fopen()获得的、已指向某个打开的文件。【功能】测试f

p所指向的文件在最近一次的操作(包括读写、定位等)时是否发生错误。有错,则返回非0值;无错,则返回0值。【返回值】无错误,返回0;有错误,返回非0。例10重编上例的程序。要求使用错误测试函数来判断文件操作中是否发生错误。程序清单如下:41#i

nclude"stdio.h"voidpro_err(fp)FILE*fp;{if(ferror(fp)!=0){printf("filecannotopen!\n");exit(0);}elsereturn;}main(){FILE*fp;inti,x;if((fp=fo

pen("a:\intb1.dat","rb"))==NULL){printf("filecannotopen!\n");exit(0);}42for(i=0;i<3;i++){fseek(fp,(long)(i*sizeof(int)),0);pro

_err(fp);fread(&x,sizeof(int),1,fp);pro_err(fp);printf("%d...%d\n",2*i+1,x);}fseek(fp,-2L*sizeof(int),SEEK

_END);pro_err(fp);fread(&x,sizeof(int),1,fp);pro_err(fp);printf(%d...%d\n",9,x);fseek(fp,-1L*sizeof(int),SEEK_END);pro_err(fp);f

read(&x,sizeof(int),1,fp);pro_err(fp);printf("%d...%d\n",10,x);fclose(fp);}43文件应用程序设计举例例11设a盘根目录下面有一个名为“ch

ar2.txt”的文本文件。编一个程序,将该文件中的所有小写字母换成大写字母。程序清单如下:#include"stdio.h"#include"ctype.h"main(){FILE*fp;charc;if((fp=fopen("a:\char2.txt","r+"))==NULL){prin

t("filecannotopen!\n");exit(0);}44while(!feof(fp)){c=fgetc(fp);if(islower(c)!=0){c=toupper(c);fseek(fp,-1L,1);fputc(c,fp);fseek(fp,0L,1);}}fclo

se(fp);}45例12编一个函数,比较两个文本文件是否完全相同,若相同则返回值为1;若不相同则返回值为0。两个文本文件名作为函数的参数。函数清单如下:#include"stdio.h"intmy_comp(fname1,fname2)char*fname1,*fname2

;{FILE*fp1,*fp2;intflag=1;charc1,c2;if((fp1=fopen(fname1,"r"))==NULL){printf("filecannotopen!\n");exit(0);}46if(

(fp2=fopen(fname2,"r"))==NULL){printf("filecannotopen!\n");exit(0);}while(1){if((feof(fp1))&&(feof(fp2))){flag=1;break;}if((fe

of(fp1))&&(!feof(fp2))){flag=0;break;}if((!feof(fp1))&&(feof(fp2))){flag=0;break;}c1=fgetc(fp1);c2=fgetc(fp2);i

f(c1!=c2){flag=0;break;}}fclose(fp1);fclose(fp2);return(flag);}47课堂练习1、若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应是。A)"ab++"B)"w

b+"C)"rb+"D)"ab"答案:B482、显示文本文件的内容并将行号显示出来。答案:#include<stdio.h>#defineLONGARRAY256main()/*注:对文件操作的库函数,函数原型均在头文件stdio.h中{charbuff[LONGARRAY];/

*buffisachararray*/intc,lcnt;FILE*fp;/*注意:结构类型名“FILE”必须大写*/charfile[20];puts("Inputafilename:");scanf("%s",file);if((fp=fopen(file,"r

"))==NULL){printf("\nfile%scan'topened\n",file);exit();}lcnt=0;while(fgets(buff,LONGARRAY,fp)!=NULL)printf("%3d:%s",++lcnt,buff);fclose(fp);}49分析:

(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(2)关于exit()函数用法:voidexit([程序状态值]);功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为

0时,表示程序正常退出;非0值时,表示程序出错退出。(3)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。50课程结束,再见!

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?