《C程序设计》课教学方案教师:序号17授课时间授课班级上课地点学习内容第10章对文件的输入输出课时4教学目标专业能力了解如何打开和关闭文件掌握如何读写数据了解如何对读写进行出错检查方法能力学会如何对数据进行读写社会能力提高逻辑思维能力目标群体普专教学环境多媒体教室教学方法理论教学与上机训练相结合,即学即练时间安排教学过程设计第一节10.1C文件的有关基本知识10.1.1什么是文件文件有不同的类型,在程序设计中,主要用到两种文件:(1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件的内容是程序代码。文件有不同的类型,在程序设计中,主要用到两种文件:(2)数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。本章主要讨论的是数据文件在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出到终端显示器上常常需要将一些数据输出到磁盘上保存起来,以后使用这就要用到磁盘文件操作系统把各种设备都统一作为文件处理从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如,终端键盘是输入文件显示屏和打印机是输出文件“文件”指存储在外部介质上数据的集合一批数据是以文件的形式存放在外部介质上的操作系统是以文件为单位对数据进行管理想找存放在外部介质上的数据,先按文件名找到所指定的文件,然后再从该文件读数据要向外部介质上存储数据也必须先建立一个文件(以文件名作为标志),才能向它输出数据“文件”指存储在外部介质上数据的集合一批数据是以文件的形式存放在外部介质上的操作系统是以文件为单位对数据进行管理想找存放在外部介质上的数据,先按文件名找到所指定的文件,然后再从该文件读数据要向外部介质上存储数据也必须先建立一个文件(以文件名作为标志),才能向它输出数据输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即数据流。流表示了信息从源到目的端的流动。输入操作时,数据从文件流向计算机内存输出操作时,数据从计算机流向文件无论是用Word打开或保存文件,还是C程序中的输入输出都是通过操作系统进行的“流”是一个传输通道,数据可以从运行环境流入程序中,或从程序流至运行环境从C程序的观点来看,无论程序一次读写一个字符,或一行文字,或一个指定的数据区,作为输入输出的各种文件或设备都是统一以逻辑数据流的方式出现的。C语言把文件看作是一个字符(或字节)的序列。一个输入输出流就是一个字符流或字节(内容为二进制数据)流。C的数据文件由一连串的字符(或字节)组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制,这就增加了处理的灵活性。这种文件称为流式文件。10.1.2文件名文件要有一个唯一的文件标识,以便用户识别和引用。文件标识包括三部分:(1)文件路径(2)文件名主干(3)文件后缀文件路径表示文件在外部存储设备中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面10.1.3文件的分类根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件第二节如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换ASCII文件又称文本文件,每一个字节放一个字符的ASCII代码字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储,也可以用二进制形式存储如有整数10000,如果用ASCII码形式输出到磁盘,则在磁盘中占5个字节(每一个字符占一个字节),而用二进制形式输出,则在磁盘上只占4个字节(用VC++C时)10.1.4文件缓冲区ANSIC标准采用“缓冲文件系统”处理数据文件所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)10.1.5文件类型指针缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE声明FILE结构体类型的信息包含在头文件“stdio.h”中一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量10.2打开与关闭文件10.2.1用fopen函数打开数据文件对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写所谓“关闭”是指撤销文件信息区和文件缓冲区fopen函数的调用方式为:fopen(文件名,使用文件方式);例如:fopen(“a1”,”r”);表示要打开名为“a1”的文件,使用文件方式为“读入”fopen函数的返回值是指向a1文件的指针通常将fopen函数的返回值赋给一个指向文件的指针变量。如:FILE*fp;fp=fopen(“a1”,”r”);fp和文件a1相联系,fp指向了a1文件在打开一个文件时,通知编译系统以下3个信息:①需要访问的文件的名字②使用文件的方式(“读”还是“写”等)③让哪一个指针变量指向被打开的文件第三节10.2.2用fclose函数关闭数据文件闭文件用fclose函数。fclose函数调用的一般形式为fclose(文件指针);例如:fclose(fp);如果不关闭文件将会丢失数据。10.3顺序读写数据文件在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面在顺序读时,先读文件中前面的数据,后读文件中后面的数据对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的顺序读写需要用库函数实现10.3.1怎样向文件读写字符读写一个字符的函数例10.1从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。解题思路:用fgetc函数从键盘逐个输入字符,然后用fputc函数写到磁盘文件。#includestdio.h#includestdlib.hintmain(){FILE*fp;charch,filename[10];printf(请输入所用的文件名:);scanf(%s,filename);if((fp=fopen(filename,“w”))==NULL){printf(无法打开此文件\n);exit(0);}ch=getchar();printf(“请输入一个字符串(以#结束):);ch=getchar();while(ch!=‘#’){fputc(ch,fp);putchar(ch);ch=getchar();}fclose(fp);putchar(10);return0;}10.3.2怎样向文件读写一个字符串读写一个字符串的函数说明:fgets函数的函数原型为:char*fgets(char*str,intn,FILE*fp);其作用是从文件读入一个字符串调用时可以写成:fgets(str,n,fp);fgets(str,n,fp);中n是要求得到的字符个数,但实际上只读n-1个字符,然后在最后加一个’\0’字符,这样得到的字符串共有n个字符,把它们放到字符数组str中如果在读完n-1个字符之前遇到换行符“\n”或文件结束符EOF,读入即结束,但将所遇到的换行符“\n”也作为一个字符读入执行fgets成功,返回str数组首地址,如果一开始就遇到文件尾或读数据错,返回NULLfputs函数的函数原型为:intfputs(char*str,FILE*fp);str指向的字符串输出到fp所指向的文件中调用时可以写成:fputs(″China”,fp);fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针字符串末尾的′\0′不输出输出成功,函数值为0;失败,函数值为EOF第四节10.3.3用格式化的方式读写文件一般调用方式为: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);10.3.4用二进制方式向文件读写一组数据buffer:是一个地址对fread来说,它是用来存放从文件读入的数据的存储区的地址对fwrite来说,是要把此地址开始的存储区中的数据向文件输出size:要读写的字节数count:要读写多少个数据项fp:FILE类型指针作业3教学反馈(注:单元格可合并、拆分)