收藏 分销(赏)

对文件的输入输出PPT课件.ppt

上传人:可**** 文档编号:758583 上传时间:2024-03-06 格式:PPT 页数:97 大小:624KB
下载 相关 举报
对文件的输入输出PPT课件.ppt_第1页
第1页 / 共97页
对文件的输入输出PPT课件.ppt_第2页
第2页 / 共97页
点击查看更多>>
资源描述
第第10章章 对文件的文件的输入入输出出10.1 文件的有关基本知文件的有关基本知识10.2 打开与关打开与关闭文件文件10.3 顺序序读写数据文件写数据文件10.4 随机随机读写数据文件写数据文件10.5 文件文件读写的出写的出错检测1.10.1 文件的有关基本知文件的有关基本知识10.1.1 什么是文件什么是文件10.1.2 文件名文件名10.1.3 文件的分文件的分类10.1.4 文件文件缓冲区冲区10.1.5 文件文件类型指型指针2.10.1.1 什么是文件什么是文件文件有不同的文件有不同的类型,在程序型,在程序设计中,主要中,主要用到两种文件:用到两种文件:(1)程序文件程序文件。包括。包括源程序文件源程序文件(后后缀为.c)、目目标文件文件(后后缀为.obj)、可可执行文件行文件(后后缀为.exe)等。等。这种文件的内容是程序代种文件的内容是程序代码。3.10.1.1 什么是文件什么是文件文件有不同的文件有不同的类型,在程序型,在程序设计中,主要中,主要用到两种文件:用到两种文件:(2)数据文件数据文件。文件的内容不是程序,而是供。文件的内容不是程序,而是供程序运行程序运行时读写的数据,如在程序运行写的数据,如在程序运行过程中程中输出到磁出到磁盘(或其他外部或其他外部设备)的数据,或在程的数据,或在程序运行序运行过程中供程中供读入的数据。如一批学生的成入的数据。如一批学生的成绩数据,或数据,或货物交易的数据等。物交易的数据等。本章主要本章主要讨论的是的是数据文件数据文件4.10.1.1 什么是文件什么是文件在以前各章中所在以前各章中所处理的数据的理的数据的输入和入和输出出,从从终端的端的键盘输入数据,运行入数据,运行结果果输出到出到终端端显示器上示器上常常需要将一些数据常常需要将一些数据输出到磁出到磁盘上保存起上保存起来,以后来,以后使用使用这就要用到磁就要用到磁盘文件文件5.10.1.1 什么是文件什么是文件操作系操作系统把各种把各种设备都都统一作一作为文件文件处理理从操作系从操作系统的角度看,每一个与主机相的角度看,每一个与主机相联的的输入入输出出设备都看作是文件。例如,都看作是文件。例如,u终端端键盘是是输入文件入文件u显示屏和打印机是示屏和打印机是输出文件出文件6.10.1.1 什么是文件什么是文件“文件文件”指存指存储在外部介在外部介质上数据的集合上数据的集合u一批数据是以文件的形式存放在外部介一批数据是以文件的形式存放在外部介质上的上的u操作系操作系统是以文件是以文件为单位位对数据数据进行管理行管理u想找存放在外部介想找存放在外部介质上的数据,先按文件名找上的数据,先按文件名找到所指定的文件,然后再从到所指定的文件,然后再从该文件文件读数据数据u要向外部介要向外部介质上存上存储数据也必数据也必须先建立一个文先建立一个文件(以文件名作件(以文件名作为标志),才能向它志),才能向它输出数据出数据7.10.1.1 什么是文件什么是文件输入入输出是数据出是数据传送的送的过程,数据如流水程,数据如流水一一样从一从一处流向另一流向另一处,因此常将,因此常将输入入输出形象地称出形象地称为流流(stream),即数据流。,即数据流。流表示了信息从源到目的端的流流表示了信息从源到目的端的流动。8.10.1.1 什么是文件什么是文件输入操作入操作时,数据从文件流向,数据从文件流向计算机内存算机内存输出操作出操作时,数据从,数据从计算机流向文件算机流向文件无无论是用是用Word打开或保存文件,打开或保存文件,还是是C程程序中的序中的输入入输出都是通出都是通过操作系操作系统进行的行的“流流”是一个是一个传输通道,数据可以从运行通道,数据可以从运行环境流入程序中,或从程序流至运行境流入程序中,或从程序流至运行环境境9.10.1.1 什么是文件什么是文件从从C程序的程序的观点来看,无点来看,无论程序一次程序一次读写一写一个字符,或一行文字,或一个指定的数据个字符,或一行文字,或一个指定的数据区,作区,作为输入入输出的各种文件或出的各种文件或设备都是都是统一以一以逻辑数据流数据流的方式出的方式出现的。的。语言言把文件看作是一个字符把文件看作是一个字符(或字(或字节)的序列。的序列。一个一个输入入输出流就是一个字符流或字出流就是一个字符流或字节(内内容容为二二进制数据制数据)流。流。10.10.1.1 什么是文件什么是文件的数据文件由一的数据文件由一连串的字符(或字串的字符(或字节)组成,而不考成,而不考虑行的界限,两行数据行的界限,两行数据间不不会自会自动加分隔符,加分隔符,对文件的存取是以字符文件的存取是以字符(字(字节)为单位的。位的。输入入输出数据流的开出数据流的开始和始和结束束仅受程序控制而不受物理符号受程序控制而不受物理符号(如回(如回车换行符)控制,行符)控制,这就增加了就增加了处理理的灵活性。的灵活性。这种文件称种文件称为流式文件流式文件。11.10.1.2 文件名文件名文件要有一个唯一的文件文件要有一个唯一的文件标识,以便用,以便用户识别和引用。和引用。文件文件标识包括三部分:包括三部分:(1)文件路径文件路径(2)文件名主干文件名主干(3)文件后文件后缀12.10.1.2 文件名文件名文件路径表示文件在外部存文件路径表示文件在外部存储设备中的位中的位置。如:置。如:D:CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的中的CC目目录下下的的temp子目子目录下面下面文件路径文件路径文件名主干文件名主干文件后文件后缀13.10.1.2 文件名文件名文件路径表示文件在外部存文件路径表示文件在外部存储设备中的位中的位置。如:置。如:D:CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的中的CC目目录下下的的temp子目子目录下面下面文件名文件名14.10.1.2 文件名文件名文件路径表示文件在外部存文件路径表示文件在外部存储设备中的位中的位置。如:置。如:D:CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的中的CC目目录下下的的temp子目子目录下面下面命名命名规则遵循遵循标识符的命名符的命名规则15.10.1.2 文件名文件名文件路径表示文件在外部存文件路径表示文件在外部存储设备中的位中的位置。如:置。如:D:CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的中的CC目目录下下的的temp子目子目录下面下面一般不超一般不超过3个字母个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)16.10.1.3 文件的分文件的分类根据数据的根据数据的组织形式,数据文件可分形式,数据文件可分为ASCII文件文件和和二二进制文件制文件。u数据在内存中是以二数据在内存中是以二进制形式存制形式存储的,如果不的,如果不加加转换地地输出到外存,就是出到外存,就是二二进制文件制文件u如果要求在外存上以如果要求在外存上以ASCII代代码形式存形式存储,则需要在存需要在存储前前进行行转换uASCII文件又称文本文件,每一个字文件又称文本文件,每一个字节放一放一个字符的个字符的ASCII代代码17.10.1.3 文件的分文件的分类字符一律以字符一律以ASCII形式存形式存储数数值型数据既可以用型数据既可以用ASCII形式存形式存储,也,也可以用二可以用二进制形式存制形式存储u如有整数如有整数10000,如果用,如果用ASCII码形式形式输出出到磁到磁盘,则在磁在磁盘中占个字中占个字节(每一个字符每一个字符占一个字占一个字节),而用二,而用二进制形式制形式输出,出,则在磁在磁盘上只占上只占4个字个字节(用用VC+C时)18.10.1.3 文件的分文件的分类0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式00000000000000000010011100010000二二进制形式制形式(10000)19.10.1.4 文件文件缓冲区冲区ANSI C标准采用准采用“缓冲文件系冲文件系统”处理理数据文件数据文件所所谓缓冲文件系冲文件系统是指系是指系统自自动地在内存地在内存区区为程序中每一个正在使用的文件开辟一程序中每一个正在使用的文件开辟一个文件个文件缓冲区冲区20.10.1.4 文件文件缓冲区冲区从内存向磁从内存向磁盘输出数据必出数据必须先送到内存中先送到内存中的的缓冲区,装冲区,装满缓冲区后才一起送到磁冲区后才一起送到磁盘去去如果从磁如果从磁盘向向计算机算机读入数据,入数据,则一次从一次从磁磁盘文件将一批数据文件将一批数据输入到内存入到内存缓冲区冲区(充(充满缓冲区),然后再从冲区),然后再从缓冲区逐个地冲区逐个地将数据送到程序数据区(将数据送到程序数据区(给程序程序变量)量)21.10.1.4 文件文件缓冲区冲区程序数据区程序数据区输出文件出文件缓冲区冲区输入文件入文件缓冲区冲区磁磁盘从内存向磁从内存向磁盘输出数据出数据装装满缓冲区冲区22.10.1.4 文件文件缓冲区冲区程序数据区程序数据区输出文件出文件缓冲区冲区输入文件入文件缓冲区冲区磁磁盘从磁从磁盘向向计算机算机读入数据入数据充充满缓冲区冲区23.10.1.5 文件文件类型指型指针缓冲文件系冲文件系统中,关中,关键的概念是的概念是“文件文件类型指型指针”,简称称“文件指文件指针”u每个被使用的文件都在内存中开辟一个相每个被使用的文件都在内存中开辟一个相应的的文件信息区,用来存放文件的有关信息(如文文件信息区,用来存放文件的有关信息(如文件的名字、文件状件的名字、文件状态及文件当前位置等)及文件当前位置等)u这些信息是保存在一个些信息是保存在一个结构体构体变量中的。量中的。该结构体构体类型是由系型是由系统声明的,取名声明的,取名为FILE24.10.1.5 文件文件类型指型指针声明声明FILE结构体构体类型的信息包含在型的信息包含在头文件文件“stdio.h”中中一般一般设置一个指向置一个指向FILE类型型变量的指量的指针变量,然后通量,然后通过它来引用它来引用这些些FILE类型型变量量25.10.1.5 文件文件类型指型指针FILE*fp1,*fp2,*fp3;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息区文件信息区fp326.10.2 打开与关打开与关闭文件文件10.2.1 用用fopen函数打开数据文件函数打开数据文件10.2.2 用用fclose函数关函数关闭数据文件数据文件27.10.2.1 用用fopen函数打开数据文件函数打开数据文件对文件文件读写之前写之前应该“打开打开”该文件,在文件,在使用使用结束之后束之后应“关关闭”该文件。文件。所所谓“打开打开”是指是指为文件建立相文件建立相应的信息的信息区区(用来存放有关文件的信息用来存放有关文件的信息)和文件和文件缓冲冲区区(用来用来暂时存放存放输入入输出的数据出的数据)。28.10.2.1 用用fopen函数打开数据文件函数打开数据文件在在编写程序写程序时,在打开文件的同,在打开文件的同时,一般,一般都指定一个指都指定一个指针变量指向量指向该文件,也就是文件,也就是建立起指建立起指针变量与文件之量与文件之间的的联系,系,这样就可以通就可以通过该指指针变量量对文件文件进行行读写写所所谓“关关闭”是指撤是指撤销文件信息区和文件文件信息区和文件缓冲区冲区 29.10.2.1 用用fopen函数打开数据文件函数打开数据文件fopen函数的函数的调用方式用方式为:fopen(文件名文件名,使用文件方式使用文件方式);例如:例如:fopen(“a1”,”r”);u表示要打开名表示要打开名为“a1”的文件,使用文件方的文件,使用文件方式式为“读入入”ufopen函数的返回函数的返回值是指向是指向a1文件的指文件的指针30.10.2.1 用用fopen函数打开数据文件函数打开数据文件通常将通常将fopen函数的返回函数的返回值赋给一个指向一个指向文件的指文件的指针变量。如:量。如:FILE*fp;fp=fopen(“a1”,”r”);ufp和文件和文件a1相相联系,系,fp指向了指向了a1文件文件31.10.2.1 用用fopen函数打开数据文件函数打开数据文件在打开一个文件在打开一个文件时,通知,通知编译系系统以下以下3个信息:个信息:需要需要访问的文件的名字的文件的名字使用文件的方式(使用文件的方式(“读”还是是“写写”等)等)让哪一个指哪一个指针变量指向被打开的文件量指向被打开的文件使用文件方式使用文件方式参参见教材教材表表10.1。32.说明:明:(1)用用“r”方式打开的文件只能用于向方式打开的文件只能用于向计算机算机输入而不能用作向入而不能用作向该文件文件输出数据,而且出数据,而且该文件文件应该已已经存在,并存有数据,存在,并存有数据,这样程序程序才能从文件中才能从文件中读数据。数据。u不能用不能用“r”方式打开一个并不存在的文件,方式打开一个并不存在的文件,否否则出出错。33.说明:明:(2)用用“w”方式打开的文件只能用于向方式打开的文件只能用于向该文件文件写数据(即写数据(即输出文件),而不能用来向出文件),而不能用来向计算算机机输入。入。u如果原来不存在如果原来不存在该文件,文件,则在打开文件前新在打开文件前新建立一个以指定的名字命名的文件。建立一个以指定的名字命名的文件。u如果原来已存在一个以如果原来已存在一个以该文件名命名的文件,文件名命名的文件,则在打开文件前先将在打开文件前先将该文件文件删去,然后重新去,然后重新建立一个新文件。建立一个新文件。34.说明:明:(3)如果希望向文件末尾添加新的数据(不希如果希望向文件末尾添加新的数据(不希望望删除原有数据),除原有数据),则应该用用“a”方式打开方式打开u但此但此时应保保证该文件已存在;否文件已存在;否则将得到出将得到出错信息。信息。u打开文件打开文件时,文件,文件读写写标记移到文件末尾移到文件末尾35.说明:明:(4)用用r+、w+、a+方式打开的文件既可以方式打开的文件既可以用来用来输入数据,也可以用来入数据,也可以用来输出数据。出数据。u用用r+方式方式时该文件文件应该已已经存在。存在。u用用w+方式方式则新建立一个文件,先向此文件新建立一个文件,先向此文件写数据,然后可以写数据,然后可以读此文件中的数据。此文件中的数据。u用用a+方式打开的文件,原来的文件不被方式打开的文件,原来的文件不被删去,去,文件文件读写位置写位置标记移到文件末尾,可以添加,移到文件末尾,可以添加,也可以也可以读。36.说明:明:(5)如果打开如果打开失失败,fopen函数将会函数将会带回一个回一个出出错信息。信息。fopen函数将函数将带回一个空指回一个空指针值NULL常用下面的方法打开一个文件:常用下面的方法打开一个文件:if(fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”);exit(0);终止正在止正在执行的程序行的程序37.说明:明:(6)C标准建准建议用表用表10.1列出的文件使用方式列出的文件使用方式打开文本文件或二打开文本文件或二进制文件,但目前使用的制文件,但目前使用的有些有些C编译系系统可能不完全提供所有可能不完全提供所有这些功能些功能38.说明:明:(7)计算机算机输从从ASCII文件文件读入字符入字符时,遇到,遇到回回车换行符,系行符,系统把它把它转换为一个一个换行符,行符,在在输出出时把把换行符行符转换成成为回回车和和换行两个行两个字符。在用二字符。在用二进制文件制文件时,不,不进行行这种种转换,在内存中的数据形式与在内存中的数据形式与输出到外部文件中的出到外部文件中的数据形式完全一致,一一数据形式完全一致,一一对应。39.说明:明:(8)程序中可以使用程序中可以使用3个个标准的流文件准的流文件:标准准输入流、入流、标准准输出流、出流、标准出准出错输出流。出流。u系系统已已对这3个文件指定了与个文件指定了与终端的端的对应关系关系u标准准输入流是从入流是从终端的端的输入入u标准准输出流是向出流是向终端的端的输出出u标准出准出错输出流是当程序出出流是当程序出错时将出将出错信息信息发送到送到终端端40.程序开始运行程序开始运行时时系系统统自自动动打开打开这这3个个标标准准流文件。因此,程序流文件。因此,程序编编写者不需要在程序写者不需要在程序中用中用fopen函数打开它函数打开它们们。所以以前我。所以以前我们们用到的从用到的从终终端端输输入或入或输输出到出到终终端都不需端都不需要打开要打开终终端文件。端文件。41.10.2.2 用用fclose函数关函数关闭数据文件数据文件关关闭文件用文件用fclose函数。函数。fclose函数函数调用的一般形式用的一般形式为fclose(文件指文件指针);例如:例如:fclose (fp);如果不关如果不关闭文件将会文件将会丢失失数据。数据。42.10.3 顺序序读写数据文件写数据文件在在顺顺序写序写时时,先写入的数据存放在文件中,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面前面,后写入的数据存放在文件中后面在在顺顺序序读时读时,先,先读读文件中前面的数据,后文件中前面的数据,后读读文件中后面的数据文件中后面的数据对顺对顺序序读读写来写来说说,对对文件文件读读写数据的写数据的顺顺序序和数据在文件中的物理和数据在文件中的物理顺顺序是一致的序是一致的 顺顺序序读读写需要用写需要用库库函数函数实现实现43.10.3 顺序序读写数据文件写数据文件10.3.1 怎怎样向文件向文件读写字符写字符10.3.2 怎怎样向文件向文件读写一个字符串写一个字符串10.3.3 用格式化的方式用格式化的方式读写文写文件件10.3.4 用二用二进制方式向文件制方式向文件读写一写一组数据数据44.10.3.1 怎怎样向文件向文件读写字符写字符函数名函数名调用形式用形式功能功能返回返回值fgetcfgetc(fp)从从fp指向的指向的文件文件读入一入一个字符个字符读成功,成功,带回所回所读的字符,失的字符,失败则返返回文件回文件结束束标志志(即即-1)fputcfputc(ch,fp)把字符把字符ch写写到文件指到文件指针变量量fp所指所指向的文件中向的文件中写成功,返回写成功,返回值就就是是输出的字符;出的字符;输出失出失败,则返回返回(即(即-1)读读写一个字符的函数写一个字符的函数45.例例10.1 从从键盘输入一些字符,逐个把它入一些字符,逐个把它们送到磁送到磁盘上去,直到用上去,直到用户输入一个入一个“”为止。止。解解题思路:用思路:用fgetc函数从函数从键盘逐个逐个输入入字符,然后用字符,然后用fputc函数写到磁函数写到磁盘文件即文件即可。可。46.#include#include int main()FILE*fp;char ch,filename10;printf(请输入所用的文件名:入所用的文件名:);scanf(%s,filename);if(fp=fopen(filename,“w”)=NULL)printf(无法打开此文件无法打开此文件n);exit(0);ch=getchar();接收最后接收最后输入的回入的回车符符输入入文件名文件名只写只写用用exit函数函数时加加47.printf(“请输入一个字符串入一个字符串(以以#结束束):);ch=getchar();while(ch!=#)fputc(ch,fp);putchar(ch);ch=getchar();fclose(fp);putchar(10);return 0;48.例例10.2 将一个磁将一个磁盘文件中的信息复制到另文件中的信息复制到另一个磁一个磁盘文件中。文件中。今要求将上例建立的今要求将上例建立的file1.dat文件中的内容复制到另一个磁文件中的内容复制到另一个磁盘文件文件file2.dat中。中。解解题思路:思路:处理此理此问题的算法是:从的算法是:从file1.dat文件中逐个文件中逐个读入字符,然后逐个入字符,然后逐个输出到出到file2.dat中。中。49.#include#include int main()FILE*in,*out;char ch,infile10,outfile10;printf(输入入读入文件的名字入文件的名字:);scanf(%s,infile);printf(输入入输出文件的名字出文件的名字:);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,则复复制一个二制一个二进制文件制文件50.while(!feof(in)ch=fgetc(in);fputc(ch,out);putchar(ch);putchar(10);fclose(in);fclose(out);return 0;检查当前当前读写位置写位置是否移到文件末尾是否移到文件末尾51.10.3.2 怎怎样向文件向文件读写一个字符串写一个字符串读读写一个字符串的函数写一个字符串的函数函数名函数名调用形式用形式功能功能返回返回值fgetsfgets(str,n,fp)从从fp指指向向的的文文件件读入入长度度为(n-1)的的字字符符串串,存存放放到到字字符符数数组str中中读成成功功,返返回回地地址址str,失失败则返返回回NULL)fputsfputs(str,fp)str所所指指向向的的字字符符串串写写到到文文件件指指针变量量fp所指向的文件中所指向的文件中写写成成功功,返返回回 0;否否 则返回非返回非0值52.说明:明:fgets函数的函数原型函数的函数原型为:char*fgets(char*str,int n,FILE*fp);u其作用是从文件其作用是从文件读入一个字符串入一个字符串u调用用时可以写成:可以写成:fgets(str,n,fp);53.说明:明:ufgets(str,n,fp);中中n是要求得到的字符个数,是要求得到的字符个数,但但实际上只上只读n-1个字符,然后在最后加一个个字符,然后在最后加一个0字符,字符,这样得到的字符串共有得到的字符串共有n个字符,把个字符,把它它们放到字符数放到字符数组str中中u如果在如果在读完完n-1个字符之前遇到个字符之前遇到换行符行符“n”或或文件文件结束符束符EOF,读入即入即结束,但将所遇到的束,但将所遇到的换行符行符“n”也作也作为一个字符一个字符读入入u执行行fgets成功,返回成功,返回str数数组首地址,如果一首地址,如果一开始就遇到文件尾或开始就遇到文件尾或读数据数据错,返回,返回NULL54.说明:明:fputs函数的函数原型函数的函数原型为:int fputs(char*str,FILE*fp);ustr指向的字符串指向的字符串输出到出到fp所指向的文件中所指向的文件中u调用用时可以写成:可以写成:fputs(China”,fp);ufputs函数中第一个参数可以是字符串常量、函数中第一个参数可以是字符串常量、字符数字符数组名或字符型指名或字符型指针u字符串末尾的字符串末尾的0不不输出出u输出成功,函数出成功,函数值为;失;失败,函数,函数值为EOF55.例例10.3 从从键盘读入若干个字符串,入若干个字符串,对它它们按字母大小的按字母大小的顺序排序,然后把排好序的字序排序,然后把排好序的字符串送到磁符串送到磁盘文件中保存。文件中保存。解解题思路:思路:为解决解决问题,可分,可分为三个步三个步骤:u从从键盘读入入n个字符串,存放在一个二个字符串,存放在一个二维字符数字符数组中,每一个一中,每一个一维数数组存放一个字符串;存放一个字符串;u对字符数字符数组中的中的n个字符串按字个字符串按字母母顺序排序,排序排序,排好序的字符串仍存放在字符数好序的字符串仍存放在字符数组中;中;u将字符数将字符数组中的字符串中的字符串顺序序输出。出。56.#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);57.for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)strcpy(temp,stri);strcpy(stri,strk);strcpy(strk,temp);58.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;人人为地地输出一个出一个n59.思考:思考:u从文件从文件string.dat中中读回字符串,并在回字符串,并在屏幕上屏幕上显示示,应如何如何编写程序?写程序?60.#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;不用不用人人为地地输出出n61.10.3.3用格式化的方式用格式化的方式读写文件写文件一般一般调用方式用方式为:fprintf(文件指文件指针,格式字符串格式字符串,输出表列出表列);fscanf(文件指文件指针,格式字符串格式字符串,输入表列入表列);如:如:fprintf(fp,”%d,%6.2f”,i,f);fscanf(fp,”%d,%f”,&i,&f);62.10.3.4 用二用二进制方式向文件制方式向文件读写一写一组数据数据一般一般调用形式用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);63.10.3.4 用二用二进制方式向文件制方式向文件读写一写一组数据数据buffer:是一个地址:是一个地址u对fread来来说,它是用来存放从文件,它是用来存放从文件读入的入的数据的存数据的存储区的地址区的地址u对fwrite来来说,是要把此地址开始的存,是要把此地址开始的存储区区中的数据向文件中的数据向文件输出出size:要:要读写的字写的字节数数count:要:要读写多少个数据写多少个数据项fp:FILE类型指型指针64.例例10.4 从从键盘输入入10个学生的有关数据,个学生的有关数据,然后把它然后把它们转存到磁存到磁盘文件上去。文件上去。解解题思路:思路:u定定义有有10个元素的个元素的结构体数构体数组,用来存放,用来存放10个学生的数据个学生的数据u从从main函数函数输入入10个学生的数据个学生的数据u用用save函数函数实现向磁向磁盘输出学生数据出学生数据u用用fwrite函数一次函数一次输出一个学生的数据出一个学生的数据65.#include#define SIZE 10struct Student_type char name10;int num;int age;char addr15;studSIZE;66.void save()FILE*fp;int i;if(fp=fopen(stu.dat,wb)=NULL)printf(cannot open filen);return;for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct Student_type),1,fp)!=1)printf(file write errorn);fclose(fp);10+4+4+15=33,实际上上开辟开辟36字字节,是,是4的倍数的倍数当前路径下的文件当前路径下的文件67.int main()int i;printf(“enter data of students:n);for(i=0;iSIZE;i+)scanf(%s%d%d%s,studi.name,&studi.num,&studi.age,studi.addr);save();return 0;68.为为了了验证验证在磁在磁盘盘文件文件“stu.dat”中是否中是否已存在此数据,可以用以下程序从已存在此数据,可以用以下程序从“stu.dat”文件中文件中读读入数据,然后在屏入数据,然后在屏幕上幕上输输出。出。69.#include#include#define SIZE 10struct Student_type char name10;int num;int age;char addr15;studSIZE;70.int main()int i;FILE*fp;if(fp=fopen(stu.dat,rb)=NULL)printf(cannot open filen);exit(0);for(i=0;iSIZE;i+)fread(&studi,sizeof(struct Student_type),1,fp);printf(“%-10s%4d%4d%-15sn”,studi.name,studi.num,studi.age,studi.addr);fclose(fp);return 0;71.如果修改如果修改例例10.4:从:从已有的二已有的二进制制文件文件“stu.list”中,中,读入数据并入数据并输出到出到“stu.dat”文件中文件中,应如何修改程序?如何修改程序?解解题思路:思路:u编写写load函数函数umain函数中再函数中再调用用load函数函数72.void load()FILE*fp;int i;if(fp=fopen(stu_list,rb)=NULL)printf(cannot open infilen);return;for(i=0;iSIZE;i+)if(fread(&studi,sizeof(struct student_type),1,fp)!=1)if(feof(fp)fclose(fp);return;printf(file read errorn);fclose(fp);73.int main()load();save();return 0;74.10.4 随机随机读写数据文件写数据文件对对文件文件进进行行顺顺序序读读写比写比较较容易理解,也容容易理解,也容易操作,但有易操作,但有时时效率不高效率不高随机随机访问访问不是按数据在文件中的物理位置不是按数据在文件中的物理位置次序次序进进行行读读写,而是可以写,而是可以对对任何位置上的任何位置上的数据数据进进行行访问访问,显显然然这这种方法比种方法比顺顺序序访问访问效率高得多效率高得多75.10.4 随机随机读写数据文件写数据文件10.4.1 文件位置文件位置标记及其定位及其定位10.4.2 随机随机读写写76.10.4.1 文件位置文件位置标记及其定位及其定位1.文件位置文件位置标记为了了对读写写进行控制,系行控制,系统为每个文每个文件件设置了一个文件置了一个文件读写位置写位置标记(简称文件称文件标记),用来指示,用来指示“接下来要接下来要读写的下一个字符的位置写的下一个字符的位置”77.10.4.1 文件位置文件位置标记及其定位及其定位文件指文件指针读写当前位置写当前位置文件尾文件尾1.文件位置文件位置标记文件文件头78.10.4.1 文件位置文件位置标记及其定位及其定位1.文件位置文件位置标记一般情况下,在一般情况下,在对字符文件字符文件进行行顺序序读写写时,文件,文件标记指向文件开指向文件开头,进行行读的操作的操作时,就,就读第一个字符,然后文件第一个字符,然后文件标记向后移一个位置,在下一次向后移一个位置,在下一次读操作操作时,就将位置,就将位置标记指向的第二个字符指向的第二个字符读入。依此入。依此类推,直到遇文件尾,推,直到遇文件尾,结束束79.10.4.1 文件位置文件位置标记及其定位及其定位1.文件位置文件位置标记如果是如果是顺序写文件,序写文件,则每写完一个数据每写完一个数据后,文件后,文件标记顺序向后移一个位置,然序向后移一个位置,然后在下一次后在下一次执行写操作行写操作时把数据写入指把数据写入指针所指的位置。直到把全部数据写完,所指的位置。直到把全部数据写完,此此时文件位置文件位置标记在最后一个数据之后在最后一个数据之后80.10.4.1 文件位置文件位置标记及其定位及其定位1.文件位置文件位置标记可以根据可以根据读写的需要,人写的需要,人为地移地移动了文了文件件标记的位置。文件的位置。文件标记可以向前移、可以向前移、向后移,移到文件向后移,移到文件头或文件尾,然后或文件尾,然后对该位置位置进行行读写写随机随机读写写随机随机读写写可以在任何位置写入数据,在可以在任何位置写入数据,在任何位置任何位置读取数据取数据81.10.4.1 文件位置文件位置标记及其定位及其定位2.文件位置文件位置标记的定位的定位u可以可以强制使文件位置制使文件位置标记指向指定的位置指向指定的位置u可以用以下函数可以用以下函数实现:(1)用用rewind函数使文件函数使文件标记指向文件开指向文件开头 rewind函数的作用是使文件函数的作用是使文件标记重新返回文重新返回文件的开件的开头,此函数没有返回,此函数没有返回值。82.例例10.5 有一个磁有一个磁盘文件,内有一些信息。文件,内有一些信息。要求第一次将它的内容要求第一次将它的内容显示在屏幕上,第示在屏幕上,第二次把它复制到另一文件上二次把它复制到另一文件上。83.解解题思路:思路:u因因为在第一次在第一次读入完文件内容后,文件入完文件内容后,文件标记已指到文件的末尾,如果再接着已指到文件的末尾,如果再接着读数据,数据,就遇到文件就遇到文件结束束标志,志,feof函数的函数的值等于等于1(真真),无法再,无法再读数据数据u必必须在程序中用在程序中用rewind函数使位置指函数使位置指针返回文件的开返回文件的开头84.#includeint main()FILE*fp1,*fp2;fp1=fopen(“file1.dat”,“r”);fp2=fopen(“file2.dat”,“w”);while(!feof(fp1)putchar(getc(fp1);putchar(10);rewind(fp1);while(!feof(fp1)putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);return 0;85.10.4.1 文件位置文件位置标记及其定位及其定位2.文件位置文件位置标记的定位的定位u可以可以强制使文件制使文件标记指向指定的位置指向指定的位置u可以用以下函数可以用以下函数实现:(2)用用fseek函数改函数改变文件文件标记fseek函数的函数的调用形式用形式为:fseek(文件文件类型指型指针,位移量位移量,起始点起始点)u起始点起始点0代表代表“文件开始位置文件开始位置”,1为“当前当前位置位置”,2为“文件末尾位置文件末尾位置”86.标标准指定的名字准指定的名字起始点起始点名名 字字用数字代表用数字代表文件开始位置文件开始位置SEEK_SET0文件当前位置文件当前位置SEE
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服