《C语言程序设计PPT课件第13章文件操作.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计PPT课件第13章文件操作.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第13131313章章章章 文件操作文件操作文件操作文件操作2023/1/162/41本章学习内容本章学习内容 二进制文件和文本文件二进制文件和文本文件 文件的打开和关闭文件的打开和关闭 文件的文件的顺序读写与随机读写顺序读写与随机读写 标准输入输出及其重定向标准输入输出及其重定向2023/1/163/41Von J.Neumann Architecture输入输入/输出输出设备设备存储器存储器运算器运算器控制器控制器程序程序和输入数据和输入数据输出结果输出结果取出数据取出数据存入数据存入数据操作命令操作命令存取命令存取命令取出取出程序指令程序指令输入输出输入输出命令命令计算结果计算结果
2、CPU大脑大脑记忆装置记忆装置(Memory)眼睛和耳朵眼睛和耳朵(I/O devices)Where to put data in computer?Where to put data in computer?How to input or output data?How to input or output data?2023/1/164/41I/O设备设备 输入设备输入设备输入设备输入设备键盘、鼠标键盘、鼠标键盘、鼠标键盘、鼠标软盘、硬盘、光驱(以文件的形式)软盘、硬盘、光驱(以文件的形式)软盘、硬盘、光驱(以文件的形式)软盘、硬盘、光驱(以文件的形式)扫描仪、视频采集卡、电视卡、游戏杆
3、、话筒扫描仪、视频采集卡、电视卡、游戏杆、话筒扫描仪、视频采集卡、电视卡、游戏杆、话筒扫描仪、视频采集卡、电视卡、游戏杆、话筒 输出设备输出设备输出设备输出设备显示器、打印机显示器、打印机显示器、打印机显示器、打印机软盘、硬盘、软盘、硬盘、软盘、硬盘、软盘、硬盘、CD/DVD-RW CD/DVD-RW(以文件的形式)(以文件的形式)(以文件的形式)(以文件的形式)音箱音箱音箱音箱 单纯的输入设备或者单纯的输出设备越来越少单纯的输入设备或者单纯的输出设备越来越少单纯的输入设备或者单纯的输出设备越来越少单纯的输入设备或者单纯的输出设备越来越少2023/1/165/41标准输入标准输入/输出输出 字
4、符界面的操作系统一般都提供标准输入与输出字符界面的操作系统一般都提供标准输入与输出字符界面的操作系统一般都提供标准输入与输出字符界面的操作系统一般都提供标准输入与输出设备设备设备设备DOSDOS、LinuxLinux、UNIXUNIX 一般情况,标准输入就是键盘,标准输出就是终一般情况,标准输入就是键盘,标准输出就是终一般情况,标准输入就是键盘,标准输出就是终一般情况,标准输入就是键盘,标准输出就是终端显示器端显示器端显示器端显示器操作系统有能力重定向标准输入与输出,比如让文件操作系统有能力重定向标准输入与输出,比如让文件操作系统有能力重定向标准输入与输出,比如让文件操作系统有能力重定向标准输
5、入与输出,比如让文件作为标准输入(标准输出)作为标准输入(标准输出)作为标准输入(标准输出)作为标准输入(标准输出)这种重定向程序本身是感觉不到的这种重定向程序本身是感觉不到的这种重定向程序本身是感觉不到的这种重定向程序本身是感觉不到的自来水厂自来水厂2023/1/166/41DOS下的标准输入下的标准输入/输出重定向输出重定向 程序程序程序程序progprog如下如下如下如下main()main()charchar c;c;whilewhile(c=getchar()!=n)(c=getchar()!=n)putchar(+c);putchar(+c);输入重定向输入重定向输入重定向输入重定
6、向prog infile.txtprog outfile.txtprog outfile.txt2023/1/167/41流(流(Stream)计算机中的流的概念计算机中的流的概念计算机中的流的概念计算机中的流的概念一般称为数据流,也叫做字节流、比特流一般称为数据流,也叫做字节流、比特流一般称为数据流,也叫做字节流、比特流一般称为数据流,也叫做字节流、比特流 File stream(File stream(文件流文件流文件流文件流),Video stream(),Video stream(视频流视频流视频流视频流)and Audio stream()and Audio stream(音音音音频
7、流频流频流频流)in specific field.)in specific field.可以倒流的数据流可以倒流的数据流可以倒流的数据流可以倒流的数据流 如果你想重新读已经读过的数据,或者要修改已经写入的数据,如果你想重新读已经读过的数据,或者要修改已经写入的数据,如果你想重新读已经读过的数据,或者要修改已经写入的数据,如果你想重新读已经读过的数据,或者要修改已经写入的数据,可以发出流控(可以发出流控(可以发出流控(可以发出流控(Flow ControlFlow Control)命令)命令)命令)命令不会倒流的数据流也很多不会倒流的数据流也很多不会倒流的数据流也很多不会倒流的数据流也很多 网
8、络上的数据流。网络和数据线等介质只有很小的数据缓冲区,网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,没有大量存储的能力没有大量存储的能力没有大量存储的能力没有大量存储的能力 流的载体?流的载体?流的载体?流的载体?磁盘文件、终端显示器或打印机、磁盘文件、终端显示器或打印机、磁盘文件、终端显示器或打印机、磁盘文件、终端显示器或打印机、存储器存储器存储器存储器等等等等 2023/1/168/41外存外存 内存容易健忘,所以数据必须保存在内存容易健忘,所以数据必须保存在内存容易健
9、忘,所以数据必须保存在内存容易健忘,所以数据必须保存在“不健忘不健忘不健忘不健忘”的外的外的外的外存上存上存上存上磁盘(磁盘(磁盘(磁盘(Magnetic DisksMagnetic Disks)光盘(光盘(光盘(光盘(CDCD、DVDDVD)U U盘(盘(盘(盘(Flash MemoryFlash Memory).容量大、断电后数据不丢失,可重复使用,容量大、断电后数据不丢失,可重复使用,容量大、断电后数据不丢失,可重复使用,容量大、断电后数据不丢失,可重复使用,永久保存永久保存永久保存永久保存一般都以一般都以一般都以一般都以文件文件文件文件的形式给用户及应用程序使用的形式给用户及应用程序使
10、用的形式给用户及应用程序使用的形式给用户及应用程序使用2023/1/169/41文件(文件(File)文件文件文件文件一般指存储在外部介质上有名字的一组相关数据的集合一般指存储在外部介质上有名字的一组相关数据的集合一般指存储在外部介质上有名字的一组相关数据的集合一般指存储在外部介质上有名字的一组相关数据的集合用文件可长期保存数据,实现数据共享用文件可长期保存数据,实现数据共享用文件可长期保存数据,实现数据共享用文件可长期保存数据,实现数据共享在在在在C C C C语言中,文件可泛指磁盘文件、终端显示器或打印语言中,文件可泛指磁盘文件、终端显示器或打印语言中,文件可泛指磁盘文件、终端显示器或打印
11、语言中,文件可泛指磁盘文件、终端显示器或打印机机机机 程序中的文件程序中的文件程序中的文件程序中的文件在程序运行时在程序运行时在程序运行时在程序运行时由程序在磁盘上建立一个文件,通过写操由程序在磁盘上建立一个文件,通过写操由程序在磁盘上建立一个文件,通过写操由程序在磁盘上建立一个文件,通过写操作将数据存入该文件作将数据存入该文件作将数据存入该文件作将数据存入该文件由程序打开磁盘上的某个已有文件,并通过读操作将文由程序打开磁盘上的某个已有文件,并通过读操作将文由程序打开磁盘上的某个已有文件,并通过读操作将文由程序打开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存件中的数据读入内存件中的
12、数据读入内存件中的数据读入内存供程序使用供程序使用供程序使用供程序使用2023/1/1610/41文件(文件(Files)与流)与流(Streams)程序通过文件打开操作把流与设备联系起来,程序通过文件打开操作把流与设备联系起来,程序通过文件打开操作把流与设备联系起来,程序通过文件打开操作把流与设备联系起来,文件打开后,可在程序和文件之间交换数据文件打开后,可在程序和文件之间交换数据文件打开后,可在程序和文件之间交换数据文件打开后,可在程序和文件之间交换数据 程序通过文件关闭操作断开流与文件的联系程序通过文件关闭操作断开流与文件的联系程序通过文件关闭操作断开流与文件的联系程序通过文件关闭操作断
13、开流与文件的联系 所有流的性质都一样所有流的性质都一样所有流的性质都一样所有流的性质都一样因为流与设备无关,所以能写入磁盘文件的同一函因为流与设备无关,所以能写入磁盘文件的同一函因为流与设备无关,所以能写入磁盘文件的同一函因为流与设备无关,所以能写入磁盘文件的同一函数也能写入另一设备,如控制台终端等数也能写入另一设备,如控制台终端等数也能写入另一设备,如控制台终端等数也能写入另一设备,如控制台终端等 文件的能力则不同文件的能力则不同文件的能力则不同文件的能力则不同如磁盘文件支持随机存取,而键盘则不能如磁盘文件支持随机存取,而键盘则不能如磁盘文件支持随机存取,而键盘则不能如磁盘文件支持随机存取,
14、而键盘则不能2023/1/1611/41文件的存放(文件的存放(Storage)可以建立若干文件目录可以建立若干文件目录可以建立若干文件目录可以建立若干文件目录(directoryfolderdirectoryfolder文件夹文件夹文件夹文件夹)在目录里保存文件在目录里保存文件在目录里保存文件在目录里保存文件 同一级目录里保存的文件不能同名同一级目录里保存的文件不能同名同一级目录里保存的文件不能同名同一级目录里保存的文件不能同名 对使用者而言,只要知道文件的路对使用者而言,只要知道文件的路对使用者而言,只要知道文件的路对使用者而言,只要知道文件的路径径径径(pathpath,全目录全目录全目
15、录全目录)和文件名,就能使和文件名,就能使和文件名,就能使和文件名,就能使用该文件用该文件用该文件用该文件qqC:homeSunnermain.c C:homeSunnermain.c qq这都是托这都是托这都是托这都是托OSOS的福的福的福的福2023/1/1612/4113.1二进制文件和文本文件二进制文件和文本文件 文件的类型(文件的类型(文件的类型(文件的类型(Type of FilesType of Files)?)?)?)?二进制文件二进制文件二进制文件二进制文件是一种字节序列,没有字符变换是一种字节序列,没有字符变换是一种字节序列,没有字符变换是一种字节序列,没有字符变换按照数据
16、在内存中的存储形式(二进制)存储到文件按照数据在内存中的存储形式(二进制)存储到文件按照数据在内存中的存储形式(二进制)存储到文件按照数据在内存中的存储形式(二进制)存储到文件 如整数如整数如整数如整数12123 3,在内存占,在内存占,在内存占,在内存占2 2个字节,则文件中也占个字节,则文件中也占个字节,则文件中也占个字节,则文件中也占2 2个字节个字节个字节个字节 文本文件文本文件文本文件文本文件/ASCII/ASCII码文件码文件码文件码文件是一种字符序列,是一种字符序列,是一种字符序列,是一种字符序列,文件中存储每个字符的文件中存储每个字符的文件中存储每个字符的文件中存储每个字符的A
17、SCIIASCII码码码码 如整数如整数如整数如整数12123 3在文件中占在文件中占在文件中占在文件中占3 3个字节,分别存放这个字节,分别存放这个字节,分别存放这个字节,分别存放这3 3个字符的个字符的个字符的个字符的ASCIIASCII码码码码如果存如果存12341234呢?呢?2023/1/1613/41文件的格式(文件的格式(Format of Files)数据必须按照存入的类型读出,才能恢复其本来数据必须按照存入的类型读出,才能恢复其本来数据必须按照存入的类型读出,才能恢复其本来数据必须按照存入的类型读出,才能恢复其本来面貌面貌面貌面貌 公开的标准格式公开的标准格式公开的标准格式公
18、开的标准格式如如如如bmpbmp、tiftif、gifgif、jpgjpg和和mp3mp3等类型的文件,有大量软等类型的文件,有大量软等类型的文件,有大量软等类型的文件,有大量软件能生成和使用这些类型的文件件能生成和使用这些类型的文件件能生成和使用这些类型的文件件能生成和使用这些类型的文件 不公开或加密的文件格式不公开或加密的文件格式不公开或加密的文件格式不公开或加密的文件格式如如如如Microsoft WordMicrosoft Word的的的的docdoc格式就不公开,所以至今没有格式就不公开,所以至今没有格式就不公开,所以至今没有格式就不公开,所以至今没有WordWord以外的其他软件能
19、完美地读出以外的其他软件能完美地读出以外的其他软件能完美地读出以外的其他软件能完美地读出docdoc文件文件文件文件 2023/1/1614/41缓冲型和非缓冲型文件系统缓冲型和非缓冲型文件系统 缓冲型文件系统缓冲型文件系统缓冲型文件系统缓冲型文件系统指系统自动在内存中为每一个正在使用的文件开辟一个指系统自动在内存中为每一个正在使用的文件开辟一个指系统自动在内存中为每一个正在使用的文件开辟一个指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,在读写文件时,数据先送到缓冲区,再传给缓冲区,在读写文件时,数据先送到缓冲区,再传给缓冲区,在读写文件时,数据先送到缓冲区,再传给缓冲区,在读写文件
20、时,数据先送到缓冲区,再传给C C程序或外存上程序或外存上程序或外存上程序或外存上缓冲文型件系统利用文件指针标识文件缓冲文型件系统利用文件指针标识文件缓冲文型件系统利用文件指针标识文件缓冲文型件系统利用文件指针标识文件缓冲型文件系统中的文件操作,也称高级文件操作缓冲型文件系统中的文件操作,也称高级文件操作缓冲型文件系统中的文件操作,也称高级文件操作缓冲型文件系统中的文件操作,也称高级文件操作 高级文件操作函数高级文件操作函数高级文件操作函数高级文件操作函数是是是是ANSI CANSI C定义的文件操作函数,具定义的文件操作函数,具定义的文件操作函数,具定义的文件操作函数,具有跨平台和可移植的能
21、力有跨平台和可移植的能力有跨平台和可移植的能力有跨平台和可移植的能力 非缓冲型文件系统非缓冲型文件系统非缓冲型文件系统非缓冲型文件系统不会自动设置文件缓冲区,缓冲区需由程序员自己设定不会自动设置文件缓冲区,缓冲区需由程序员自己设定不会自动设置文件缓冲区,缓冲区需由程序员自己设定不会自动设置文件缓冲区,缓冲区需由程序员自己设定非缓冲型文件系统没有文件指针,它使用称为文件号的非缓冲型文件系统没有文件指针,它使用称为文件号的非缓冲型文件系统没有文件指针,它使用称为文件号的非缓冲型文件系统没有文件指针,它使用称为文件号的整数来标识文件整数来标识文件整数来标识文件整数来标识文件2023/1/1615/4
22、113.2文件的打开和关闭文件的打开和关闭 下面介绍的函数均定义在下面介绍的函数均定义在下面介绍的函数均定义在下面介绍的函数均定义在中中中中 FILE*fopen(FILE*fopen(constconst charchar*filename,*filename,constconst charchar*mode);*mode);FILE*fp=fopen(C:CONFIG.SYS,rw);FILE*fp=fopen(C:CONFIG.SYS,rw);filenamefilename是文件名是文件名是文件名是文件名 包含路径。如果不含路径,表示打开当前目录下的文件包含路径。如果不含路径,表示打开
23、当前目录下的文件包含路径。如果不含路径,表示打开当前目录下的文件包含路径。如果不含路径,表示打开当前目录下的文件 modemode是打开方式是打开方式是打开方式是打开方式 常用为常用为常用为常用为rr、ww、rwrw和和和和aa,分别表示只读、只写、读写和添加,分别表示只读、只写、读写和添加,分别表示只读、只写、读写和添加,分别表示只读、只写、读写和添加 rbrb表示只读二进制文件表示只读二进制文件表示只读二进制文件表示只读二进制文件 返回值为指向此文件的指针,留待以后使用返回值为指向此文件的指针,留待以后使用返回值为指向此文件的指针,留待以后使用返回值为指向此文件的指针,留待以后使用 如果打
24、开失败,返回值为如果打开失败,返回值为如果打开失败,返回值为如果打开失败,返回值为NULLNULL2023/1/1616/41文件打开方式(文件打开方式(文件打开方式(文件打开方式(modemode):):):):对应二进制文件对应二进制文件对应二进制文件对应二进制文件对应文本文件对应文本文件对应文本文件对应文本文件“r”r”只读只读只读只读 必须是已存在的文件必须是已存在的文件必须是已存在的文件必须是已存在的文件“w”w”只写只写只写只写 不论该文件是否存在,都新建一个文件不论该文件是否存在,都新建一个文件不论该文件是否存在,都新建一个文件不论该文件是否存在,都新建一个文件“a”a”追加追加
25、追加追加 向文本文件尾增加数据,该文件必须存在向文本文件尾增加数据,该文件必须存在向文本文件尾增加数据,该文件必须存在向文本文件尾增加数据,该文件必须存在“r+”r+”读写读写读写读写 打开一个已存在的文件,用于读写打开一个已存在的文件,用于读写打开一个已存在的文件,用于读写打开一个已存在的文件,用于读写“w+”w+”读写读写读写读写 建立一个新文件,可读可写建立一个新文件,可读可写建立一个新文件,可读可写建立一个新文件,可读可写“a+”a+”读写读写读写读写 向文件尾追加数据,也可读向文件尾追加数据,也可读向文件尾追加数据,也可读向文件尾追加数据,也可读 “rb”rb”“wb”wb”“ab”
26、ab”“rb+”“rb+”“wb+”“wb+”“ab+”“ab+”2023/1/1617/41文件指针文件指针(File Pointer)FILEFILE *fp;*fp;是是是是FILEFILE型指针变量,标识一个特定的磁盘文件型指针变量,标识一个特定的磁盘文件型指针变量,标识一个特定的磁盘文件型指针变量,标识一个特定的磁盘文件与文件相关联的每个流都有一个与文件相关联的每个流都有一个与文件相关联的每个流都有一个与文件相关联的每个流都有一个FILEFILE类型的控制结构,类型的控制结构,类型的控制结构,类型的控制结构,定义有关文件操作的信息,用户绝对不应修改定义有关文件操作的信息,用户绝对不应
27、修改定义有关文件操作的信息,用户绝对不应修改定义有关文件操作的信息,用户绝对不应修改 typedeftypedef structstruct shortshort level;level;/*/*缓冲区缓冲区缓冲区缓冲区 满满满满 或或或或 空空空空 的程度的程度的程度的程度*/unsignedunsigned flags;flags;/*/*文件状态标志文件状态标志文件状态标志文件状态标志*/charchar fd;fd;/*/*文件描述符文件描述符文件描述符文件描述符*/unsigned charunsigned char hold;hold;/*/*如无缓冲区不读字符如无缓冲区不读字符如
28、无缓冲区不读字符如无缓冲区不读字符*/shortshort bsize;bsize;/*/*缓冲区的大小缓冲区的大小缓冲区的大小缓冲区的大小*/unsigned charunsigned char*buffer*buffer;/*;/*数据缓冲区的位置数据缓冲区的位置数据缓冲区的位置数据缓冲区的位置*/unsigned charunsigned char*curp;*curp;/*/*指针当前的指向指针当前的指向指针当前的指向指针当前的指向*/unsigned unsigned istemp;istemp;/*/*临时文件指示器临时文件指示器临时文件指示器临时文件指示器*/shortshort
29、 token;token;/*/*用于有效性检查用于有效性检查用于有效性检查用于有效性检查*/FILEFILE;/*;/*在在在在stdio.hstdio.h文件中定义文件中定义文件中定义文件中定义*/2023/1/1618/4113.2文件的打开和关闭文件的打开和关闭 intint fclose(FILE*fp);fclose(FILE*fp);把遗留在缓冲区中的数据写入文件,实施操作系统级的把遗留在缓冲区中的数据写入文件,实施操作系统级的把遗留在缓冲区中的数据写入文件,实施操作系统级的把遗留在缓冲区中的数据写入文件,实施操作系统级的关闭操作关闭操作关闭操作关闭操作同时,释放与流联系的文件控
30、制块,以后可以重复使用同时,释放与流联系的文件控制块,以后可以重复使用同时,释放与流联系的文件控制块,以后可以重复使用同时,释放与流联系的文件控制块,以后可以重复使用这部分空间这部分空间这部分空间这部分空间多数情况下,系统限制同时处于打开状态的文件总数,多数情况下,系统限制同时处于打开状态的文件总数,多数情况下,系统限制同时处于打开状态的文件总数,多数情况下,系统限制同时处于打开状态的文件总数,因此,打开文件前先关闭无用文件是必要的因此,打开文件前先关闭无用文件是必要的因此,打开文件前先关闭无用文件是必要的因此,打开文件前先关闭无用文件是必要的 fclosefclose函数的返回值函数的返回值
31、函数的返回值函数的返回值当顺利地执行了关闭操作,返回值为当顺利地执行了关闭操作,返回值为当顺利地执行了关闭操作,返回值为当顺利地执行了关闭操作,返回值为0 0如果返回值为非零值,表示关闭时有错误如果返回值为非零值,表示关闭时有错误如果返回值为非零值,表示关闭时有错误如果返回值为非零值,表示关闭时有错误一般只有驱动器中无盘或盘空间不够时才失败,关闭失一般只有驱动器中无盘或盘空间不够时才失败,关闭失一般只有驱动器中无盘或盘空间不够时才失败,关闭失一般只有驱动器中无盘或盘空间不够时才失败,关闭失败会引起数据丢失、文件的破坏和程序中的随机错误败会引起数据丢失、文件的破坏和程序中的随机错误败会引起数据丢
32、失、文件的破坏和程序中的随机错误败会引起数据丢失、文件的破坏和程序中的随机错误2023/1/1619/4113.3按字符读写文件按字符读写文件 字符读写字符读写 intint fgetc(FILE*fp);fgetc(FILE*fp);从从从从fpfp读出一个字符读出一个字符读出一个字符读出一个字符,将位置指针指向下一个字符将位置指针指向下一个字符将位置指针指向下一个字符将位置指针指向下一个字符若读成功,则返回该字符,若读到文件尾,则返回若读成功,则返回该字符,若读到文件尾,则返回若读成功,则返回该字符,若读到文件尾,则返回若读成功,则返回该字符,若读到文件尾,则返回EOF(EOFEOF(EO
33、F是一个符号常量,在是一个符号常量,在是一个符号常量,在是一个符号常量,在stdio.hstdio.h中定义为中定义为中定义为中定义为-1)-1)intint fputc(fputc(intint c,FILE*fp);c,FILE*fp);向向向向fpfp输出字符输出字符输出字符输出字符c c若写入错误,则返回若写入错误,则返回若写入错误,则返回若写入错误,则返回EOFEOF,否则返回,否则返回,否则返回,否则返回c c2023/1/1620/4113.3按字符读写文件按字符读写文件【例例例例13.113.1】从键盘输入一串字符,转存到磁盘文件上从键盘输入一串字符,转存到磁盘文件上从键盘输入
34、一串字符,转存到磁盘文件上从键盘输入一串字符,转存到磁盘文件上为什么要判断文件打开是否成功呢?为什么要判断文件打开是否成功呢?2023/1/1621/41 【例【例【例【例13.213.2】将将将将01270127之间之间之间之间的的的的ASCIIASCII字符字符字符字符写到文件中,写到文件中,写到文件中,写到文件中,然后从文件然后从文件然后从文件然后从文件中读出并显中读出并显中读出并显中读出并显示到屏幕上示到屏幕上示到屏幕上示到屏幕上函数函数feof()检查是否到达文件尾,检查是否到达文件尾,当文件位置指针指向文件尾时,返当文件位置指针指向文件尾时,返回非回非0值,否则返回值,否则返回0值
35、值2023/1/1622/41 【例【例【例【例13.313.3】修改例修改例修改例修改例13.213.2,从文件中读从文件中读从文件中读从文件中读出字符时,出字符时,出字符时,出字符时,判断是否为判断是否为判断是否为判断是否为可打印字符,可打印字符,可打印字符,可打印字符,若是则显示若是则显示若是则显示若是则显示该字符,否该字符,否该字符,否该字符,否则显示其十则显示其十则显示其十则显示其十进制进制进制进制ASCIIASCII码码码码值值值值2023/1/1623/41 【例【例【例【例13.313.3】修改例修改例修改例修改例13.213.2,从文件中读从文件中读从文件中读从文件中读出字符
36、时,出字符时,出字符时,出字符时,判断是否为判断是否为判断是否为判断是否为可打印字符,可打印字符,可打印字符,可打印字符,若是则显示若是则显示若是则显示若是则显示该字符,否该字符,否该字符,否该字符,否则显示其十则显示其十则显示其十则显示其十进制进制进制进制ASCIIASCII码码码码值值值值为什么在输出第为什么在输出第128个字符的个字符的ASCII码值后又输出了一个码值后又输出了一个-1呢?呢?2023/1/1624/41 【例【例【例【例13.313.3】修改例修改例修改例修改例13.213.2,从文件中读从文件中读从文件中读从文件中读出字符时,出字符时,出字符时,出字符时,判断是否为判
37、断是否为判断是否为判断是否为可打印字符,可打印字符,可打印字符,可打印字符,若是则显示若是则显示若是则显示若是则显示该字符,否该字符,否该字符,否该字符,否则显示其十则显示其十则显示其十则显示其十进制进制进制进制ASCIIASCII码码码码值值值值为什么在输出第为什么在输出第128个字符的个字符的ASCII码值后又输出了一个码值后又输出了一个-1呢?呢?使用函数使用函数feof()时,仅当读到文件结束符时,仅当读到文件结束符时才能判断出到达文件尾,而文件结束符是时才能判断出到达文件尾,而文件结束符是一个值为一个值为-1的不可打印的控制字符的不可打印的控制字符if(!iscntrl(ch)202
38、3/1/1625/4113.3按字符读写文件按字符读写文件 字符串读写字符串读写 char char*fgets(*fgets(charchar*s,*s,intint n,FILE*fp);n,FILE*fp);从从从从fpfp所指的文件中读取字符串并在字符串末尾添加所指的文件中读取字符串并在字符串末尾添加所指的文件中读取字符串并在字符串末尾添加所指的文件中读取字符串并在字符串末尾添加00,然后存入,然后存入,然后存入,然后存入s s,最多读,最多读,最多读,最多读n-1n-1个字符个字符个字符个字符当读到回车换行符、文件末尾或读满当读到回车换行符、文件末尾或读满当读到回车换行符、文件末尾或
39、读满当读到回车换行符、文件末尾或读满n-1n-1个字符时,函个字符时,函个字符时,函个字符时,函数返回该字符串的首地址数返回该字符串的首地址数返回该字符串的首地址数返回该字符串的首地址特例:特例:特例:特例:fgets(buf,sizeof(buf),stdin);fgets(buf,sizeof(buf),stdin);int int fputs(fputs(constconst charchar*s,FILE*fp);*s,FILE*fp);将字符串写入文件中将字符串写入文件中将字符串写入文件中将字符串写入文件中若出现写入错误,则返回若出现写入错误,则返回若出现写入错误,则返回若出现写入错
40、误,则返回 EOFEOF,否则返回一个非负数,否则返回一个非负数,否则返回一个非负数,否则返回一个非负数2023/1/1626/4113.3按字符读写文件按字符读写文件 【例例例例13.413.4】用用用用fgetsfgets()()改写例改写例改写例改写例13.113.1程序,从键盘程序,从键盘程序,从键盘程序,从键盘输入输入输入输入一串字符,一串字符,一串字符,一串字符,添加到文本文添加到文本文添加到文本文添加到文本文件件件件demo.txtdemo.txt的的的的末尾。假设文末尾。假设文末尾。假设文末尾。假设文本文件本文件本文件本文件demo.txtdemo.txt中中中中已已已已有内容
41、为:有内容为:有内容为:有内容为:I I am a am a student.student.2023/1/1627/4113.4按格式读写文件按格式读写文件 格式化读写格式化读写intint fscanf(FILE*fp,fscanf(FILE*fp,constconst charchar*format,.);*format,.);fscanf(fp,%d,%6.2f,&i,&t);fscanf(fp,%d,%6.2f,&i,&t);第第第第1 1个参数为文件指针,第个参数为文件指针,第个参数为文件指针,第个参数为文件指针,第2 2 个参数为格式控制参数,第个参数为格式控制参数,第个参数为格
42、式控制参数,第个参数为格式控制参数,第3 3 个参数为地址参数表列个参数为地址参数表列个参数为地址参数表列个参数为地址参数表列intint fprintf(FILE*fp,fprintf(FILE*fp,constconst charchar*format,.);*format,.);fprintf(fp,%d,%6.2f,i,t);fprintf(fp,%d,%6.2f,i,t);第第第第1 1个参数为文件指针,第个参数为文件指针,第个参数为文件指针,第个参数为文件指针,第2 2 个参数为格式控制参数,第个参数为格式控制参数,第个参数为格式控制参数,第个参数为格式控制参数,第3 3 个参数为
43、输出参数表列个参数为输出参数表列个参数为输出参数表列个参数为输出参数表列2023/1/1628/41将平均分作为将平均分作为STUDENT结构体的成员,使函数的结构体的成员,使函数的接口更简洁接口更简洁 【例例例例13.513.5】修改例修改例修改例修改例12.712.7程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的4 4门课程的平均门课程的平均门课程的平均门课程的平均分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件score.txtscore.txt中中中
44、中2023/1/1629/41 【例例例例13.513.5】修改例修改例修改例修改例12.712.7程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的4 4门课程的平均门课程的平均门课程的平均门课程的平均分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件score.txtscore.txt中中中中2023/1/1630/41 【例例例例13.513.5】修改例修改例修改例修改例12.712.7程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的程序,计算每
45、个学生的4 4门课程的平均门课程的平均门课程的平均门课程的平均分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件score.txtscore.txt中中中中2023/1/1631/41 【例例例例13.513.5】修改例修改例修改例修改例12.712.7程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的程序,计算每个学生的4 4门课程的平均门课程的平均门课程的平均门课程的平均分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到文件分,将学生的各科成绩及平均分输出到
46、文件分,将学生的各科成绩及平均分输出到文件score.txtscore.txt中中中中2023/1/1632/41 【例【例【例【例13.613.6】在例】在例】在例】在例13.513.5基础上,基础上,基础上,基础上,从文件从文件从文件从文件score.txtscore.txt中中中中读出每个学生读出每个学生读出每个学生读出每个学生的的的的4 4门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分2023/1/1633/41 【例【例【例【例13.613.6】在例】在例】在例】在例13.513.5基础上,基础上,基础上,基础
47、上,从文件从文件从文件从文件score.txtscore.txt中中中中读出每个学生读出每个学生读出每个学生读出每个学生的的的的4 4门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分门课的平均分,各科成绩及平均分2023/1/1634/4113.5按数据块读写文件按数据块读写文件 按数据块读写按数据块读写从从从从fpfp所指的文件中读取数据块并存储到所指的文件中读取数据块并存储到所指的文件中读取数据块并存储到所指的文件中读取数据块并存储到bufferbuffer指向的指向的指向的指向的内存中内存中内存中内存中bufferbuffer是待读入数块据的起始
48、地址是待读入数块据的起始地址是待读入数块据的起始地址是待读入数块据的起始地址sizesize是每个数据块的大小是每个数据块的大小是每个数据块的大小是每个数据块的大小(待读入的每个数据块的字节待读入的每个数据块的字节待读入的每个数据块的字节待读入的每个数据块的字节数数数数)countcount是最多允许读取的数据块个数是最多允许读取的数据块个数是最多允许读取的数据块个数是最多允许读取的数据块个数(每个数据块每个数据块每个数据块每个数据块sizesize个字节个字节个字节个字节)返回实际读到的数据块个数返回实际读到的数据块个数返回实际读到的数据块个数返回实际读到的数据块个数将将将将bufferbu
49、ffer指向的内存中的数据块写入指向的内存中的数据块写入指向的内存中的数据块写入指向的内存中的数据块写入fpfp所指的文件所指的文件所指的文件所指的文件2023/1/1635/41【例例例例13.713.7】在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的4 4门课程门课程门课程门课程的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件student.txtstudent.txt中,然
50、后再从文件中读出数据并显示到屏幕上中,然后再从文件中读出数据并显示到屏幕上中,然后再从文件中读出数据并显示到屏幕上中,然后再从文件中读出数据并显示到屏幕上2023/1/1636/41【例例例例13.713.7】在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的在前几个实例基础上,计算每个学生的4 4门课程门课程门课程门课程的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件的平均分,将学生的各科成绩及平均分输出到文件student.txtstudent.txt中,