《C语言文件习题.ppt》由会员分享,可在线阅读,更多相关《C语言文件习题.ppt(69页珍藏版)》请在三一办公上搜索。
1、文件,1,引子,文件,scanfgetchargets.,printfputcharputs.,2,第十一章 文件,本章学习要点正确理解文件的概念,文件系统的特点;掌握文件指针的概念和定义方法;熟练使用文件读写函数,学会定位文件指针。,掌握本章内容的捷径:对文件永远是:打开操作关闭学会文件操作库函数(即标准I/O库函数)的用法,3,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,4,11.1 文件概述,文件的定义 存储在外部介质上(如磁盘和磁带等外存储器)的数据或信息的集合。例如:程序文件中保存着程序,而数据文件中保存着数据。main.cC语言源程序 文本文件main
2、.obj目标文件 二进制文件main.exe可执行文件 二进制文件,5,11.1 文件概述,文件的性质 文件是一个有序的数据序列,数据之间有着严格的排列次序关系,可以按照它们的排列顺序,依次进行访问,也可以按照需要,访问任意位置上的数据。,6,系统对文件的处理过程 系统对文件的处理过程就是对文件进行输入/输出操作的过程。,文件,程序数据区,输出文件缓冲区,输入文件缓冲区,计算机内存,计算机外存,写文件称为输出,读文件称为输入,7,11.1 文件概述,文件的分类,文本文件,二进制文件,普通文件(磁盘文件),特殊文件(标准设备文件),缓冲文件系统,非缓冲文件系统,8,从文件数据的组织形式(存储格式
3、)看ASCII文件(或称文本文件,即TEXT文件)文本文件中的数据采用ASCII码格式存储,全部数据转换为ASCII码。每个ASCII字符占1个字节。ASCII文件使用文本编辑器可直接阅读。二进制文件 对数据在内存中的二进制存储格式不做任何转换,直接存入文件,形成二进制文件。二进制文件在操作系统下不能直接阅读。,9,11.1 文件概述,例如:将整数1024分别存储到ASCII文件和二进制文件中,将采用不同的编码形式,占用不同的字节长度。,内存中的存储形式:补码,0000 0100 0000 0000,ASCII文件:ASCII码,二进制文件:补码,0000 0100 0000 0000,占4个
4、字节,占2个字节,10,比较:ASCII文件中,每个字符以ASCII码形式存储,方便对字符的逐个处理;在操作系统下或使用文本编辑器时,可以直接阅读、修改,方便与其它系统进行数据交换。缺点是占用磁盘存储空间多,并且系统要付出将内存中的二进制形式转为ASCII码的时间开销。用二进制形式输出,可以节省磁盘空间和转换时间,但输出的数据因为是内存中的格式,在操作系统下和一般的编辑器中不能直接识别。,11,11.1 文件概述,从用户观点看普通文件(也称为磁盘文件)特殊文件(也称为标准设备文件或标准I/O文件)普通文件是以磁盘为对象且无其它特殊性能的文件。特殊文件是以终端为对象的标准的设备文件。,12,11
5、.1 文件概述,在C语言中,“文件”的概念具有更广泛的意义。与每台主机相连的所有输入输出设备都看作是一个文件。即将实际的物理设备抽象为逻辑文件,它们也被称为设备文件。例如:键盘是输入文件 stdin(标准输入文件)显示器是输出文件 stdout(标准输出文件)打印机是输出文件 PRN,13,11.1 文件概述,从C语言对文件的处理方法看缓冲文件系统非缓冲文件系统 缓冲文件系统:对每个正在使用的文件,系统自动在内存中为其开辟一个文件缓冲区。称为高级文件操作。非缓冲文件系统:系统不会自动开辟缓冲区,文件缓冲区是由程序自己设置的。称为低级文件操作。,14,11.1 文件概述,在83年以后ANSI C
6、标准中取消了非缓冲文件系统,对文本文件和二进制文件均统一采用缓冲文件系统进行处理。本课程学习:缓冲式文件操作方式下,对磁盘文件进行基本操作。对文本文件和二进制文件有不同的处理方式。使用标准输入/输出库(stdio.h)函数来实现文件操作。,15,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,16,文件类型 FILE 在缓冲文件系统中,用一个 FILE 类型的结构变量来描述一个文件,该结构变量用于存放文件的有关信息,如文件名、文件状态等。在C语言中,无论是一般磁盘文件还是设备文件,都要通过文件结构的数据集合进行输入输出处理。文件结构不需要用户自己定义,是由系统事先定义
7、好的,包含在头文件 stdio.h 中,用户可以直接使用。,11.2 文件处理,17,文件结构类型FILE:typedef struct int _fd;/*文件位置指针,即当前文件的读写位置*/int _cleft;/*文件缓冲区中剩余的字节数*/int _mode;/*文件操作模式*/char*nextc;/*用于文件读写的下一个字符位置*/char*_buff;/*文件缓冲区位置(指针)*/FILE;文件结构变量在打开文件时由操作系统自动建立,用户使用文件时无需重复定义。在使用文件的时候要使用文件包含命令:#include,类型说明语句typedef:定义新的类型来代替已有类型:type
8、def int INT,18,11.2 文件处理,如何引用文件结构文件指针 C语言中对文件的操作都要通过指向该文件结构的指针。文件指针变量说明形式:FILE*文件型指针变量名;例如:FILE*fp;/*fp 是一个指针变量*/,文件指针是程序和文件联系的纽带,19,使用文件的一般步骤打开文件 操作文件 关闭文件打开文件:建立用户程序与文件的联系,为文件开辟文件缓冲区。操作文件:是指对文件的读、写、追加和定位操作:读操作:将文件中的数据读入计算机。写操作:向文件输出数据。追加操作:将数据写到原有数据的后面。定位操作:移动文件读写位置指针。关闭文件:切断文件与程序的联系,将文件缓冲区的内容写入磁盘
9、,并释放文件缓冲区。,20,打开文件(fopen)fopen函数的调用形式是:FILE*fp;fp=fopen(文件名,文件使用方式);文件名:需要打开的文件名称(字符串)。文件使用方式:是具有特定含义的符号。函数功能:按指定的文件使用方式打开指定的文件。若文件打开成功,则返回值为非NULL指针;若文件打开失败,返回NULL。,为该文件建立一个文件结构(变量),然后让指针指向该文件结构,例:fp=fopen(file1,r),21,11.2 文件处理,文本文件的三种基本打开方式“r”:只读方式。为读(输入)文本文件打开文件。若文件不存在,则返回NULL。“w”:只写方式。为写(输出)文本文件打
10、开文件。若文件不存在,则建立一个新文件;若文件已存在,则要将原来的文件清空。“a”:追加方式。在文本文件的末尾增加数据。若文件已存在,则保持原来文件的内容,将新的数据增加到原来数据的后面;若文件不存在,则创建。,22,二进制文件的三种基本打开方式“rb”:只读方式“wb”:只写方式“ab”:追加方式文件的其它打开方式“r+”:可对文本文件进行读/写操作。若文件不存在返回NULL;若文件存在,内容不会被清空。“w+”:可对文本文件进行读/写操作。若文件已经存在,则要先将文件原来的内容清空。“a+”:可对文本文件进行读/追加操作。“rb+”:可对二进制文件进行读/写操作。“wb+”:可对二进制文件
11、进行读/写操作。“ab+”:可对二进制文件进行读/追加操作。,23,常见文件打开操作if(fp=fopen(filename,r)=NULL)printf(Cannot open file.n);exit(0);/*打开文件出错,调用库函数终止程序*/含义:以只读方式打开文件名为filename的文件。文件名可以是从盘符开始的完整路径名,也可以是相对路径。,11.2 文件处理,24,11.2 文件处理,练习:以下可作为函数fopen中第一个参数的正确格式是:A.c:usertext.txtB.c:usertext.txt C.c:usertext.txtD.c:usertext.txt,25,
12、11.2 文件处理,char*pfilename;if(fp=fopen(pfilename,r)=NULL)printf(Cannot open file.n);exit(0);含义:以只读方式打开以 pfilename 指向的字符串为文件名的文件。,26,关闭文件(fclose)fclose函数的调用形式:FILE*fp;.fclose(fp);fp:已经打开的文件指针。函数功能关闭fp指定的文件,切断缓冲区与该文件的联系,并释放文件指针。若文件关闭成功,返回值为0;若文件关闭失败,返回非0值。,27,11.2 文件处理,系统标准设备文件 标准设备文件由系统自动打开和关闭,其文件结构的指针
13、由系统命名,用户在程序中可直接使用。C语言中提供了三个标准设备文件的指针:stdin 标准输入文件(键盘)stdout 标准输出文件(显示器)stderr 标准错误输出文件(显示器),28,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,29,11.3 文件顺序读写,文件顺序操作 对文件的操作(文件读写)必须按文件中字符的先后顺序进行,只能在操作了第i个字符之后,才能操作第i+1个字符。在对文件操作时,文件的位置指针由系统自动向前(文件尾方向)移动。,30,11.3 文件顺序读写,进行顺序操作的函数:字符输入输出函数 fgetc fputc字符串输入输出函数 fget
14、s fputs格式化输入输出函数 fscanf fprintf数据块输入输出函数 fread fwrite,31,键盘文件,内存,显示器文件,磁盘文件,磁盘文件,scanfgetchargets.,printfputcharputs.,fscanffgetcfgetsfread.,fprintffputcfputsfwrite.,32,字符输入输出(fgetc/fputc)输入函数:ch=fgetc(fp);fp为已经打开的文件的指针函数功能:从指定的文件中读取一个字符。即:从fp所指向的文件(该文件必须是以读或读写方式打开的)中读取一个字符返回,读取的字符赋给变量ch。若读取字符时文件已经结
15、束或出错:对于ASCII文件,文件结束时,返回文件结束标记EOF(-1);对于二进制文件,要使用feof函数来判断文件是否结束。,33,11.3 文件顺序读写,输出函数:fputc(ch,fp);ch为需要输出的字符函数功能:将一个字符输出到指定文件中。即将字符变量ch中的字符输出到fp所指向的文件。若输出操作成功,该函数返回输出的字符;否则,返回EOF。,34,例:显示一个文本文件的内容#include int main()FILE*fp;char filename20,ch;printf(Enter filename:);scanf(%s,filename);/*输入文件名*/if(fp=
16、fopen(filename,r)=NULL)/*打开*/printf(“file open error.n”);/*出错处理*/exit(0);while(ch=fgetc(fp)!=EOF)/*读字符*/putchar(ch);fclose(fp);/*关闭文件*/,35,例:使用标准输出文件显示文本文件内容#include int main()FILE*fp;char filename20,ch;printf(Enter filename:);scanf(%s,filename);/*输入文件名*/if(fp=fopen(filename,r)=NULL)/*打开*/printf(“fi
17、le open error.n”);/*出错处理*/exit(0);while(ch=fgetc(fp)!=EOF)/*读字符*/fputc(ch,stdout);/*向标准输出文件输出(显示)*/fclose(fp);/*关闭文件*/,36,例:复制文本文件int main()FILE*fp1,*fp2;char file120,file220,ch;printf(Enter filename1:);scanf(%s,file1);printf(Enter filename2:);scanf(%s,file2);if(fp1=fopen(file1,“r”)=NULL)/*打开文件1*/pr
18、intf(file1 open error.n);exit(0);if(fp2=fopen(file2,“w”)=NULL)/*打开文件2*/printf(file2 open error.n);exit(0);while(ch=fgetc(fp1)!=EOF)/*从文件fp1中读字符*/fputc(ch,fp2);/*写入文件fp2中*/fclose(fp1);fclose(fp2);,37,putchar(ch);fputc(ch,stdout);fputc(ch,fp2);,38,11.3 文件顺序读写,字符串输入输出(fgets/fputs)输入函数:fgets(s,n,fp);cha
19、r s;int n;FILE*fp;函数功能:从 fp 所指向的文件中读取长度不超过 n-1 个字符的字符串,并将该字符串放到字符数组 s 中。函数的返回值为字符数组 s 的首地址;如果文件结束或出错,则返回 NULL。,39,11.3 文件顺序读写,情况1:已读入 n-1 个字符则:s 中存入 n-1 个字符,串尾为 0情况2:读入字符遇到 n则:s 中存入实际读入的字符,串尾为 n0情况3:读入字符遇到文件尾则:s 中存入实际读入的字符,EOF 不存入数组,串尾为 0情况4:当文件已经结束时,继续读文件则函数返回NULL,表示文件结束,40,打开文本文件:fp,fgets(s,4,fp);
20、,文件的读写位置指针,顺序读入3个字符,存入数组,加上0,fgets(s,4,fp);,顺序读入n,存入数组,退出,加上0,读入字符:,c 文件指针自动向后移动,n 文件指针自动向后移动,fgets(s,4,fp);,顺序读入遇到EOF,不存退出,加上0,f 文件指针自动向后移动,fgets(s,4,fp);,读入EOF,不存,函数返回NULL,EOF,41,int main()FILE*fp;char file20,s4;printf(Enter filename:);scanf(%s,file);if(fp=fopen(file,r)=NULL)printf(file open error
21、.n);exit(0);while(fgets(s,4,fp)!=NULL)printf(%s,s);fclose(fp);,abcdnf,abcdnf,输入文件:,输出:,fgets语句执行四次,循环执行三次,用长度为 4 的数组实现对文件内容的原样输出,42,11.3 文件顺序读写,输出函数:fputs(s,fp);char s;FILE*fp;函数功能:将s指向的字符串或字符串常量写入文件 fp。输出的字符串写入文件时,字符串结束标记“0”被自动舍去。函数调用成功,则返回值为 0;否则,返回文件结束标记 EOF。,43,int main()FILE*fp1,*fp2;char file1
22、20,file220,s10;printf(Enter filename1:);scanf(%s,file1);printf(Enter filename2:);scanf(%s,file2);if(fp1=fopen(file1,r)=NULL)/*打开文件1*/printf(file1 open error.n);exit(0);if(fp2=fopen(file2,w)=NULL)/*打开文件2*/printf(file2 open error.n);exit(0);while(fgets(s,10,fp1)!=NULL)/*从fp1读出字符*/fputs(s,fp2);/*将字符串写入
23、文件fp2中*/fclose(fp1);fclose(fp2);,例:复制文本文件,44,格式化输入输出(fscanf/fprintf)输入函数:fscanf(fp,格式控制符,变量地址表);功能:从ASCII文件fp中读取字符,按格式控制符的含义存入对应的变量中,返回值为输入的数据个数。fscanf与scanf类似,格式控制符相同。输出函数:fprintf(fp,格式控制符,表达式列表);功能:将表达式列表中的数据按照格式控制符的说明,存入ASCII文件fp中,返回值为实际存入的数据个数。fprintf与printf类似,格式控制符相同。,45,int main()FILE*fp1;int
24、a;char file20,s10;printf(Enter filename:);scanf(%s,file);if(fp=fopen(file,r)=NULL)printf(file open error.n);exit(0);fscanf(fp,%s%d,s,printf(%s%dn,s,a);,注意此间发生的二进制和ASCII码的转换,46,数据块输入输出(fread/fwrite)输入函数:fread(buffer,size,count,fp);char*buffer;unsigned size;int count;FILE*fp;函数功能:从二进制文件fp中读取count个数据块存
25、入buffer中,每个数据块的大小为size个字节。操作成功,函数的返回值为实际读入的数据块的数量;若文件结束或出错,返回值为0。,47,11.3 文件顺序读写,输出函数:fwrite(buffer,size,count,fp);char*buffer;unsigned size;int count;FILE*fp;函数功能:将buffer中的count个数据块写入二进制文件fp中,每个数据块的大小为size个字节。操作成功,函数的返回值为实际写入文件的数据块的数量;若文件结束或出错,返回值为0。,48,从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕
26、上。#define SIZE 3struct student/*定义结构*/long num;char name10;int age;char address10;stuSIZE,out;void fsave()FILE*fp;int i;if(fp=fopen(“student”,“wb”)=NULL)/*二进制写*/printf(Cannot open file.n);exit(1);for(i=0;iSIZE;i+)/*以数据块形式写入文件*/if(fwrite(/*关闭文件*/,写入一个整型:int a=15;fwrite(,49,主函数int main()FILE*fp;int i;
27、for(i=0;iSIZE;i+)/*从键盘读入学生的信息*/printf(Input student%d:,i+1);scanf(%ld%s%d%s,/*关闭文件*/,键盘结构数组文件文件结构变量显示器,50,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,51,11.4 文件随机操作,文件读写操作的内部机制文件的读写是通过文件系统内部的“位置指针(读写位置指针)”进行的。当打开一个文件时,系统自动为这个打开的文件建立一个位置指针,对该文件的读写操作均通过位置指针进行操作。fopen后位置指针指向文件中第0个字节(位置指针指向已经读入的最后一个字节)。文件结束时,位
28、置指针指向文件最后1个字符的位置(调用feof函数为非0,表示文件已经结束)。,52,顺序读写操作 在顺序读写文件时,文件的位置指针由系统自动控制,每次读写操作,系统都会先将位置指针移到文件的下一个字节,然后再进行读写操作。在不改变文件的读写位置指针的情况下,只能对文件进行顺序操作。随机读写操作 通过改变文件的位置指针,可在文件的任意位置进行读写操作。与文件位置指针有关的函数:fseek移动文件的位置指针 rewind文件的位置指针回到文件头位置 ftell取文件的位置指针,53,位置指针移动(fseek)fseek(fp,offset,position);FILE*fp;long offse
29、t;int position;函数功能:将指定文件 fp 的文件读写位置指针按照position规定的方式移动offset 个字节。移动成功返回当前位置;否则,返回-1。position为起始点,指出以文件的什么位置为基准进行移动:0 文件的开头;1 文件的当前位置;2 文件的末尾。,54,11.4 文件随机操作,实例:执行 fopen 成功后:文件读写位置指针为文件的第 0 个字节 fseek(fp,50,0);从文件头开始向前(文件尾方向)移动 50 个字节 如果继续进行 fgetc,将读入第 51 个字符 fseek(fp,-10,1);从当前位置向后(文件头方向)移动 10 个字节 f
30、seek(fp,0,0);文件指针回到文件头,文件指针值回到 0,0 文件的开头;1 文件的当前位置;2 文件的末尾。,55,11.4 文件随机操作,实例:fseek(fp,0,2)将文件位置指针移动到文件最后一个字符的后面,可以简单认为是指向了文件结束标记EOF fseek(fp,-1,2)文件指针指向最后一个字符 fseek(fp,-2,2)文件倒数第2个字符(文件最后一个字符之前)fseek(fp,-20,2)从文件尾开始向后(文件头方向)移动 20 个字节,0 文件的开头;1 文件的当前位置;2 文件的末尾。,56,11.4 文件随机操作,位置指针返回到文件头(rewind)rewin
31、d(fp);函数功能:使指定文件 fp 的读写位置指针重新定位到文件的头位置。即:使文件位置指针回到0。等价于:fseek(fp,0,0),57,11.4 文件随机操作,取位置指针(ftell)ftell(fp);函数功能:取 fp 所指向文件的当前读写位置,即文件读写位置指针的当前值。该值是一个长整型数,是位置指针从文件开始处到当前位置的位移量的字节数。如果函数的返回值为-1L,表示出错。,58,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,59,11.5 文件检测,检测文件操作后的状态 一般情况下应该检验的文件状态有:文件是否结束?文件操作是否出错?C语言提供了
32、两种手段来反映函数调用的情况和文件的状态:使用函数的返回值可以知道各种文件调用(操作)是否成功;使用检测函数可以判断文件的操作状态和出错状态。,60,检测文件结束函数feof(fp)功能:若文件已经结束,返回值为非0;若文件尚未结束,返回值为0。检测文件出错函数ferror(fp)功能:若文件出错,返回值为非0;若文件未出错,返回值为0。清除出错标记及文件结束标记clearerr(fp)功能:清除文件 fp 的出错和文件结束标记。,61,62,63,第十一章 文件,文件概述文件处理文件顺序读写文件随机操作文件检测文件实例,64,11.6 文件实例,从计算机的内存中将数据写入文件,称为。A.输入
33、 B.输出 C.修改 D.删除C语言可以处理的文件类型是。A.文本文件和数据文件 B.文本文件和二进制文件C.数据文件和二进制文件 D.以上答案都不完全下列关于文件的结论中正确的是。A.对文件操作必须先关闭文件B.对文件操作必须先打开文件C.对文件的操作顺序没有统一规定D.以上三种答案全是错误的,65,11.6 文件实例,系统的标准输入文件是。A.键盘 B.显示器 C.软盘 D.硬盘对文件的基本操作过程是。A.打开操作关闭 B.打开(可省)操作关闭 C.打开操作关闭(可省)D.以上三个答案都不对为了显示一个文本文件的内容,在打开文件时,文件的打开方式应当是。A.r+B.w+”C.wb+D.ab
34、+,66,11.6 文件实例,要打开一个已存在的非空文件“file”用于修改,选择正确的语句是。A.fp=fopen(file,r);B.fp=fopen(file,a+);C.fp=fopen(file,w);D.fp=fopen(file,r+);为了改变文件的位置指针,应当使用的函数是。A.fseek()B.rewind()C.ftell()D.feof()要将一个结构数组存入一个二进制文件中,应当使用函数。A.fputc B.fputs C.fprintf D.fwrite,67,例:从键盘接受姓名(例如:输入“ZHANG SAN”),在文件“try.dat”中查找,若文件中已有刚输入
35、的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:若磁盘文件try.dat,已存在,则要保留文件中原来的信息;若文件try.dat不存在,则在磁盘上建立一个新文件。当输入的姓名为空时(长度为0),结束程序。,11.6 文件实例,68,int main()FILE*fp;int flag;char name30,data30;if(fp=fopen(try.dat,【】)=NULL)exit(0);do printf(Enter name:);gets(name);if(strlen(name)=0)break;strcat(name,n);【】;flag=1;while(flag,A.r+B.w+C.a+D.w,a+,rewind(fp),!=NULL,A.rewind(fp)B.fseek(fp,0,1)C.ftell(fp)D.空语句,A.!=NULL B.=NULL C.!=EOF D.=EOF,A.break B.flag=0 C.continueD.flag=-1,flag=0,A.ferror(fp)!=0 B.ferror(fp)=0 C.flag=0 D.flag=-1,ferror(fp)=0,