1、第十三章l l 本章要点n n 文件的基本概念文件的基本概念文件的基本概念文件的基本概念n n 文件的基本函数文件的基本函数文件的基本函数文件的基本函数n n 文件的顺序读写文件的顺序读写文件的顺序读写文件的顺序读写n n 文件的随机读写文件的随机读写文件的随机读写文件的随机读写n n 文件的简单应用文件的简单应用文件的简单应用文件的简单应用 l l 主要内容13.1 13.1 文件的有关概念文件的有关概念13.2 13.2 文件的打开与关闭文件的打开与关闭13.3 13.3 文件的顺序读写文件的顺序读写13.4 13.4 文件的随机读写文件的随机读写13.5 13.5 文件读写的出错检测文件
2、读写的出错检测13.1 C文件的有关概念 13.1.1 13.1.1什么是文件什么是文件所谓文件一般指存储在外部介质所谓文件一般指存储在外部介质所谓文件一般指存储在外部介质所谓文件一般指存储在外部介质(如磁盘磁带如磁盘磁带如磁盘磁带如磁盘磁带)上上上上数据的集合数据的集合数据的集合数据的集合.操作系统是以文件为单位对数据进行管理的操作系统是以文件为单位对数据进行管理的操作系统是以文件为单位对数据进行管理的操作系统是以文件为单位对数据进行管理的.输入输出是数据传送的过程,数据如流水一样从输入输出是数据传送的过程,数据如流水一样从输入输出是数据传送的过程,数据如流水一样从输入输出是数据传送的过程,
3、数据如流水一样从一处流向另一处,因此常将输入输出形象地称为一处流向另一处,因此常将输入输出形象地称为一处流向另一处,因此常将输入输出形象地称为一处流向另一处,因此常将输入输出形象地称为流流流流(stream)(stream)(stream)(stream),即输入输出流。,即输入输出流。,即输入输出流。,即输入输出流。语言把文件看作是一个字符(字节)的序列,语言把文件看作是一个字符(字节)的序列,语言把文件看作是一个字符(字节)的序列,语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。一即由一个一个字符(字节)的数据顺序组成。一即由一个一个字符(字节)的数据顺序组
4、成。一即由一个一个字符(字节)的数据顺序组成。一个输入输出流就是个输入输出流就是个输入输出流就是个输入输出流就是一一一一个字节流或二进制流。个字节流或二进制流。个字节流或二进制流。个字节流或二进制流。13.1 C文件的有关概念 13.1.2 13.1.2 文件名文件名一个文件要有一个惟一的文件标识,以便用户识一个文件要有一个惟一的文件标识,以便用户识一个文件要有一个惟一的文件标识,以便用户识一个文件要有一个惟一的文件标识,以便用户识别和引用。文件标识包括三部分:别和引用。文件标识包括三部分:别和引用。文件标识包括三部分:别和引用。文件标识包括三部分:(1)(1)(1)(1)文件路径:文件路径:
5、文件路径:文件路径:(2)(2)(2)(2)文件名主干;文件名主干;文件名主干;文件名主干;(3)(3)(3)(3)文件后缀。文件后缀。文件后缀。文件后缀。文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。文件路径表示文件在外部存储设备中的位置。如:如:如:如:d:cc temp d:cc temp file1 file1.datdat 文件路径文件路径文件路径文件路径 文件名主干文件名主干文件名主干文件名主干 文件后缀文件后缀文件后缀文件后缀注意注意注意注意:文件标识被称为文件名,但此时的文件名包括以上三部分内容,文件标识
6、被称为文件名,但此时的文件名包括以上三部分内容,文件标识被称为文件名,但此时的文件名包括以上三部分内容,文件标识被称为文件名,但此时的文件名包括以上三部分内容,而不仅是文件名主干。而不仅是文件名主干。而不仅是文件名主干。而不仅是文件名主干。文件名主干的命名规则遵循标识符的命名规则。后缀用来表文件名主干的命名规则遵循标识符的命名规则。后缀用来表文件名主干的命名规则遵循标识符的命名规则。后缀用来表文件名主干的命名规则遵循标识符的命名规则。后缀用来表示文件的性质,一般不超过示文件的性质,一般不超过示文件的性质,一般不超过示文件的性质,一般不超过3 3个字母个字母个字母个字母.如:如:如:如:.doc
7、(Word.doc(Word 生成的文件生成的文件生成的文件生成的文件),.txt(.txt(文本文件文本文件文本文件文本文件),.dat(.dat(数据文件数据文件数据文件数据文件)13.1.3 13.1.3 文件的分类文件的分类根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为文件和二进制文件。文件和二进制文件。文件和二进制文件。文件和二进制文件。ASCIIASCIIASCIIASCII文件文件文件文件(文本文件文本文件文本文件文本文件):):):):每一个字节放一个每一个字节放一个每一个字节放一个每一个
8、字节放一个ASCIIASCIIASCIIASCII代码代码代码代码二进制文件二进制文件二进制文件二进制文件:把内存中的数据按其在内存中的存储形把内存中的数据按其在内存中的存储形把内存中的数据按其在内存中的存储形把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放式原样输出到磁盘上存放式原样输出到磁盘上存放式原样输出到磁盘上存放.例:例:例:例:整数整数整数整数13000130001300013000在内存中的存储形式以及分别按在内存中的存储形式以及分别按在内存中的存储形式以及分别按在内存中的存储形式以及分别按ASCIIASCIIASCIIASCII码形式和二进制形式输出如下图所示:码形式和
9、二进制形式输出如下图所示:码形式和二进制形式输出如下图所示:码形式和二进制形式输出如下图所示:13.1 C13.1 C文件的有关概念文件的有关概念13.1 C13.1 C文件的有关概念文件的有关概念13.1.3 13.1.3 文件的分类文件的分类ASCIIASCIIASCIIASCII文件和二进制文件的比较:文件和二进制文件的比较:文件和二进制文件的比较:文件和二进制文件的比较:ASCIIASCIIASCIIASCII文件文件文件文件便于对字符进行逐个处理,也便于输出便于对字符进行逐个处理,也便于输出便于对字符进行逐个处理,也便于输出便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多
10、,而且要花费转换时字符。但一般占存储空间较多,而且要花费转换时字符。但一般占存储空间较多,而且要花费转换时字符。但一般占存储空间较多,而且要花费转换时间。间。间。间。二进制文件二进制文件二进制文件二进制文件可以节省外存空间和转换时间,但一个可以节省外存空间和转换时间,但一个可以节省外存空间和转换时间,但一个可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。字节并不对应一个字符,不能直接输出字符形式。字节并不对应一个字符,不能直接输出字符形式。字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又一般中间结果数据需要暂时保存在外存上,
11、以后又一般中间结果数据需要暂时保存在外存上,以后又一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存。需要输入内存的,常用二进制文件保存。需要输入内存的,常用二进制文件保存。需要输入内存的,常用二进制文件保存。13.1 C13.1 C文件的有关概念文件的有关概念13.1.4 13.1.4 文件缓冲区文件缓冲区 标准采用标准采用标准采用标准采用“缓冲文件系统缓冲文件系统缓冲文件系统缓冲文件系统”处理文件处理文件处理文件处理文件.缓冲文件系统:缓冲文件系统:缓冲文件系统:缓冲文件系统:系统自动地在内存区为每一个正系统自动地在内存区为每一个正系统自动地在内存区为每一个正系
12、统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。在使用的文件开辟一个缓冲区。在使用的文件开辟一个缓冲区。在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲从内存向磁盘输出数据必须先送到内存中的缓冲从内存向磁盘输出数据必须先送到内存中的缓冲从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。区,装满缓冲区后才一起送到磁盘去。区,装满缓冲区后才一起送到磁盘去。区,装满缓冲区后才一起送到磁盘去。文件文件文件文件程序程序程序程序数据区数据区数据区数据区输输输输出出出出文件缓冲区文件缓冲区文件缓冲区文件缓冲区输输输输入入入入文件缓冲区文件缓冲区文件缓冲区
13、文件缓冲区13.1 C13.1 C文件的有关概念文件的有关概念 13.1.5 13.1.5 文件指针文件指针不同的不同的不同的不同的C C C C编译系统的编译系统的编译系统的编译系统的FILEFILEFILEFILE类型包含的内容不完全相同,但大同小类型包含的内容不完全相同,但大同小类型包含的内容不完全相同,但大同小类型包含的内容不完全相同,但大同小异。异。异。异。Turbo Turbo Turbo Turbo 在在在在stdio.hstdio.hstdio.hstdio.h文件中有以下的文件类型声明:文件中有以下的文件类型声明:文件中有以下的文件类型声明:文件中有以下的文件类型声明:typ
14、edef structtypedef structtypedef structtypedef struct shortlevel;shortlevel;shortlevel;shortlevel;*缓冲区缓冲区缓冲区缓冲区“满满满满”或或或或“空空空空”的程度的程度的程度的程度*unsignedflags;unsignedflags;unsignedflags;unsignedflags;*文件状态标志文件状态标志文件状态标志文件状态标志*charfd;charfd;charfd;charfd;*文件描述符文件描述符文件描述符文件描述符*unsignedcharhold;unsignedcha
15、rhold;unsignedcharhold;unsignedcharhold;*如无缓冲区不读取字符如无缓冲区不读取字符如无缓冲区不读取字符如无缓冲区不读取字符*shortbsize;shortbsize;shortbsize;shortbsize;*缓冲区的大小缓冲区的大小缓冲区的大小缓冲区的大小*unsignedchar*bufferunsignedchar*bufferunsignedchar*bufferunsignedchar*buffer;/*;/*;/*;/*数据缓冲区的位置数据缓冲区的位置数据缓冲区的位置数据缓冲区的位置*/unsignedar*curp;unsignedar
16、*curp;unsignedar*curp;unsignedar*curp;/*/*/*/*指针,当前的指向指针,当前的指向指针,当前的指向指针,当前的指向*/unsignedistemp;unsignedistemp;unsignedistemp;unsignedistemp;/*/*/*/*临时文件,指示器临时文件,指示器临时文件,指示器临时文件,指示器*/shorttoken;shorttoken;shorttoken;shorttoken;/*/*/*/*用于有效性检查用于有效性检查用于有效性检查用于有效性检查*/FILEFILEFILEFILE;在缓冲文件系统中在缓冲文件系统中在缓冲
17、文件系统中在缓冲文件系统中,每个被使用的文件都要在内存中开辟一每个被使用的文件都要在内存中开辟一每个被使用的文件都要在内存中开辟一每个被使用的文件都要在内存中开辟一FILEFILEFILEFILE类型的区类型的区类型的区类型的区,存放文件的有关信息存放文件的有关信息存放文件的有关信息存放文件的有关信息.13.1 C13.1 C文件的有关概念文件的有关概念 13.1.5 13.1.5 文件指针文件指针FILEFILEFILEFILE类型的数组:类型的数组:类型的数组:类型的数组:FILEFILEFILEFILEf f f f5 5 5 5;定义了一个结构体数组定义了一个结构体数组定义了一个结构体
18、数组定义了一个结构体数组f f f f,它有,它有,它有,它有5 5 5 5个元素,个元素,个元素,个元素,可以用来存放可以用来存放可以用来存放可以用来存放5 5 5 5个文件的信息。个文件的信息。个文件的信息。个文件的信息。文件型指针变量文件型指针变量文件型指针变量文件型指针变量:FILE *fpFILE *fpFILE *fpFILE *fp;fpfpfpfp是一个指向是一个指向是一个指向是一个指向FILEFILEFILEFILE类型结构体的类型结构体的类型结构体的类型结构体的指针变量。可以使指针变量。可以使指针变量。可以使指针变量。可以使fpfpfpfp指向某一个文件的结构体变量,从指向
19、某一个文件的结构体变量,从指向某一个文件的结构体变量,从指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。如果而通过该结构体变量中的文件信息能够访问该文件。如果而通过该结构体变量中的文件信息能够访问该文件。如果而通过该结构体变量中的文件信息能够访问该文件。如果有个文件,一般应设个指针变量,使它们分别指向有个文件,一般应设个指针变量,使它们分别指向有个文件,一般应设个指针变量,使它们分别指向有个文件,一般应设个指针变量,使它们分别指向个文件,以实现对文件的访问。个文件,以实现对文件的访问。个文件,以实现对文件的访问。个文件,以实现对文件的访问。13.1 C13.1 C文
20、件的有关概念文件的有关概念 13.1.5 13.1.5 文件指针文件指针在标准输入输出库中,系统定义了三个在标准输入输出库中,系统定义了三个在标准输入输出库中,系统定义了三个在标准输入输出库中,系统定义了三个FILEFILEFILEFILE型的指针变量:型的指针变量:型的指针变量:型的指针变量:1.1.1.1.stdin stdin stdin stdin(标准输入文件指针标准输入文件指针标准输入文件指针标准输入文件指针)。指向在内存中与键盘相应的文件。指向在内存中与键盘相应的文件。指向在内存中与键盘相应的文件。指向在内存中与键盘相应的文件信息区,因此,用它进行输入就蕴含了从键盘输入。信息区,
21、因此,用它进行输入就蕴含了从键盘输入。信息区,因此,用它进行输入就蕴含了从键盘输入。信息区,因此,用它进行输入就蕴含了从键盘输入。2.2.2.2.stdout stdout stdout stdout(标准输出文件指针标准输出文件指针标准输出文件指针标准输出文件指针)。指向在内存中与显示器屏幕相应。指向在内存中与显示器屏幕相应。指向在内存中与显示器屏幕相应。指向在内存中与显示器屏幕相应的文件信息区,因此,用它进行输出就蕴含了输出到显示器屏幕。的文件信息区,因此,用它进行输出就蕴含了输出到显示器屏幕。的文件信息区,因此,用它进行输出就蕴含了输出到显示器屏幕。的文件信息区,因此,用它进行输出就蕴含
22、了输出到显示器屏幕。3.3.3.3.stderrstderrstderrstderr(标准错误文件指针标准错误文件指针标准错误文件指针标准错误文件指针),用来输出出错的信息,它也指向在,用来输出出错的信息,它也指向在,用来输出出错的信息,它也指向在,用来输出出错的信息,它也指向在内存中与显示器屏幕相应的文件信息区,因此,在程序运行时的出内存中与显示器屏幕相应的文件信息区,因此,在程序运行时的出内存中与显示器屏幕相应的文件信息区,因此,在程序运行时的出内存中与显示器屏幕相应的文件信息区,因此,在程序运行时的出错的信息就输出到显示器屏幕。错的信息就输出到显示器屏幕。错的信息就输出到显示器屏幕。错的
23、信息就输出到显示器屏幕。13.1 C13.1 C文件的有关概念文件的有关概念 13.1.6 13.1.6 文件的位置指针文件的位置指针位置指针位置指针位置指针位置指针用来指示当前的读写位置。用来指示当前的读写位置。用来指示当前的读写位置。用来指示当前的读写位置。一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向文件开头,这时如果对文件进行读的操作,就读第一个字符,然后文件开头,这时如果对文件进行读的操作,就读第一个
24、字符,然后文件开头,这时如果对文件进行读的操作,就读第一个字符,然后文件开头,这时如果对文件进行读的操作,就读第一个字符,然后文件的位置指针顺序向后移一个位置,在下一次执行读的操作时,文件的位置指针顺序向后移一个位置,在下一次执行读的操作时,文件的位置指针顺序向后移一个位置,在下一次执行读的操作时,文件的位置指针顺序向后移一个位置,在下一次执行读的操作时,就将指针指向的第二个字符读入。依此类推,直到遇文件尾就将指针指向的第二个字符读入。依此类推,直到遇文件尾就将指针指向的第二个字符读入。依此类推,直到遇文件尾就将指针指向的第二个字符读入。依此类推,直到遇文件尾.文件头文件头文件头文件头 读写当
25、前位置读写当前位置读写当前位置读写当前位置 文件尾文件尾文件尾文件尾有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,然后再接着写入新的数据,这就是文件的然后再接着写入新的数据,这就是文件的然后再接着写入新的数据,这就是文件的然后再接着写入新的数据,这就是文件的追加追加追加追加。13.2 13.2 文件的打开与关闭文件的打开与关闭13.
26、2.113.2.1文件的打开文件的打开(fopen(fopen函数函数)函数调用函数调用函数调用函数调用:FILE *fpFILE *fpFILE *fpFILE *fp;fpfpfpfpfopenfopenfopenfopen(文件名文件名文件名文件名,使用文件方式使用文件方式使用文件方式使用文件方式););););需要打开的文件名,也就是准备访问的文件的名字;需要打开的文件名,也就是准备访问的文件的名字;需要打开的文件名,也就是准备访问的文件的名字;需要打开的文件名,也就是准备访问的文件的名字;使用文件的方式(使用文件的方式(使用文件的方式(使用文件的方式(“读读读读”还是还是还是还是“写
27、写写写”等);等);等);等);让哪一个指针变量指向被打开的文件。让哪一个指针变量指向被打开的文件。让哪一个指针变量指向被打开的文件。让哪一个指针变量指向被打开的文件。13.2 13.2 文件的打开与关闭文件的打开与关闭 13.2.1 文件的打开(fopen函数)文件使用方式含文件使用方式含 义义 “r r”(只读只读)为为输入输入打开一个打开一个文本文本文件文件“w w”(只写只写)为为输出输出打开一个打开一个文本文本文件文件“a a”(追加追加)向向文本文本文件尾增加数据文件尾增加数据“rbrb”(只读只读)为为输入输入打开一个打开一个二进制二进制文件文件“wbwb”(只写只写)为为输出输
28、出打开一个打开一个二进制二进制文件文件abab“(追加追加)向向二进制二进制文件尾增加数据文件尾增加数据r+r+“(读写读写)为为读读/写写打开一个打开一个文本文本文件文件w+w+”(读写读写)为为读读/写建立写建立一个新的一个新的文本文本文件文件a+a+”(读写读写)为读为读/写打开一个文本文件写打开一个文本文件rb+rb+“(读写读写)为读为读/写打开一个写打开一个二进制二进制文件文件“wb+wb+“(读写读写)为读为读/写写建立建立一个新的一个新的二进制二进制文件文件“ab+ab+”(读写读写)为读为读/写打开一个写打开一个二进制二进制文件文件13.2 13.2 文件的打开与关闭文件的打
29、开与关闭 13.2.2 13.2.2 文件的关闭文件的关闭(fclose(fclose函数函数)函数调用函数调用函数调用函数调用:fclosefclosefclosefclose(文件指针文件指针文件指针文件指针););););函数功能函数功能函数功能函数功能:使文件指针变量不指向该文件,也就是文件指针变使文件指针变量不指向该文件,也就是文件指针变使文件指针变量不指向该文件,也就是文件指针变使文件指针变量不指向该文件,也就是文件指针变量与文件量与文件量与文件量与文件“脱钩脱钩脱钩脱钩”,此后不能再通过该指针对原来与,此后不能再通过该指针对原来与,此后不能再通过该指针对原来与,此后不能再通过该指
30、针对原来与其相联系的文件进行读写操作其相联系的文件进行读写操作其相联系的文件进行读写操作其相联系的文件进行读写操作 返回值返回值返回值返回值:关闭成功返回值为;否则返回关闭成功返回值为;否则返回关闭成功返回值为;否则返回关闭成功返回值为;否则返回EOF(-1)EOF(-1)EOF(-1)EOF(-1)13.3 13.3 文件的顺序读写文件的顺序读写 13.3.1 13.3.1 向文件读写一个字符向文件读写一个字符1.1.1.1.用用用用fputcfputcfputcfputc函数向文件写入一个字符函数向文件写入一个字符函数向文件写入一个字符函数向文件写入一个字符.调用形式调用形式调用形式调用形
31、式:fputc(ch fputc(ch fputc(ch fputc(ch,fp)fp)fp)fp);函数功能函数功能函数功能函数功能:将字符(将字符(将字符(将字符(chchchch的值)输出到的值)输出到的值)输出到的值)输出到fpfpfpfp所指向的文件中去。所指向的文件中去。所指向的文件中去。所指向的文件中去。返回值返回值返回值返回值:如果输出成功,则返回值就是输出的字符;如果输出成功,则返回值就是输出的字符;如果输出成功,则返回值就是输出的字符;如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个如果输出失败,则返回一个如果输出失败,则返回一个如果输出失败,则返回一个EOF
32、.EOF.EOF.EOF.13.3 13.3 文件的顺序读写文件的顺序读写 13.3.1 13.3.1 向文件读写一个字符向文件读写一个字符2.2.fgetc函数从文件读入一个字符函数从文件读入一个字符.调用形式调用形式:();();函数功能函数功能:函数带回一个字符,赋给。函数带回一个字符,赋给。返回值返回值:如果在执行函数读字符时遇到文件结束如果在执行函数读字符时遇到文件结束符,函数返回一个文件结束标志符,函数返回一个文件结束标志(即即-1)-1)。13.4 13.4 文件的读写文件的读写(续续)fputcfputcfputcfputc和和和和fgetcfgetcfgetcfgetc函数使
33、用举例:函数使用举例:函数使用举例:函数使用举例:例例例例3 3 3 3从键盘输入一些字符,逐个把它们送到从键盘输入一些字符,逐个把它们送到从键盘输入一些字符,逐个把它们送到从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个磁盘上去,直到输入一个磁盘上去,直到输入一个磁盘上去,直到输入一个“”为止。为止。为止。为止。3.3.3.3.读写字符举例读写字符举例读写字符举例读写字符举例例例例例13.113.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个从键盘输入一些字符
34、,逐个把它们送到磁盘上去,直到输入一个“”为止。为止。为止。为止。#include#include#include#include void main(void)void main(void)FILE*fp;FILE*fp;char ch,filename13;char ch,filename13;scanf(%s,filename);scanf(%s,filename);if(fp=fopen(filename,w)=NULL)if(fp=fopen(filename,w)=NULL)printf(cannot open filen);printf(cannot open filen);ex
35、it(0);exit(0);/*/*/*/*终止程序终止程序终止程序终止程序*/ch=getchar();ch=getchar();/*/*/*/*接收执行接收执行接收执行接收执行scanfscanfscanfscanf语句时最后输入的回车符语句时最后输入的回车符语句时最后输入的回车符语句时最后输入的回车符*/ch=getchar();ch=getchar();/*/*/*/*接收输入的第一个字符接收输入的第一个字符接收输入的第一个字符接收输入的第一个字符*/while(ch!=#while(ch!=#fputc(ch,fp);putchar(ch);fputc(ch,fp);putchar(
36、ch);ch=getchar();ch=getchar();fclose(fp);fclose(fp);运行情况如下:运行情况如下:运行情况如下:运行情况如下:(输入磁盘文件名)(输入磁盘文件名)(输入磁盘文件名)(输入磁盘文件名)(输入一个字符串)(输入一个字符串)(输入一个字符串)(输入一个字符串)(输出一个字符串)(输出一个字符串)(输出一个字符串)(输出一个字符串)13.4 13.4 文件的读写文件的读写(续续)fputcfputcfputcfputc和和和和fgetcfgetcfgetcfgetc函数使用举例:函数使用举例:函数使用举例:函数使用举例:例例例例3 3 3 3将一个磁盘
37、文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁盘文件中盘文件中盘文件中盘文件中 。例例例例13.213.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。将一个磁盘文件中的信息复制到另一个磁盘文件中。将一个磁盘文件中的信息复制到另一个磁盘文件中。将一个磁盘文件中的信息复制到另一个磁盘文件中。#include#include#include#include#include#include#include#include main()main()main()main()FILE*in,*out;FILE*in,
38、*out;FILE*in,*out;FILE*in,*out;char ch,infile13,outfile13;char ch,infile13,outfile13;char ch,infile13,outfile13;char ch,infile13,outfile13;printf(Enter the infile name:n);printf(Enter the infile name:n);printf(Enter the infile name:n);printf(Enter the infile name:n);scanf(%s,infile);scanf(%s,infile)
39、;scanf(%s,infile);scanf(%s,infile);printf(Enter the outfile name:n);printf(Enter the outfile name:n);printf(Enter the outfile name:n);printf(Enter the outfile name:n);scanf(%s,outfile);scanf(%s,outfile);scanf(%s,outfile);scanf(%s,outfile);if(in=fopen(infile,r)=NULL)if(in=fopen(infile,r)=NULL)if(in=f
40、open(infile,r)=NULL)if(in=fopen(infile,r)=NULL)printf(cannot open infilen);printf(cannot open infilen);printf(cannot open infilen);printf(cannot open infilen);exit(0);exit(0);exit(0);exit(0);if(out=fopen(outfile,w)=NULL)if(out=fopen(outfile,w)=NULL)if(out=fopen(outfile,w)=NULL)if(out=fopen(outfile,w
41、)=NULL)printf(cannot open outfilen);printf(cannot open outfilen);printf(cannot open outfilen);printf(cannot open outfilen);exit(0);exit(0);exit(0);exit(0);while(!feof(in)fputc(fgetc(in),out);while(!feof(in)fputc(fgetc(in),out);while(!feof(in)fputc(fgetc(in),out);while(!feof(in)fputc(fgetc(in),out);f
42、close(in);fclose(in);fclose(in);fclose(in);fclose(out);fclose(out);fclose(out);fclose(out);运行情况如下:运行情况如下:运行情况如下:运行情况如下:datdatdatdat(输入原有磁盘文件名(输入原有磁盘文件名(输入原有磁盘文件名(输入原有磁盘文件名 n n n n:datdatdatdat(输入新复制的磁盘文件名)(输入新复制的磁盘文件名)(输入新复制的磁盘文件名)(输入新复制的磁盘文件名)程序运行结果是将程序运行结果是将程序运行结果是将程序运行结果是将datdatdatdat文件中的内容复制到文件中
43、的内容复制到文件中的内容复制到文件中的内容复制到datdatdatdat中去。中去。中去。中去。13.3 13.3 文件的顺序读写文件的顺序读写 13.3.2 向文件读写一个字符串fgetsfgetsfgetsfgets函数函数函数函数函数原形函数原形函数原形函数原形char*fgets(char*str,int n,FILE*fp);char*fgets(char*str,int n,FILE*fp);函数功能函数功能函数功能函数功能:从指定的文件读入一个字符从指定的文件读入一个字符从指定的文件读入一个字符从指定的文件读入一个字符.返回值返回值返回值返回值:若执行函数成功,则返回值为数若执行
44、函数成功,则返回值为数若执行函数成功,则返回值为数若执行函数成功,则返回值为数组首元素的地址组首元素的地址组首元素的地址组首元素的地址 如果一开始就遇到文件尾或读数据出错,则返回如果一开始就遇到文件尾或读数据出错,则返回如果一开始就遇到文件尾或读数据出错,则返回如果一开始就遇到文件尾或读数据出错,则返回NULLNULLNULLNULL。13.3 13.3 文件的顺序读写文件的顺序读写 13.3.2 13.3.2 向文件读写一个字符串向文件读写一个字符串fputsfputsfputsfputs函数函数函数函数函数原形函数原形函数原形函数原形int fputs(const str,FILE*fp)
45、;int fputs(const str,FILE*fp);函数功能函数功能函数功能函数功能:用函数可以向指定的文件输出一个字符串用函数可以向指定的文件输出一个字符串用函数可以向指定的文件输出一个字符串用函数可以向指定的文件输出一个字符串.13.4 13.4 文件的读写文件的读写(续续)fputc和fgetc函数使用举例:例例3 3将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁盘文件中盘文件中。例例例例13.313.313.313.3从键盘读入若干个字符串,对它们按字母顺序排序,从键盘读入若干个字符串,对它们按字母顺序排序,从键盘读入若干个字符串,对它们按字母顺序排序
46、,从键盘读入若干个字符串,对它们按字母顺序排序,后把它们送到谚磁盘文件中保存后把它们送到谚磁盘文件中保存后把它们送到谚磁盘文件中保存后把它们送到谚磁盘文件中保存.#include#include#include#include#include#include#include#include#include#include#include#include void main()void main()void main()void main()FILE*fp;FILE*fp;FILE*fp;FILE*fp;char str313,temp13;char str313,temp13;char str
47、313,temp13;char str313,temp13;int i,j,k,n=3;int i,j,k,n=3;int i,j,k,n=3;int i,j,k,n=3;printf(Enter strings:n);printf(Enter strings:n);printf(Enter strings:n);printf(Enter strings:n);for(i=0;in;i+)for(i=0;in;i+)for(i=0;in;i+)for(i=0;in;i+)gets(stri);gets(stri);gets(stri);gets(stri);for(i=0;in-1;i+)k=
48、i;for(i=0;in-1;i+)k=i;for(i=0;in-1;i+)k=i;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)for(j=i+1;jn;j+)for(j=i+1;jn;j+)for(j=i+1;j0)k=j;if(strcmp(strk,strj)0)k=j;if(strcmp(strk,strj)0)k=j;if(strcmp(strk,strj)0)k=j;13.4 13.4 文件的读写文件的读写(续续)fputcfputcfputcfputc和和和和fgetcfgetcfgetcfgetc函数使用举例:函数使用举例:函数使用举例:函数使用举例
49、:例例例例3 3 3 3将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁将一个磁盘文件中的信息复制到另一个磁盘文件中盘文件中盘文件中盘文件中 。if(k!=i)if(k!=i)if(k!=i)if(k!=i)strcpy(temp,stri);strcpy(temp,stri);strcpy(temp,stri);strcpy(temp,stri);strcpy(strk,strcpy(stri,strk);strcpy(strk,strcpy(stri,strk);strcpy(strk,strcpy(stri,strk);strc
50、py(strk,strcpy(stri,strk);temp);temp);temp);temp);if(fp=fopen(D:CCtempstring.dat,w)=NULL)if(fp=fopen(D:CCtempstring.dat,w)=NULL)if(fp=fopen(D:CCtempstring.dat,w)=NULL)if(fp=fopen(D:CCtempstring.dat,w)=NULL)printf(cant open file!n);printf(cant open file!n);printf(cant open file!n);printf(cant open fi