c语言张亦辰第10章 对文件的输入输出_第1页
c语言张亦辰第10章 对文件的输入输出_第2页
c语言张亦辰第10章 对文件的输入输出_第3页
c语言张亦辰第10章 对文件的输入输出_第4页
c语言张亦辰第10章 对文件的输入输出_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

1、16周课内上机时间调整周课内上机时间调整班级班级时间时间地点地点广电广电1-2班班周二周二1、2节节致远楼致远楼403机房机房电气电气1-3班班周二周二3、4节节致远楼致远楼403机房机房地信地信1-2、自动化、自动化1-2班班周二周二5、6节节致远楼致远楼403机房机房电气电气4班、电信班、电信1-2班班周二周二7、8节节致远楼致远楼303机房机房10.1 文件的有关基本知识文件的有关基本知识10.2 打开与关闭文件打开与关闭文件10.3 顺序读写数据文件顺序读写数据文件10.4 随机读写数据文件随机读写数据文件10.5 文件读写的出错检测文件读写的出错检测10.1.1 什么是文件什么是文件

2、10.1.2 文件名文件名10.1.3 文件的分类文件的分类10.1.4 文件缓冲区文件缓冲区10.1.5 文件类型指针文件类型指针文件有不同的类型,在程序设计中,主要用文件有不同的类型,在程序设计中,主要用到两种文件:到两种文件:(1) 程序文件程序文件。包括。包括源程序文件源程序文件(后缀为后缀为.c)、目标目标文件文件(后缀为后缀为.obj)、可执行文件可执行文件(后缀为后缀为.exe)等。等。这种文件的内容是程序代码。这种文件的内容是程序代码。文件有不同的类型,在程序设计中,主要用文件有不同的类型,在程序设计中,主要用到两种文件:到两种文件:(2) 数据文件数据文件。文件的内容不是程序

3、,而是供程。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输序运行时读写的数据,如在程序运行过程中输出到磁盘出到磁盘(或其他外部设备或其他外部设备)的数据,或在程序的数据,或在程序运行过程中供读入的数据。如一批学生的成绩运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。数据,或货物交易的数据等。本章主要讨论的是本章主要讨论的是数据文件数据文件在以前各章中所处理的数据的输入和输出,在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出到从终端的键盘输入数据,运行结果输出到终端显示器上终端显示器上常常需要将一些数据输出到磁盘上保存起来,常常需要

4、将一些数据输出到磁盘上保存起来,以后使用以后使用这就要用到磁盘文件这就要用到磁盘文件操作系统把各种设备都统一作为文件处理操作系统把各种设备都统一作为文件处理从从操作系统的角度操作系统的角度看,看,每一个与主机相联的每一个与主机相联的输入输出设备都看作是文件输入输出设备都看作是文件。例如,。例如,终端键盘是输入文件终端键盘是输入文件显示屏和打印机是输出文件显示屏和打印机是输出文件“文件文件”指指存储在外部介质上数据的集合存储在外部介质上数据的集合一批数据是以文件的形式存放在外部介质上的一批数据是以文件的形式存放在外部介质上的操作系统是以文件为单位对数据进行管理操作系统是以文件为单位对数据进行管理

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

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

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

8、制而不受物理符号而不受物理符号(如回车换行符)控制,这就增加了处理(如回车换行符)控制,这就增加了处理的灵活性。这种文件称为的灵活性。这种文件称为流式文件流式文件。文件要有一个唯一的文件标识,以便用户识文件要有一个唯一的文件标识,以便用户识别和引用。别和引用。文件标识包括三部分文件标识包括三部分:(1)文件路径文件路径(2)文件名主干文件名主干(3)文件后缀文件后缀文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。如:如: d: cctempfile1.dat表示表示file1.dat文件存放在文件存放在d盘中的盘中的cc目录下的目录下的temp子目录下面子目录下

9、面文件路径文件路径文件名主干文件名主干文件后缀文件后缀文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。如:如: d: cctempfile1.dat表示表示file1.dat文件存放在文件存放在d盘中的盘中的cc目录下的目录下的temp子目录下面子目录下面文件名文件名文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。如:如: d: cctempfile1.dat表示表示file1.dat文件存放在文件存放在d盘中的盘中的cc目录下的目录下的temp子目录下面子目录下面命名规则遵循标命名规则遵循标识符的命名规则识符的命名规则文件路径表

10、示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。如:如: d: cctempfile1.dat表示表示file1.dat文件存放在文件存放在d盘中的盘中的cc目录下的目录下的temp子目录下面子目录下面一般不超过一般不超过3个字母(个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为ascii文件文件和和二进制文件二进制文件。数据在数据在内存中是以二进制形式存储的,如果不内存中是以二进制形式存储的,如果不加转换地输出到外存,加转换地输出到外存,就是就是二进制文件二进制文件如果

11、要求在外存上以如果要求在外存上以ascii代码形式存储,则需代码形式存储,则需要在存储前进行转换要在存储前进行转换ascii文件又称文本文件,每一个字节放一个字文件又称文本文件,每一个字节放一个字符的符的ascii代码代码字符一律以字符一律以ascii形式存储形式存储数值型数据既可以用数值型数据既可以用ascii形式存储,也可形式存储,也可以用二进制形式存储以用二进制形式存储如有整数如有整数10000,如果用,如果用ascii码形式输出到磁码形式输出到磁盘,则在磁盘中占个字节盘,则在磁盘中占个字节(每一个字符占一每一个字符占一个字节个字节),而用二进制形式输出,则在磁盘上,而用二进制形式输出,

12、则在磁盘上只占只占4个字节个字节(用用vc+ 时时)0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ascii形式形式00000000000000000010011100010000二进制形式二进制形式(10000)ansi c标准采用标准采用“缓冲文件系统缓冲文件系统”处理数据处理数据文件文件所谓所谓缓冲文件系统缓冲文件系统是指系统自动地在内存区是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个为程序中每一个正在使用的文件开辟一个文件缓冲区文件缓冲区从内存向磁盘输出数据必须先送到内存中的从内存向磁盘输出数据必须先送到内存中

13、的缓冲区,装满缓冲区后才一起送到磁盘去缓冲区,装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据,则一次从磁如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)据送到程序数据区(给程序变量)程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从内存向磁盘输出数据从内存向磁盘输出数据装满缓冲区装满缓冲区程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从磁盘向计算机读入

14、数据从磁盘向计算机读入数据充满缓冲区充满缓冲区缓冲文件系统中,关键的概念是缓冲文件系统中,关键的概念是“文件类型文件类型指针指针”,简称,简称“文件指针文件指针”每个被使用的文件都在内存中开辟一个相应的每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息文件信息区,用来存放文件的有关信息(如文(如文件的名字、文件状态及文件当前位置等)件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的构体类型是由系统声明的,取名为,取名为file声明声明file结构体类型的信息包含在头文件结构体类型的信

15、息包含在头文件“stdio.h”中中一般一般设置一个指向设置一个指向file类型变量的指针变量,类型变量的指针变量,然后通过它来引用这些然后通过它来引用这些file类型变量类型变量file*fp1,*fp2,*fp3;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息区文件信息区fp310.2.1 用用fopen函数打开数据文件函数打开数据文件10.2.2 用用fclose函数关闭数据文件函数关闭数据文件对文件读写之前应该对文件读写之前应该“打开打开”该文件,在使该文件,在使用结束之后应用结束之后应“关闭关闭”该文件。该文件。所谓所谓“

16、打开打开”是是指为文件建立相应的信息区指为文件建立相应的信息区(用来存放有关文件的信息用来存放有关文件的信息)和文件缓冲区和文件缓冲区(用来暂时存放输入输出的数据用来暂时存放输入输出的数据)。在编写程序时,在在编写程序时,在打开文件的同时打开文件的同时,一般,一般都都指定一个指针变量指向该文件指定一个指针变量指向该文件,也就是建,也就是建立起指针变量与文件之间的联系,这样就立起指针变量与文件之间的联系,这样就可以可以通过该指针变量对文件进行读写通过该指针变量对文件进行读写所谓所谓“关闭关闭”是指是指撤销文件信息区和文件缓撤销文件信息区和文件缓冲区冲区 fopen函数的调用方式为:函数的调用方式

17、为:fopen(文件名文件名,使用文件方式使用文件方式);例如:例如: fopen(“a1”,”r”); 表示要打开名为表示要打开名为“a1”的文件,使用文件方式的文件,使用文件方式为为“读入读入”fopen函数的返回值是指向函数的返回值是指向a1文件的指针文件的指针通常将通常将fopen函数的返回值赋给一个指向文函数的返回值赋给一个指向文件的指针变量。如:件的指针变量。如:file *fp; fp=fopen(“a1”,”r”);fp和文件和文件a1相联系,相联系,fp指向了指向了a1文件文件在打开一个文件时,通知编译系统以下在打开一个文件时,通知编译系统以下3个个信息:信息:需要访问的文件

18、的名字需要访问的文件的名字使用文件的方式(使用文件的方式(“读读”还是还是“写写”等)等)让哪一个指针变量指向被打开的文件让哪一个指针变量指向被打开的文件使用文件方式使用文件方式 文件使用方式文件使用方式 含含 义义 “r” (只读只读)为为输入输入打开一个打开一个文本文本文件文件“w” (只写只写)为为输出输出打开一个打开一个文本文本文件文件“a” (追加追加)向向文本文本文件尾增加数据文件尾增加数据“rb” (只读只读)为为输入输入打开一个打开一个二进制二进制文件文件“wb” (只写只写)为为输出输出打开一个打开一个二进制二进制文件文件ab“ (追加追加)向向二进制二进制文件尾增加数据文件

19、尾增加数据r+“ (读写读写)为为读读/写写打开一个打开一个文本文本文件文件w+” (读写读写)为为读读/写建立写建立一个新的一个新的文本文本文件文件a+” (读写读写)为读为读/写打开一个文本文件写打开一个文本文件rb+“ (读写读写)为读为读/写打开一个写打开一个二进制二进制文件文件“wb+“ (读写读写)为读为读/写写建立建立一个新的一个新的二进制二进制文件文件“ab+” (读写读写)为读为读/写打开一个写打开一个二进制二进制文件文件说明:说明:(1) 用用“r”方式打开的文件只能用于向计算机输方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文入而不能用作向该文件输出

20、数据,而且该文件应该已经存在,并存有数据,这样程序才件应该已经存在,并存有数据,这样程序才能从文件中读数据。能从文件中读数据。不能用不能用“r”方式打开一个并不存在的文件,否方式打开一个并不存在的文件,否则出错。则出错。说明:说明:(2) 用用“w”方式打开的文件只能用于向该文件方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算写数据(即输出文件),而不能用来向计算机输入。机输入。如果原来不存在该文件,则在打开文件前新建如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,如果原来已存在一个

21、以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新则在打开文件前先将该文件删去,然后重新建立一个新文件。建立一个新文件。说明:说明:(3) 如果希望向文件末尾添加新的数据(不希望如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用删除原有数据),则应该用“a”方式打开方式打开但此时应保证该文件已存在;否则将得到出错但此时应保证该文件已存在;否则将得到出错信息。信息。打开文件时,文件读写标记移到文件末尾打开文件时,文件读写标记移到文件末尾说明:说明:(4) 用用r+、w+、a+方式打开的文件既可以用来方式打开的文件既可以用来输入数据,也可以用来输出数据。输入数据,也可以用来输

22、出数据。用用r+方式时方式时该文件应该已经存在该文件应该已经存在。用用w+方式则新建立一个文件,方式则新建立一个文件,先先向此文件向此文件写写数数据,然据,然后后可以可以读读此文件中的数据。此文件中的数据。用用a+方式打开的文件,原来的文件不被删去,方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾文件读写位置标记移到文件末尾,可以添加,可以添加,也可以读也可以读。说明:说明:(5) 如果打开失败,如果打开失败,fopen函数将会带回一个出错函数将会带回一个出错信息。信息。fopen函数将带回一个空指针值函数将带回一个空指针值null常用下面的方法打开一个文件:常用下面的方法打开

23、一个文件: if (fp=fopen(“file1”,r)=null)printf(“cannot open this filen”); exit(0);终止正在执行的程序终止正在执行的程序说明:说明:(6) c标准建议用表标准建议用表10.1列出的文件使用方式打列出的文件使用方式打开文本文件或二进制文件,但目前使用的有开文本文件或二进制文件,但目前使用的有些些c编译系统可能不完全提供所有这些功能编译系统可能不完全提供所有这些功能说明:说明:(7) 计算机在输入时,计算机在输入时,从从ascii文件读入文件读入字符时,遇到回车换行符,系统把它转字符时,遇到回车换行符,系统把它转换为一个换行符换

24、为一个换行符,在,在输出时把换行符转输出时把换行符转换成为回车和换行两个字符换成为回车和换行两个字符。在。在用二进用二进制文件时,不进行这种转换,在内存中制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据的数据形式与输出到外部文件中的数据形式完全一致形式完全一致,一一对应。,一一对应。说明:说明:(8) 程序中可以使用程序中可以使用3个标准的流文件:个标准的流文件:标准输入标准输入流流、标准输出流标准输出流、标准出错输出流标准出错输出流。系统已对这系统已对这3个文件指定了与终端的对应关系个文件指定了与终端的对应关系标准输入流标准输入流stdin是从终端的输入是从终端的输入标准

25、输出流标准输出流stdout是向终端的输出是向终端的输出标准出错输出流标准出错输出流stderr是当程序出错时将出错信是当程序出错时将出错信息发送到终端息发送到终端程序开始运行时系统自动打开这程序开始运行时系统自动打开这3个标准流个标准流文件。因此,程序编写者不需要在程序文件。因此,程序编写者不需要在程序中用中用fopen函数打开它们函数打开它们。所以以前我们。所以以前我们用到的从终端输入或输出到终端都不需用到的从终端输入或输出到终端都不需要打开终端文件。要打开终端文件。关闭文件用关闭文件用fclose函数。函数。fclose函数调用的函数调用的一般形式为一般形式为fclose(文件指针文件指

26、针); 例如:例如: fclose (fp); 如果不关闭文件将会如果不关闭文件将会丢失丢失数据。数据。在顺序写时,先写入的数据存放在文件中前在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面面,后写入的数据存放在文件中后面在顺序读时,先读文件中前面的数据,后读在顺序读时,先读文件中前面的数据,后读文件中后面的数据文件中后面的数据对顺序读写来说,对文件读写数据的顺序和对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的数据在文件中的物理顺序是一致的 顺序读写需要用库函数实现顺序读写需要用库函数实现10.3.1 怎样向文件读写字符怎样向文件读写字符10.3.2

27、 怎样向文件读写一个字符串怎样向文件读写一个字符串10.3.3 用格式化的方式读写文用格式化的方式读写文件件10.3.4 用二进制方式向文件读写一组数据用二进制方式向文件读写一组数据函数名函数名调用形式调用形式功能功能返回值返回值fgetcfgetc(fp)从从fp指向的指向的文件读入一文件读入一个字符个字符读成功,带回所读读成功,带回所读的字符,失败则返的字符,失败则返回文件结束标志回文件结束标志(即即-1)fputcfputc(ch,fp)把字符把字符ch写写到到文件指针文件指针变量变量fp所指所指向的向的文件中文件中写成功,返回值就写成功,返回值就是输出的字符;输是输出的字符;输出失败,

28、则返回出失败,则返回(即(即-1)读写一个字符的函数读写一个字符的函数 例例10.1 从键盘输入一些字符,逐个把它们从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个送到磁盘上去,直到用户输入一个“”为止。为止。 解题思路:用解题思路:用fgetc函数从键盘逐个输入字函数从键盘逐个输入字符,然后用符,然后用fputc函数写到磁盘文件即可。函数写到磁盘文件即可。#include #include int main() file *fp; char ch,filename10; printf(请输入所用的文件名:请输入所用的文件名:); scanf(%s,filename); if(fp

29、=fopen(filename,“w”)=null) printf(无法打开此文件无法打开此文件n); exit(0); ch=getchar( );接收最后输接收最后输入的回车符入的回车符输入文件名输入文件名只写只写用用exit函数时加函数时加 printf(“请输入一个字符串请输入一个字符串(以以#结束结束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); /*输出换行符输出换行符*/ return 0; 例例10.2 将一个磁盘文件中的信息复制

30、到另将一个磁盘文件中的信息复制到另一个磁盘文件中。一个磁盘文件中。 要求将上例建立的要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件中的内容复制到另一个磁盘文件文件file2.dat中。中。解题思路:处理此问题的算法是:从解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,然后逐个文件中逐个读入字符,然后逐个输出到输出到file2.dat中。中。#include #include int main( ) file *in,*out; char ch,infile10,outfile10; printf(输入读入文件的名字输入读入文件的名字:); scanf(

31、%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,则复,则复制一个二进制文件制一个二进制文件 while(!feof(in) ch=fgetc(in); fputc(ch,out)

32、; putchar(ch); putchar(10); fclose(in); fclose(out); return 0;检查当前读写位置检查当前读写位置是否移到文件末尾是否移到文件末尾读写一个字符串的函数读写一个字符串的函数函数名函数名调用形式调用形式功能功能返回值返回值fgetsfgets(str,n,fp)从从fp指向的指向的文件读文件读入长度为入长度为(n-1)的字的字符串符串,存放到字符,存放到字符数组数组str中中读成功,返读成功,返回地址回地址str,失败则返回失败则返回null)fputsfputs(str,fp)str所指向的所指向的字符串字符串写到写到文件指针变量文件指针

33、变量fp所指向的所指向的文件中文件中写成功,返写成功,返回回 0 ; 否 则; 否 则返回非返回非0值值说明:说明:fgets函数的函数原型为:函数的函数原型为: char *fgets (char *str,int n,file *fp);其作用是从文件读入一个字符串其作用是从文件读入一个字符串调用时可以写成:调用时可以写成: fgets(str,n,fp);说明:说明:fgets(str,n,fp);中中n是要求得到的字符个数,但是要求得到的字符个数,但实实际上只读际上只读n-1个字符,然后在最后加一个个字符,然后在最后加一个0字字符符,这样得到的字符串共有,这样得到的字符串共有n个字符,

34、把它们放个字符,把它们放到字符数组到字符数组str中中如果在读完如果在读完n-1个字符之前遇到换行符个字符之前遇到换行符“n”或文或文件结束符件结束符eof,读入即结束,但将所遇到的换,读入即结束,但将所遇到的换行符行符“n”也作为一个字符读入也作为一个字符读入执行执行fgets成功成功,返回返回str数组首地址数组首地址,如果一开始,如果一开始就遇到就遇到文件尾或读数据错,返回文件尾或读数据错,返回null说明:说明:fputs函数的函数原型为:函数的函数原型为: int fputs (char *str, file *fp);str指向的字符串输出到指向的字符串输出到fp所指向的文件中所指

35、向的文件中调用时可以写成:调用时可以写成: fputs(china”,fp);fputs函数中第一个参数可以是字符串常量、字符函数中第一个参数可以是字符串常量、字符数组名或字符型指针数组名或字符型指针字符串末尾的字符串末尾的0不输出不输出输出输出成功,函数值为成功,函数值为;失败,函数值为失败,函数值为eof 例例10.3 从键盘读入若干个字符串,对它们按从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。串送到磁盘文件中保存。解题思路:为解决问题,可分为三个步骤:解题思路:为解决问题,可分为三个步骤:从键盘读入从键

36、盘读入n个字符串,存放在一个二维字符数个字符串,存放在一个二维字符数组中,每一个一维数组存放一个字符串;组中,每一个一维数组存放一个字符串;对字符数组中的对字符数组中的n个字符串按字母顺序排序,排个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;好序的字符串仍存放在字符数组中;将字符数组中的字符串顺序输出。将字符数组中的字符串顺序输出。#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+) ge

37、ts(stri); 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); 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;人为地

38、向文件人为地向文件写入一个写入一个n思考:思考:从文件从文件string.dat中读回字符串,并在屏幕中读回字符串,并在屏幕上显示,应如何编写程序?上显示,应如何编写程序?#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;不用人为

39、地加上不用人为地加上n一般调用方式为:一般调用方式为:fprintf(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);fscanf (文件指针文件指针,格式字符串格式字符串,输入表列输入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);一般调用形式为一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); buffer:是一个地址:是一个地址对对fread来说,来说,它是用来存放从文件读入的数据它是用来存放从文件读入的数

40、据的存储区的地址的存储区的地址对对fwrite来说,来说,是要把此地址开始的存储区中是要把此地址开始的存储区中的数据向文件输出的数据向文件输出size:要:要读写的字节数读写的字节数count:要:要读写多少个数据项读写多少个数据项fp:file类型指针类型指针读写成功时,函数返回值读写成功时,函数返回值count的值的值 例例10.4 从键盘输入从键盘输入10个学生的有关数据,个学生的有关数据,然后把它们转存到磁盘文件上去。然后把它们转存到磁盘文件上去。 解题思路:解题思路:定义有定义有10个元素的结构体数组,用来存放个元素的结构体数组,用来存放10个个学生的数据学生的数据从从main函数输

41、入函数输入10个学生的数据个学生的数据用用save函数实现向磁盘输出学生数据函数实现向磁盘输出学生数据用用fwrite函数一次输出一个学生的数据函数一次输出一个学生的数据#include #define size 10struct student_type char name10; int num; int age; char addr15; studsize; void save( ) file *fp; int i; if(fp=fopen(stu.dat,wb)=null) printf(cannot open filen); return; for(i=0;isize;i+) if(f

42、write(&studi, sizeof(struct student_type), 1,fp)!=1) printf(file write errorn); fclose(fp);10+4+4+15=33,实际上,实际上开辟开辟36字节,是字节,是4的倍数的倍数当前路径下的文件当前路径下的文件 结构体变量中成员的偏移量必须是成员大小的整数倍结构体变量中成员的偏移量必须是成员大小的整数倍(0 0被认为是任何数的整数倍)被认为是任何数的整数倍) 结构体大小必须是所有成员大小的整数倍。结构体大小必须是所有成员大小的整数倍。int main() int i; printf(“enter da

43、ta of students:n); for(i=0;isize;i+) scanf(%s%d%d%s, ,&studi.num, &studi.age,studi.addr); save( ); return 0;为了验证在磁盘文件为了验证在磁盘文件“stu.dat”中是否已中是否已存在此数据,可以用以下程序从存在此数据,可以用以下程序从“stu.dat”文件中读入数据,然后在屏文件中读入数据,然后在屏幕上输出。幕上输出。#include #include #define size 10struct student_type char name10; in

44、t num; int age; char addr15;studsize; 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.num, studi. age,studi.addr); fclose (fp); return

45、 0; 如果修改例如果修改例10.4:从已有的二进制文件:从已有的二进制文件“stu.list”中,读入数据并输出到中,读入数据并输出到“stu.dat”文件中,应如何修改程序?文件中,应如何修改程序? 解题思路:解题思路:编写编写load函数函数main函数中再调用函数中再调用load函数函数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 st

46、udent_type),1,fp)!=1) if(feof(fp) fclose(fp); return; printf(file read errorn); fclose (fp);int main() load();save(); return 0;对文件进行顺序读写比较容易理解,也容易对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高操作,但有时效率不高随机访问不是按数据在文件中的物理位置次随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效据进行访问,显然这种方法比顺序访问效率高得多率

47、高得多10.4.1 文件位置标记及其定位文件位置标记及其定位10.4.2 随机读写随机读写1.文件位置标记文件位置标记为了对读写进行控制,系统为每个文件为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记设置了一个文件读写位置标记(简称文简称文件标记件标记),用来指示,用来指示“接下来要读写的接下来要读写的下一个字符的位置下一个字符的位置”文件指针文件指针读写当前位置读写当前位置文件尾文件尾1.文件位置标记文件位置标记文件头文件头1.文件位置标记文件位置标记一般情况下,在对字符文件进行顺序读写一般情况下,在对字符文件进行顺序读写时,文件标记指向文件开头,进行读的时,文件标记指向文件开头

48、,进行读的操作时,就读第一个字符,然后文件标操作时,就读第一个字符,然后文件标记向后移一个位置,在下一次读操作时,记向后移一个位置,在下一次读操作时,就将位置标记指向的第二个字符读入。就将位置标记指向的第二个字符读入。依此类推,直到遇文件尾,结束依此类推,直到遇文件尾,结束1.文件位置标记文件位置标记如果是顺序写文件,则每写完一个数据后,如果是顺序写文件,则每写完一个数据后,文件标记顺序向后移一个位置,然后在文件标记顺序向后移一个位置,然后在下一次执行写操作时把数据写入指针所下一次执行写操作时把数据写入指针所指的位置。直到把全部数据写完,此时指的位置。直到把全部数据写完,此时文件位置标记在最后

49、一个数据之后文件位置标记在最后一个数据之后1.文件位置标记文件位置标记可以根据读写的需要,人为地移动了文件可以根据读写的需要,人为地移动了文件标记的位置。文件标记可以向前移、向标记的位置。文件标记可以向前移、向后移,移到文件头或文件尾,然后对该后移,移到文件头或文件尾,然后对该位置进行读写位置进行读写随机读写随机读写随机读写随机读写可以在任何位置写入数据,在任可以在任何位置写入数据,在任何位置读取数据何位置读取数据2. 文件位置标记的定位文件位置标记的定位可以强制使文件位置标记指向指定的位置可以强制使文件位置标记指向指定的位置可以用以下函数实现:可以用以下函数实现:(1)用用rewind函数函

50、数使使文件标记指向文件开头文件标记指向文件开头 rewind函数的作用是使文件标记重新返回文函数的作用是使文件标记重新返回文件的开头,此函数没有返回值。件的开头,此函数没有返回值。 例例10.5 有一个磁盘文件,内有一些信息。有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第要求第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。二次把它复制到另一文件上。解题思路:解题思路:因为在第一次读入完文件内容后,文件标记因为在第一次读入完文件内容后,文件标记已指到文件的末尾,如果再接着读数据,已指到文件的末尾,如果再接着读数据,就遇到文件结束标志,就遇到文件结束标志,feof函数

51、的值等于函数的值等于1(真真),无法再读数据,无法再读数据必须在程序中用必须在程序中用rewind函数使位置指针返回函数使位置指针返回文件的开头文件的开头#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

52、 0;2. 文件位置标记的定位文件位置标记的定位可以强制使文件标记指向指定的位置可以强制使文件标记指向指定的位置可以用以下函数实现:可以用以下函数实现:(2) 用用fseek函数函数改变文件标记改变文件标记fseek函数的调用形式为:函数的调用形式为:fseek(文件类型指针文件类型指针,位移量位移量,起始点起始点) 起始点起始点0代表代表“文件开始位置文件开始位置”,1为为“当前位当前位置置”,2为为“文件末尾位置文件末尾位置”标准指定的名字标准指定的名字起始点起始点名名 字字用数字代表用数字代表文件开始位置文件开始位置seek_set0文件当前位置文件当前位置seek_cur1文件末尾位置

53、文件末尾位置seek_end2位移量指以起始点为基点,向前移动的字节位移量指以起始点为基点,向前移动的字节数。数。位移量应是位移量应是long型数据型数据(在数字的末尾在数字的末尾加一个字母加一个字母l)。fseek函数函数一般用于二进制文件一般用于二进制文件。下面是。下面是fseek函数调用的几个例子:函数调用的几个例子: fseek (fp,100l,0); fseek (fp,50l,1); fseek (fp,-10l,2); 2. 文件位置标记的定位文件位置标记的定位可以强制使文件位置标记指向指定的位置可以强制使文件位置标记指向指定的位置可以用以下函数实现:可以用以下函数实现:(3) 用用ftell函数函数测定文件位置标记的当前位置测定文件位置标记的当前位置ftell函数的作用是得到流式文件中文件位置标记函数的作用是得到流式文件中文件位置标记的当

温馨提示

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

最新文档

评论

0/150

提交评论