C语言程序设计 PPT 第16章 文件 配套教材 高等教育出版社 清华大学出版社_第1页
C语言程序设计 PPT 第16章 文件 配套教材 高等教育出版社 清华大学出版社_第2页
C语言程序设计 PPT 第16章 文件 配套教材 高等教育出版社 清华大学出版社_第3页
C语言程序设计 PPT 第16章 文件 配套教材 高等教育出版社 清华大学出版社_第4页
C语言程序设计 PPT 第16章 文件 配套教材 高等教育出版社 清华大学出版社_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

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

文档简介

1、16.1 语言语言文件的文件的概念概念16.2 文件指针文件指针16.3 打开打开文件文件 16.4 关闭文件关闭文件16.5 调用调用getc(fgetc)和和putc(fputc)函数进函数进行输入输出行输入输出16.6 判断文件结束函数判断文件结束函数feof16.7 fscanf函数和函数和fprintf函数函数16.8 fgets函数和函数和fputs函数函数16.9 fread函数和函数和fwrite函数函数16.10 文件定位函数文件定位函数2021年11月20日1时06分文件有不同的类型,在程序设计中,主要文件有不同的类型,在程序设计中,主要用到两种文件:用到两种文件:(1)

2、程序文件程序文件。包括。包括源程序文件源程序文件(后缀为后缀为.c)、目标文件目标文件(后缀为后缀为.obj)、可执行文件可执行文件(后缀为后缀为.exe)等。这种文件的内容是程序代码。等。这种文件的内容是程序代码。2021年11月20日1时06分文件有不同的类型,在程序设计中,主要文件有不同的类型,在程序设计中,主要用到两种文件:用到两种文件:(2) 数据文件数据文件。文件的内容不是程序,而是供。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中程序运行时读写的数据,如在程序运行过程中输出到磁盘输出到磁盘(或其他外部设备或其他外部设备)的数据,或在程的数据,或在程序运行过程中

3、供读入的数据。如一批学生的成序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。绩数据,或货物交易的数据等。本章主要讨论的是本章主要讨论的是数据文件数据文件2021年11月20日1时06分在以前各章中所处理的数据的输入和输出在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出从终端的键盘输入数据,运行结果输出到终端显示器上到终端显示器上常常需要将一些数据输出到磁盘上保存起常常需要将一些数据输出到磁盘上保存起来,以后来,以后使用使用这就要用到磁盘文件这就要用到磁盘文件2021年11月20日1时06分操作系统把各种设备都统一作为文件处理操作系统把各种设备都统一作

4、为文件处理从操作系统的角度看,每一个与主机相联从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如,的输入输出设备都看作是文件。例如,u终端键盘是输入文件终端键盘是输入文件u显示屏和打印机是输出文件显示屏和打印机是输出文件2021年11月20日1时06分“文件文件”指存储在外部介质上数据的集合指存储在外部介质上数据的集合u一批数据是以文件的形式存放在外部介质上的一批数据是以文件的形式存放在外部介质上的u操作系统是以文件为单位对数据进行管理操作系统是以文件为单位对数据进行管理u想找存放在外部介质上的数据,先按文件名找想找存放在外部介质上的数据,先按文件名找到所指定的文件,然后再从

5、该文件读数据到所指定的文件,然后再从该文件读数据u要向外部介质上存储数据也必须先建立一个文要向外部介质上存储数据也必须先建立一个文件(以文件名作为标志),才能向它输出数据件(以文件名作为标志),才能向它输出数据2021年11月20日1时06分输入输出是数据传送的过程,数据如流水输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输一样从一处流向另一处,因此常将输入输出形象地称为流出形象地称为流(stream),即数据流。,即数据流。流表示了信息从源到目的端的流动。流表示了信息从源到目的端的流动。2021年11月20日1时06分输入操作时,数据从文件流向计算机内存输入操作时,数

6、据从文件流向计算机内存输出操作时,数据从计算机流向文件输出操作时,数据从计算机流向文件无论是用无论是用Word打开或保存文件,还是打开或保存文件,还是C程序中的输入输出都是通过操作系统进行程序中的输入输出都是通过操作系统进行的的“流流”是一个传输通道,数据可以从运行是一个传输通道,数据可以从运行环境流入程序中,或从程序流至运行环境环境流入程序中,或从程序流至运行环境2021年11月20日1时06分从从C程序的观点来看,无论程序一次读写程序的观点来看,无论程序一次读写一个字符,或一行文字,或一个指定的数一个字符,或一行文字,或一个指定的数据区,作为输入输出的各种文件或设备都据区,作为输入输出的各

7、种文件或设备都是统一以是统一以逻辑数据流逻辑数据流的方式出现的。语的方式出现的。语言把文件看作是一个字符言把文件看作是一个字符(或字节)(或字节)的序的序列。一个输入输出流就是一个字符流或字列。一个输入输出流就是一个字符流或字节节(内容为二进制数据内容为二进制数据)流。流。2021年11月20日1时06分的数据文件由一连串的字符(或字节)的数据文件由一连串的字符(或字节)组成,而不考虑行的界限,两行数据间不组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开(字节)为单位的。输入输出数据流的开始和结束仅

8、受程序控制而不受物理符号(始和结束仅受程序控制而不受物理符号(如回车换行符)控制,这就增加了处理的如回车换行符)控制,这就增加了处理的灵活性。这种文件称为灵活性。这种文件称为流式文件流式文件。2021年11月20日1时06分文件要有一个唯一的文件标识,以便用户文件要有一个唯一的文件标识,以便用户识别和引用。识别和引用。文件标识包括三部分:文件标识包括三部分:(1)文件路径文件路径(2)文件名主干文件名主干(3)文件后缀文件后缀2021年11月20日1时06分文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示f

9、ile1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面文件路径文件路径文件名主干文件名主干文件后缀文件后缀2021年11月20日1时06分文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面文件名文件名2021年11月20日1时06分文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示f

10、ile1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面命名规则遵循标命名规则遵循标识符的命名规则识符的命名规则2021年11月20日1时06分文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面一般不超过一般不超过3个字母个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)2021年11月20日1时06分根据数据的组织形式,数据文件可分为根

11、据数据的组织形式,数据文件可分为ASCII文件文件和和二进制文件二进制文件。u数据在内存中是以二进制形式存储的,如果不数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是加转换地输出到外存,就是二进制文件二进制文件u如果要求在外存上以如果要求在外存上以ASCII代码形式存储,代码形式存储,则需要在存储前进行转换则需要在存储前进行转换uASCII文件又称文本文件,每一个字节放一文件又称文本文件,每一个字节放一个字符的个字符的ASCII代码代码2021年11月20日1时06分字符一律以字符一律以ASCII形式存储形式存储数值型数据既可以用数值型数据既可以用ASCII形式存储,也形式存储

12、,也可以用二进制形式存储可以用二进制形式存储u如有整数如有整数10000,如果用,如果用ASCII码形式输出码形式输出到磁盘,则在磁盘中占个字节到磁盘,则在磁盘中占个字节(每一个字符每一个字符占一个字节占一个字节),而用二进制形式输出,则在磁,而用二进制形式输出,则在磁盘上只占盘上只占4个字节个字节(用用VC+ C时时)2021年11月20日1时06分0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式00000000000000000010011100010000二进制形式二进制形式(10000)2021年11月20

13、日1时06分下列关于下列关于C语言文件的叙述中正确的是语言文件的叙述中正确的是( )A 文件由一系列数据依次排列组成,只能构成文件由一系列数据依次排列组成,只能构成二进制文件二进制文件B 文件由结构序列组成,可以构成二进制文件文件由结构序列组成,可以构成二进制文件或文本文件或文本文件C 文件由数据序列组成,可以构成二进制文件文件由数据序列组成,可以构成二进制文件或文本文件或文本文件D 文件由字符序列组成,其类型只能是文件由字符序列组成,其类型只能是文本文文本文件件参考答案:参考答案:C【解析】本题考查文件的概念,文件是由数据序列组成,【解析】本题考查文件的概念,文件是由数据序列组成,可以构成二

14、进制文件或文本文件,所以答案为可以构成二进制文件或文本文件,所以答案为C选项。选项。2021年11月20日1时06分ANSI C标准采用标准采用“缓冲文件系统缓冲文件系统”处理处理数据文件数据文件所谓所谓缓冲文件系统缓冲文件系统是指系统自动地在内存是指系统自动地在内存区为程序中每一个正在使用的文件开辟一区为程序中每一个正在使用的文件开辟一个文件缓冲区个文件缓冲区2021年11月20日1时06分从内存向磁盘输出数据必须先送到内存中从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘的缓冲区,装满缓冲区后才一起送到磁盘去去如果从磁盘向计算机读入数据,则一次从如果从磁盘向计算机读

15、入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)数据送到程序数据区(给程序变量)2021年11月20日1时06分程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从内存向磁盘输出数据从内存向磁盘输出数据装满缓冲区装满缓冲区2021年11月20日1时06分程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从磁盘向计算机读入数据从磁盘向计算机读入数据充满缓冲区充满缓冲区2021年11月20

16、日1时06分缓冲文件系统中,关键的概念是缓冲文件系统中,关键的概念是“文件类文件类型指针型指针”,简称,简称“文件指针文件指针”u每个被使用的文件都在内存中开辟一个相应的每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)件的名字、文件状态及文件当前位置等)u这些信息是保存在一个结构体变量中的。该结这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为构体类型是由系统声明的,取名为FILE2021年11月20日1时06分声明声明FILE结构体类型的信息包含在头文件结构体类型的

17、信息包含在头文件“stdio.h”中中一般一般设置一个指向设置一个指向FILE类型变量的指针变类型变量的指针变量,然后通过它来引用这些量,然后通过它来引用这些FILE类型变量类型变量2021年11月20日1时06分FILE*fp1,*fp2,*fp3;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息区文件信息区fp32021年11月20日1时06分下面选项中关于下面选项中关于文件指针文件指针概念的叙述正确的是概念的叙述正确的是( )A 文件指针是程序中用文件指针是程序中用FILE定义的指针变量定义的指针变量B 文件指针就是文件位置指针

18、,表示当前读写文件指针就是文件位置指针,表示当前读写数据的位置数据的位置C 文件指针指向文件在计算机中的存储位置文件指针指向文件在计算机中的存储位置D 把文件指针传给把文件指针传给fscanf函数,就可以向文本函数,就可以向文本文件中写入任意的文件中写入任意的字符字符参考答案:参考答案:A【解析】在【解析】在C语言中用一个指针变量指向一个文件,这语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。文件指针不是文件位置指针,所文件进行各种操作。文件指针不是文件位置指针,所以以BC选项错误,选项错误,D选

19、项中不可以写入任意的字符。选项中不可以写入任意的字符。2021年11月20日1时06分以下选项中叙述正确的是以下选项中叙述正确的是( )A 文件指针是指针类型的变量文件指针是指针类型的变量B 文件指针可同时指向不同文件文件指针可同时指向不同文件C 文件指针的值是文件在计算机磁盘中的路径信息文件指针的值是文件在计算机磁盘中的路径信息D 调用调用fscanf函数可以向文本文件中写入任意字符函数可以向文本文件中写入任意字符参考答案:参考答案:A【解析】所谓文件指针,实际上是指向一个结构体类型的【解析】所谓文件指针,实际上是指向一个结构体类型的指针变量,这个结构体中包含有文件的一些信息,如缓冲指针变量

20、,这个结构体中包含有文件的一些信息,如缓冲区的地址,在缓冲区中当前存取的字符的位置,对文件是区的地址,在缓冲区中当前存取的字符的位置,对文件是读读还是还是写写,是否出错,是否已经遇到文件结束标志等信,是否出错,是否已经遇到文件结束标志等信息。文件指针本身是指针类型的变量,息。文件指针本身是指针类型的变量,A选项正确。一个指选项正确。一个指针在同一时间只能指向一个文件,针在同一时间只能指向一个文件,B选项错误。文件指针是选项错误。文件指针是指针变量,存储的是文件缓存区首地址,而不是文件在计指针变量,存储的是文件缓存区首地址,而不是文件在计算机磁盘中的路径信息,算机磁盘中的路径信息,C选项错误。选

21、项错误。fscanf函数从文本文函数从文本文件中按格式读入到程序中,而不是向文本文件中写入数据,件中按格式读入到程序中,而不是向文本文件中写入数据,D选项错误。选项错误。2021年11月20日1时06分对文件读写之前应该对文件读写之前应该“打开打开”该文件,在该文件,在使用结束之后应使用结束之后应“关闭关闭”该文件。该文件。所谓所谓“打开打开”是指为文件建立相应的信息是指为文件建立相应的信息区区(用来存放有关文件的信息用来存放有关文件的信息)和文件缓冲和文件缓冲区区(用来暂时存放输入输出的数据用来暂时存放输入输出的数据)。2021年11月20日1时06分在编写程序时,在打开文件的同时,一般在编

22、写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写就可以通过该指针变量对文件进行读写所谓所谓“关闭关闭”是指撤销文件信息区和文件是指撤销文件信息区和文件缓冲区缓冲区 2021年11月20日1时06分fopen函数的调用方式为:函数的调用方式为:fopen(文件名文件名,使用文件方式使用文件方式);例如:例如: fopen(“a1”,”r”); u表示要打开名为表示要打开名为“a1”的文件,使用文件方的文件,使用文件方式为式为“读入读入”

23、ufopen函数的返回值是指向函数的返回值是指向a1文件的指针文件的指针2021年11月20日1时06分通常将通常将fopen函数的返回值赋给一个指向函数的返回值赋给一个指向文件的指针变量。如:文件的指针变量。如:FILE *fp; fp=fopen(“a1”,”r”);ufp和文件和文件a1相联系,相联系,fp指向了指向了a1文件文件2021年11月20日1时06分在打开一个文件时,通知编译系统以下在打开一个文件时,通知编译系统以下3个信息:个信息:需要访问的文件的名字需要访问的文件的名字使用文件的方式(使用文件的方式(“读读”还是还是“写写”等)等)让哪一个指针变量指向被打开的文件让哪一个

24、指针变量指向被打开的文件使用文件方式使用文件方式参参见见教材教材表表10.1。2021年11月20日1时06分说明:说明:(1) 用用“r”方式打开的文件只能用于向计算方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。序才能从文件中读数据。u不能用不能用“r”方式打开一个并不存在的文件,方式打开一个并不存在的文件,否则出错。否则出错。2021年11月20日1时06分说明:说明:(2) 用用“w”方式打开的文件只能用于向该文方式打开的文件只能用于

25、向该文件写数据(即输出文件),而不能用来向计件写数据(即输出文件),而不能用来向计算机输入。算机输入。u如果原来不存在该文件,则在打开文件前新如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。建立一个以指定的名字命名的文件。u如果原来已存在一个以该文件名命名的文件如果原来已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重,则在打开文件前先将该文件删去,然后重新建立一个新文件。新建立一个新文件。2021年11月20日1时06分说明:说明:(3) 如果希望向文件末尾添加新的数据(不希如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用望删除原有数据)

26、,则应该用“a”方式打开方式打开u但此时应保证该文件已存在;否则将得到出但此时应保证该文件已存在;否则将得到出错信息。错信息。u打开文件时,文件读写标记移到文件末尾打开文件时,文件读写标记移到文件末尾2021年11月20日1时06分说明:说明:(4) 用用r+、w+、a+方式打开的文件既可以方式打开的文件既可以用来输入数据,也可以用来输出数据。用来输入数据,也可以用来输出数据。u用用r+方式时该文件应该已经存在。方式时该文件应该已经存在。u用用w+方式则新建立一个文件,先向此文件方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。写数据,然后可以读此文件中的数据。u用用a+方式打

27、开的文件,原来的文件不被删去方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾,可以添,文件读写位置标记移到文件末尾,可以添加,也可以读。加,也可以读。2021年11月20日1时06分说明:说明:(5) 如果打开如果打开失败失败,fopen函数将会带回一个函数将会带回一个出错信息。出错信息。fopen函数将带回一个空指针值函数将带回一个空指针值NULL常用下面的方法打开一个文件:常用下面的方法打开一个文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0);终止正在执行的程序终止正在执行的

28、程序2021年11月20日1时06分说明:说明:(6) C标准建议用表标准建议用表10.1列出的文件使用方式列出的文件使用方式打开文本文件或二进制文件,但目前使用的打开文本文件或二进制文件,但目前使用的有些有些C编译系统可能不完全提供所有这些功能编译系统可能不完全提供所有这些功能2021年11月20日1时06分说明:说明:(7) 计算机输从计算机输从ASCII文件读入字符时,遇到文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成为回车和换行两个在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换字符。在

29、用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。的数据形式完全一致,一一对应。2021年11月20日1时06分说明:说明:(8) 程序中可以使用程序中可以使用3个标准的流文件个标准的流文件:标准输标准输入流、标准输出流、标准出错输出流。入流、标准输出流、标准出错输出流。u系统已对这系统已对这3个文件指定了与终端的对应关系个文件指定了与终端的对应关系u标准输入流是从终端的输入标准输入流是从终端的输入u标准输出流是向终端的输出标准输出流是向终端的输出u标准出错输出流是当程序出错时将出错信息发标准出错输出流是当程

30、序出错时将出错信息发送到终端送到终端2021年11月20日1时06分程序开始运行时系统自动打开这程序开始运行时系统自动打开这3个标准个标准流文件。因此,程序编写者不需要在程流文件。因此,程序编写者不需要在程序中用序中用fopen函数打开它们。所以以前函数打开它们。所以以前我们用到的从终端输入或输出到终端都我们用到的从终端输入或输出到终端都不需要打开终端文件。不需要打开终端文件。2021年11月20日1时06分以下叙述中正确的是以下叙述中正确的是( )A 当对文件的读当对文件的读(写写)操作完成之后,必须将它关闭,操作完成之后,必须将它关闭,否则可能导致数据丢失否则可能导致数据丢失B 打开一个已

31、存在的文件并进行了写操作后,原打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖有文件中的全部数据必定被覆盖C 在一个程序中当对文件进行了写操作后,必须在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第先关闭该文件然后再打开,才能读到第1个数据个数据D C语言中的文件是流式文件,因此只能顺序存取语言中的文件是流式文件,因此只能顺序存取数据数据参考答案:参考答案:A【解析】【解析】B选项中打开一个已存在的文件并进行了写操作选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文后,原有文件中的全部数据不一定被覆盖,也可以

32、对源文件进行追加操作等。件进行追加操作等。C选项中在一个程序中当对文件进行选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第了写操作后,不用先关闭该文件然后再打开,才能读到第1个数据,可以用个数据,可以用fseek()函数进行重新定位即可。函数进行重新定位即可。D选项选项中,中,C语言中的文件可以进行随机读写。语言中的文件可以进行随机读写。2021年11月20日1时06分设文件指针设文件指针fp已定义,执行语句已定义,执行语句fp=fopen(file,w);后,后,以下针对文本文件以下针对文本文件file操作叙述的选项中正确的是操作叙述的选项中正确的是( )A

33、只能写不能只能写不能读读B 写操作结束后可以从头开始读写操作结束后可以从头开始读C 可以在原有内容后追加可以在原有内容后追加写写D 可以随意读和可以随意读和写写参考答案:参考答案:A【解析】考查文件操作函数【解析】考查文件操作函数fopen的基础知识,以的基础知识,以w方方式打开文件,只能写不能读。式打开文件,只能写不能读。2021年11月20日1时06分以下叙述正确的是以下叙述正确的是( )A 在在C语言中调用语言中调用fopen函数就可把程序中要读、写的文件与函数就可把程序中要读、写的文件与磁盘上实际的数据文件联系磁盘上实际的数据文件联系起来起来B fopen函数的调用形式为:函数的调用形

34、式为:fopen(文件名文件名)C fopen函数的返回值为函数的返回值为NULL时,则成功打开指定的时,则成功打开指定的文件文件D fopen函数的返回值必须赋给一个任意类型的指针函数的返回值必须赋给一个任意类型的指针变量变量参考答案:参考答案:A【解析】【解析】C语言中打开一个文件通过系统函数语言中打开一个文件通过系统函数fopen实现,其调用的一实现,其调用的一般形式为:般形式为:FILE* fopen(文件名文件名,操作方式操作方式);通过这个函数把程序;通过这个函数把程序中要读、写的文件与磁盘上实际的数据文件联系起来,中要读、写的文件与磁盘上实际的数据文件联系起来,A选项正确。选项正

35、确。B选项函数调用中缺少参数选项函数调用中缺少参数操作方法操作方法,错误。,错误。fopen函数返回一个指向函数返回一个指向指定文件的文件指针指定文件的文件指针,如果不能实现打开指定文件的操作,则返回一个如果不能实现打开指定文件的操作,则返回一个空指针空指针NULL,C选项错误。选项错误。fopen函数的返回值必须赋给一个文件类函数的返回值必须赋给一个文件类型的指针变量,型的指针变量,D选项错误。选项错误。2021年11月20日1时06分有以下程序段有以下程序段FILE *fp;if( (fp=fopen(test.txt,w) = NULL) printf(不能打开文件不能打开文件!); e

36、xit(0);else printf(成功打开文件成功打开文件!);若指定文件若指定文件test.txt不存在,且无其他异常,则以下不存在,且无其他异常,则以下叙述错误的是叙述错误的是( )A 输出输出不能打开文件不能打开文件!B 输出输出成功打开文件成功打开文件!C 系统将按指定文件名新建文件系统将按指定文件名新建文件D 系统将为写操作建立文本文件系统将为写操作建立文本文件参考答案:参考答案:A2021年11月20日1时06分有以下程序段有以下程序段FILE *fp;if( (fp=fopen(test.txt,w) = NULL) printf(不能打开文件不能打开文件!); exit(0

37、);else printf(成功打开文件成功打开文件!); 若文件若文件test.txt已存在,则以下叙述正确的是已存在,则以下叙述正确的是( )A 程序运行后,文件程序运行后,文件test.txt中的原有内容将全部消失中的原有内容将全部消失B 程序运行时,会因文件存在而出错程序运行时,会因文件存在而出错C 对文件对文件test.txt进行写操作后,可以随机进行读取进行写操作后,可以随机进行读取D 对文件对文件test.txt写入的内容总是被添加到文件写入的内容总是被添加到文件尾部尾部参考答案:参考答案:A2021年11月20日1时06分关闭文件用关闭文件用fclose函数。函数。fclose

38、函数调函数调用的一般形式为用的一般形式为fclose(文件指针文件指针); 例如:例如: fclose (fp); 如果不关闭文件将会如果不关闭文件将会丢失丢失数据。数据。2021年11月20日1时06分以下关于以下关于fclose(fp)函数的叙述正确的是函数的叙述正确的是( )A 当程序中对文件的所有写操作完成之后,必须调用当程序中对文件的所有写操作完成之后,必须调用fclose(fp)函数关闭文件函数关闭文件B 当程序中对文件的所有写操作完成之后,不一定要调用当程序中对文件的所有写操作完成之后,不一定要调用fclose(fp)函数关闭文件函数关闭文件C 只有对文件进行输入操作之后,才需要

39、调用只有对文件进行输入操作之后,才需要调用fclose(fp)函函数关闭文件数关闭文件D 只有对文件进行输出操作之后,才能调用只有对文件进行输出操作之后,才能调用fclose(fp)函数函数关闭文件关闭文件参考答案:参考答案:A【解析】对一个文件操作完成后,要将该文件关闭,【解析】对一个文件操作完成后,要将该文件关闭,关闭关闭就是使文就是使文件指针变量不再指向该文件。程序编写者应该在程序终止之前关闭所件指针变量不再指向该文件。程序编写者应该在程序终止之前关闭所有文件,如果不关闭,文件将会丢失数据。因为,在向文件写数据时,有文件,如果不关闭,文件将会丢失数据。因为,在向文件写数据时,是先将数据输

40、出到缓冲区,待缓冲区充满后才正式输出给文件。如果是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。所以对文件的所有写操输出到磁盘文件,然后才释放文件指针变量。所以对文件的所有写操作完成之后必须要关闭文件,作完成之后必须要关闭文件,A选项正确,选项正确,B选项错误。只要对文件选项错误。只要对文件进行操作后,都要

41、调用进行操作后,都要调用fclose文件关闭文件,文件关闭文件,C、D选项错误。选项错误。2021年11月20日1时06分在顺序写时,先写入的数据存放在文件中在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面前面,后写入的数据存放在文件中后面在顺序读时,先读文件中前面的数据,后在顺序读时,先读文件中前面的数据,后读文件中后面的数据读文件中后面的数据对顺序读写来说,对文件读写数据的顺序对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的和数据在文件中的物理顺序是一致的 顺序读写需要用库函数实现顺序读写需要用库函数实现2021年11月20日1时06分函数名函数名

42、调用形式调用形式功能功能返回值返回值fgetcfgetc(fp)从从fp指向的指向的文件读入一文件读入一个字符个字符读成功,带回所读读成功,带回所读的字符,失败则返的字符,失败则返回文件结束标志回文件结束标志(即即-1)fputcfputc(ch,fp)把字符把字符ch写写到文件指针到文件指针变量变量fp所指所指向的文件中向的文件中写成功,返回值就写成功,返回值就是输出的字符;输是输出的字符;输出失败,则返回出失败,则返回(即(即-1)读写一个字符的函数读写一个字符的函数2021年11月20日1时06分 例例16.1 从键盘输入一些字符,逐个把它从键盘输入一些字符,逐个把它们送到磁盘上去,直到

43、用户输入一个们送到磁盘上去,直到用户输入一个“”为止。为止。 解题思路:用解题思路:用fgetc函数从键盘逐个输入函数从键盘逐个输入字符,然后用字符,然后用fputc函数写到磁盘文件即函数写到磁盘文件即可。可。2021年11月20日1时06分#include #include int main() FILE *fp; char ch,filename10; printf(请输入所用的文件名:请输入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL) printf(无法打开此文件无法打开此文件n); exit(0); ch=g

44、etchar( );接收最后输接收最后输入的回车符入的回车符输入输入文件名文件名只写只写用用exit函数时加函数时加2021年11月20日1时06分 printf(“请输入一个字符串请输入一个字符串(以以#结束结束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0;2021年11月20日1时06分 例例16.2 将一个磁盘文件中的信息复制到另将一个磁盘文件中的信息复制到另一个磁盘文件中。一个磁盘文件中。 今要求将上例建立的今要求将上

45、例建立的file1.dat文件中的内容复制到另一个磁盘文件中的内容复制到另一个磁盘文件文件file2.dat中。中。解题思路:处理此问题的算法是:从解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,然后逐个文件中逐个读入字符,然后逐个输出到输出到file2.dat中。中。2021年11月20日1时06分#include #include int main( ) FILE *in,*out; char ch,infile10,outfile10; printf(输入读入文件的名字输入读入文件的名字:); scanf(%s,infile); printf(输入输出文件的名字输入

46、输出文件的名字:); scanf(“%s”,outfile); if(in=fopen(infile,“r”)=NULL) printf(无法打开此文件无法打开此文件n); exit(0); if(out=fopen(outfile,“w”)=NULL) printf(无法打开此文件无法打开此文件n); exit(0); 改为改为rb和和wb,则,则复复制一个二进制文件制一个二进制文件改为改为rb和和wb,则,则复复制一个二进制文件制一个二进制文件2021年11月20日1时07分 while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch);

47、 putchar(10); fclose(in); fclose(out); return 0;检查当前读写位置检查当前读写位置是否移到文件末尾是否移到文件末尾2021年11月20日1时07分在文本文件中,数据以在文本文件中,数据以ASCII码形式存放,码形式存放,ASCII码的数值范围在码的数值范围在0255之间,不会出之间,不会出现现-1,可用,可用EOF作为文本文件结束标志。作为文本文件结束标志。而在二进制文件中,可能会有而在二进制文件中,可能会有-1值的出现,不值的出现,不能用能用EOF作为二进制文件结束的标志。作为二进制文件结束的标志。所以,为了解决这一问题所以,为了解决这一问题C语

48、言用语言用feof函数来判函数来判断文件是否结束。如果遇到文件结束,函数断文件是否结束。如果遇到文件结束,函数feof(fp)的值为的值为1,否则为,否则为0。feof函数可以函数可以判断二进制文件和文本文件是否结束。判断二进制文件和文本文件是否结束。2021年11月20日1时07分设设fp为指向某二进制文件的指针,且已读到此文件末尾,则函数为指向某二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为的返回值为( )A 0B 0C 非非0值值D NULL参考答案:参考答案:C【解析】本题考查文件的定位,【解析】本题考查文件的定位,feof函数的用法是从输入流读取数据,如函数的

49、用法是从输入流读取数据,如果到达文件末尾(遇文件结束符),果到达文件末尾(遇文件结束符),eof函数值为非零值,否则为函数值为非零值,否则为0。若若fp已定义为指向某文件的指针,且没有读到该文件的末尾,则已定义为指向某文件的指针,且没有读到该文件的末尾,则C语言函语言函数数feof(fp)的函数返回值是的函数返回值是( )A EOFB 非非0C -1D 0参考答案:参考答案:D2021年11月20日1时07分下面关于下面关于EOF的叙述,正确的是的叙述,正确的是( )A EOF的值等于的值等于0B EOF是在库函数文件中定义的符号常量是在库函数文件中定义的符号常量C 文本文件和二进制文件都可以

50、用文本文件和二进制文件都可以用EOF作为文件结作为文件结束标志束标志D 对于文本文件,对于文本文件,fgetc函数读入最后一个字符时,函数读入最后一个字符时,返回值是返回值是EOF参考答案:参考答案:B【解析】在【解析】在C语言中,或更精确地说成语言中,或更精确地说成C标准函数库中表示标准函数库中表示文件结束符(文件结束符(end of file)。在)。在while循环中以循环中以EOF作为文作为文件结束标志,这种以件结束标志,这种以EOF作为文件结束标志的文件,必须作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的是文本文件。在文本文件中,数据都是以字符的ASCII代码

51、代码值的形式存放。我们知道,值的形式存放。我们知道,ASCII代码值的范围是代码值的范围是0255,不可能出现不可能出现-1,因此可以用,因此可以用EOF作为文件结束标志。作为文件结束标志。2021年11月20日1时07分以下叙述正确的是以下叙述正确的是( )A EOF只能作为文本文件的结束标志,其值为只能作为文本文件的结束标志,其值为-1B EOF可以作为所有文件的结束标志可以作为所有文件的结束标志C EOF只能作为二进制文件的结束标志只能作为二进制文件的结束标志D 任何文件都不能用任何文件都不能用EOF作为文件的结束作为文件的结束标志标志参考答案:参考答案:A【解析】文件结束或者错误,则返

52、回符【解析】文件结束或者错误,则返回符EOF是在头文件是在头文件stdio.h中定义的宏,一般值为中定义的宏,一般值为-1,在,在while循环中以循环中以EOF作作为文件结束标志,这种以为文件结束标志,这种以EOF作为文件结束标志的文件,作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放,由于不可能出现代码值的形式存放,由于不可能出现-1,因此可以用,因此可以用EOF作为文件结束标志。作为文件结束标志。A选项正确。选项正确。2021年11月20日1时07分一般调用方式为:一般调用方式为:fprintf

53、(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);fscanf (文件指针文件指针,格式字符串格式字符串,输入表列输入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);表示将整数表示将整数i和浮点和浮点数数f按照规定格式输出到按照规定格式输出到fp所指的文件中。所指的文件中。fscanf (fp,”%d,%f”,&i,&f);表示从表示从fp所指的文所指的文件中读入一个整数和一个浮点数放入变量件中读入一个整数和一个浮点数放入变量i和和f中。中。2021年11月20日1时07分读写一个字符串的函数读写一个字符串的函数函数名函数名调用形式调用形式功

54、能功能返回值返回值fgetsfgets(str,n,fp)从从fp指向的文件读指向的文件读入长度为入长度为(n-1)的字的字符串,存放到字符符串,存放到字符数组数组str中中读成功,返读成功,返回地址回地址str,失败则返回失败则返回NULL)fputsfputs(str,fp)str所指向的字符串所指向的字符串写到文件指针变量写到文件指针变量fp所指向的文件中所指向的文件中写成功,返写成功,返回回 0 ; 否 则; 否 则返回非返回非0值值2021年11月20日1时07分说明:说明:fgets函数的函数原型为:函数的函数原型为: char *fgets (char *str,int n,FI

55、LE *fp);u其作用是从文件读入一个字符串其作用是从文件读入一个字符串u调用时可以写成:调用时可以写成: fgets(str,n,fp);2021年11月20日1时07分说明:说明:ufgets(str,n,fp);中中n是要求得到的字符个数是要求得到的字符个数,但实际上只读,但实际上只读n-1个字符,然后在最后加一个个字符,然后在最后加一个0字符,这样得到的字符串共有字符,这样得到的字符串共有n个字符,把个字符,把它们放到字符数组它们放到字符数组str中中u如果在读完如果在读完n-1个字符之前遇到换行符个字符之前遇到换行符“n”或文件结束符或文件结束符EOF,读入即结束,但将所遇到,读入

56、即结束,但将所遇到的换行符的换行符“n”也作为一个字符读入也作为一个字符读入u执行执行fgets成功,返回成功,返回str数组首地址,如果一数组首地址,如果一开始就遇到文件尾或读数据错,返回开始就遇到文件尾或读数据错,返回NULL2021年11月20日1时07分说明:说明:fputs函数的函数原型为:函数的函数原型为: int fputs (char *str, FILE *fp);ustr指向的字符串输出到指向的字符串输出到fp所指向的文件中所指向的文件中u调用时可以写成:调用时可以写成: fputs(China”,fp);ufputs函数中第一个参数可以是字符串常量、函数中第一个参数可以是

57、字符串常量、字符数组名或字符型指针字符数组名或字符型指针u字符串末尾的字符串末尾的0不输出不输出u输出成功,函数值为;失败,函数值为输出成功,函数值为;失败,函数值为EOF2021年11月20日1时07分 例例16.3 从键盘读入若干个字符串,对它们从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。符串送到磁盘文件中保存。解题思路:为解决问题,可分为三个步骤:解题思路:为解决问题,可分为三个步骤:u从键盘读入从键盘读入n个字符串,存放在一个二维字符个字符串,存放在一个二维字符数组中,每一个一维数组存放一个字符串;数

58、组中,每一个一维数组存放一个字符串;u对字符数组中的对字符数组中的n个字符串按字个字符串按字母母顺序排序,顺序排序,排好序的字符串仍存放在字符数组中;排好序的字符串仍存放在字符数组中;u将字符数组中的字符串顺序输出。将字符数组中的字符串顺序输出。2021年11月20日1时07分#include #include #include int main() FILE *fp; char str310,temp10; int i,j,k,n=3; printf(“Enter strings:n”); for(i=0;in;i+) gets(stri);2021年11月20日1时07分 for(i=0;

59、in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) strcpy(temp,stri); strcpy(stri,strk); strcpy(strk,temp); 2021年11月20日1时07分 if(fp=fopen(“D:CCstring.dat”, “w”)=NULL) printf(cant open file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); fputs(“n”,fp); printf(“%sn”,stri); return 0;人为地输

60、出一个人为地输出一个n2021年11月20日1时07分思考:思考:u从文件从文件string.dat中读回字符串,并在中读回字符串,并在屏幕上显示屏幕上显示,应如何编写程序?,应如何编写程序?2021年11月20日1时07分#include #include int main() FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”, “r”)=NULL) printf(cant open file!n);exit(0); while(fgets(stri,10,fp)!=NULL) printf(%s,stri); i+; fclose (fp); return 0;不用不用

温馨提示

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

评论

0/150

提交评论