C语言程序设计基础与实训教程 第11章

上传人:E**** 文档编号:89385832 上传时间:2019-05-24 格式:PPT 页数:41 大小:154.50KB
返回 下载 相关 举报
C语言程序设计基础与实训教程 第11章_第1页
第1页 / 共41页
C语言程序设计基础与实训教程 第11章_第2页
第2页 / 共41页
C语言程序设计基础与实训教程 第11章_第3页
第3页 / 共41页
C语言程序设计基础与实训教程 第11章_第4页
第4页 / 共41页
C语言程序设计基础与实训教程 第11章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言程序设计基础与实训教程 第11章》由会员分享,可在线阅读,更多相关《C语言程序设计基础与实训教程 第11章(41页珍藏版)》请在金锄头文库上搜索。

1、第1页,第11章,文 件,第2页,主要内容,C文件概述 文件类型指针 文件的打开和关闭 文件的读写 文件的定位 出错的检测 文件输入输出小结,第3页,11.1 C文件概述,文件(file)是程序设计中一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在于外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。,第4页,11.1 C文件概述,以前各章中所用到的输入和输出,都是以

2、终端键盘输入数据,运行结果输出到终端上。从操作系统的角度看,每一个与主机相连的输入输出设备都看作是一个文件。例如,终端键盘是输入文件,显示屏和打印机是输出文件。 在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就是要用到磁盘文件。,第5页,11.1 C文件概述,C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中

3、的存储形式原样输出到磁盘上存放。如果有一个整数10000,在内存中占2个字节,如果按ASCII码形式输出,则占5个字节,而按二进制形式输出,在磁盘上只占2个字节,如图11-1所示。用ASCII码形式输出与字符一一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。用二进制形式输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上以后又需要输入到内存的,常用二进制文件保存。,第6页,11.2 文件类型指针,缓冲文件系统中,关键的概

4、念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。Turbo C在stdio.h文件中有以下的文件类型声明。,第7页,11.2 文件类型指针,typedef struct short level; /*缓冲区“满”或“空”的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读取字符*/ short bsize; /*缓冲区的大小*/ un

5、signed char *buffer; /*数据缓冲区的位置*/ unsigned ar *curp; /*指针,当前的指向*/ unsigned istemp; /*临时文件,指示器*/ short token; /*用于有效性检查*/ FILE;,第8页,11.2 文件类型指针,有了结构体FILE类型之后,可以用它来定义若干个 FILE类型的变量,以便存放若干个文件的信息。例 如,可以定义以下FILE类型的数组。 FILE f5; 定义了一个结构体数组f,它有5个元素,可以用来 存放5个文件的信息。 可以定义文件型指针变量,如: FILE *fp;,第9页,11.2 文件类型指针,fp是

6、一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。如果有n个文件,一般应设n个指针变量(指向FILE类型结构体的指针变量),使它们分别指向n个文件(确切地说指向存放该文件信息的结构体变量),以实现对文件的访问。,第10页,11.3 文件的打开和关闭,文件的打开(fopen函数) 文件的关闭(fclose函数),第11页,11.3.1 文件的打开(fopen函数),ANSI C规定了标准输入输出函数库,用fopen函数来实现文 件的打开。fopen函数的调用方式通常为: F

7、ILE *fp; fp=fopen(文件名,使用文件方式); 例如: fp=fopen(“a1“,“r“); 它表示要打开名字为a1的文件,使用文件方式为“读入”(r代表read,即读入),fopen函数带回指向a1文件的指针并赋给fp,这样fp就和文件a1相联系了,或者说,fp指向a1文件。可以看出,在打开一个文件时,将通知编译系统以下3个信息:需要打开的文件名,也就是准备访问的文件的名字;使用文件的方式(“读”还是“写”等);让哪一个指针变量指向被打开的文件。,第12页,使用文件的方式,第13页,11.3.1 文件的打开(fopen函数),说明: 用r方式打开的文件只能用于向计算机输入而不

8、能用作向该文件输出数据,而且该文件应该已经存在,不能用r方式打开一个并不存在的文件(即输入文件),否则出错。 用w方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。,第14页,11.3.1 文件的打开(fopen函数),如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用a方式打 开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件的末尾。 用r+、w+、a+方式打开的文件既可以用来输入

9、数据,也可以用来输出数据。用r+方式时,该文件必须已经存在,以便能向计算机输入数据;用w+方式则新建立一个文件,先向此文件写入数据,然后可以读此文件中的数据;用a+方式打开的文件,原来的文件不被删除,位置指针移到文件末尾,可以添加,也可以读取。 如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用r方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针NULL(NULL在stdio.h文件中已被定义为0)。 常用下面的方法打开一个文件: if(fp=fopen(“file1“,“r“)=NULL) printf(“ca

10、nnot open this filen“); exit(0); ,第15页,11.3.1 文件的打开(fopen函数),即先检查打开的操作是否出错,如果有错就在终端上输出“cannot open this file”。exit函数的作用是关闭所有文件,终止正在调用的过程。待用户检查出错误,修改后再运行。 用以上方式可以打开文本文件或二进制文件,这是ANSI C的规定,用同一种缓冲文件系统来处理文本文件和二进制文件。但目前使用的有些C编译系统可能不完全提供所有这些功能(例如有的只能用r、w、a方式),有的C版本不用r+、w+、a+,而用rw、wr、ar等,注意所用系统的规定。,第16页,11.

11、3.1 文件的打开(fopen函数),在向计算机输入文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。,第17页,11.3.1 文件的打开(fopen函数),在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此以前我们所用到的从终端输入或输出都不需要打开终端文件。系统自动定义了3个文件指针stdin、stdout和stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。如果程序中指定要从

12、stdin所指的文件输入数据,就是指从终端键盘输入数据。,第18页,11.3.2 文件的关闭(fclose函数),在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。 用fclose函数关闭文件,其调用的一般形式为: fclose(文件指针);,第19页,11.3.2 文件的关闭(fclose函数),前面把打开文件(用fopen函数)时所带回的指针变量赋给了fp,现在通过fp把该文件关闭,即fp不再指向该文件。 应该养成在程序终

13、止之前关闭所有文件的习惯,如果不关闭文件将会丢失数据。因为,如前面讲述的,在向文件写数据时,是先将数据输到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。,第20页,11.4 文件的读写,fputc函数和fgetc函数(putc函数和getc函数) fread函数和fwrite函数 fprintf函数和fscanf函数 其他读写函数,第21页,11.4.1 fputc函数和fgetc函数(putc函数和getc函数),fputc函数

14、fgetc函数 fputc和fgetc函数使用举例,第22页,11.4.2 fread函数和fwrite函数,getc和putc函数可以用来读写文件中的一个字符,但是常常要求一次读 入一组数据(例如,一个实数或一个结构体变量的值),ANSI C标准 提出设置 两个函数(fread和fwrite),用来读写一个数据块。它们的一般调用形式如下: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 其中: buffer:是一个指针。对fread来说,它是读入数据的存放地址;对fwrite来说是要输出数据的地址(以上指的是起始地址)。

15、size:要读写的字节数。 count:要进行读写多少个size字节的数据项。 fp:文件型指针。 如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息,如: fread(f,4,2,fp);,第23页,11.4.2 fread函数和fwrite函数,其中f是一个实型数组名。一个实型变量占4个字节。 这个函数从fp所指向的文件读入2次(每次4个字节) 数据,存储到数组f中。 如果有一个如下的结构体类型: struct student char name10; int num; int age; char addr30; stud40;,第24页,11.4.2 fre

16、ad函数和fwrite函数,结构体数组stud有40个元素,每一个元素用来存放一个学生 的数据(包括姓名、学号、年龄、地址)。假设学生的数 据已存放在磁盘文件中,可以用下面的for语句和fread函数 读入40个学生的数据: for(i=0;i40;i+) fread( 如果fread或fwrite调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。,第25页,11.4.3 fprintf函数和fscanf函数,fprintf函数、fscanf函数与printf函数、scanf函数作用相似,都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对象不是终端,而是磁盘文件。它们的一般调用方式为: fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列); 例如: fprintf(fp,“%d,%6.2f“,i,t); 它的作用是将整型变量i和实型变量t的值按%d和%6.2f的格式输出到f

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号