下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 第10章 对文件的输入输出

第10章 对文件的输入输出.ppt

第10章 对文件的输入输出

150*****852@sina.cn
2012-12-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《第10章 对文件的输入输出ppt》,可适用于高等教育领域

第章对文件的输入输出第章对文件的输入输出C文件的有关基本知识打开与关闭文件顺序读写数据文件随机读写数据文件文件读写的出错检测C文件的有关基本知识C文件的有关基本知识什么是文件文件名文件的分类文件缓冲区文件类型指针什么是文件什么是文件文件有不同的类型在程序设计中主要用到两种文件:()程序文件。包括源程序文件(后缀为c)、目标文件(后缀为obj)、可执行文件(后缀为exe)等。这种文件的内容是程序代码。什么是文件什么是文件文件有不同的类型在程序设计中主要用到两种文件:()数据文件。文件的内容不是程序而是供程序运行时读写的数据如在程序运行过程中输出到磁盘(或其他外部设备)的数据或在程序运行过程中供读入的数据。如一批学生的成绩数据或货物交易的数据等。本章主要讨论的是数据文件什么是文件什么是文件在以前各章中所处理的数据的输入和输出从终端的键盘输入数据运行结果输出到终端显示器上常常需要将一些数据输出到磁盘上保存起来以后使用这就要用到磁盘文件什么是文件什么是文件操作系统把各种设备都统一作为文件处理从操作系统的角度看每一个与主机相联的输入输出设备都看作是文件。例如终端键盘是输入文件显示屏和打印机是输出文件什么是文件什么是文件“文件”指存储在外部介质上数据的集合一批数据是以文件的形式存放在外部介质上的操作系统是以文件为单位对数据进行管理想找存放在外部介质上的数据先按文件名找到所指定的文件然后再从该文件读数据要向外部介质上存储数据也必须先建立一个文件(以文件名作为标志)才能向它输出数据什么是文件什么是文件输入输出是数据传送的过程数据如流水一样从一处流向另一处因此常将输入输出形象地称为流(stream)即数据流。流表示了信息从源到目的端的流动。什么是文件什么是文件输入操作时数据从文件流向计算机内存输出操作时数据从计算机流向文件无论是用Word打开或保存文件还是C程序中的输入输出都是通过操作系统进行的“流”是一个传输通道数据可以从运行环境流入程序中或从程序流至运行环境什么是文件什么是文件从C程序的观点来看无论程序一次读写一个字符或一行文字或一个指定的数据区作为输入输出的各种文件或设备都是统一以逻辑数据流的方式出现的。C语言把文件看作是一个字符(或字节)的序列。一个输入输出流就是一个字符流或字节(内容为二进制数据)流。什么是文件什么是文件C的数据文件由一连串的字符(或字节)组成而不考虑行的界限两行数据间不会自动加分隔符对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制这就增加了处理的灵活性。这种文件称为流式文件。文件名文件名文件要有一个唯一的文件标识以便用户识别和引用。文件标识包括三部分:()文件路径()文件名主干()文件后缀文件名文件名文件路径表示文件在外部存储设备中的位置。如:D:CCtempfiledat表示filedat文件存放在D盘中的CC目录下的temp子目录下面文件路径文件名主干文件后缀文件名文件名文件路径表示文件在外部存储设备中的位置。如:D:CCtempfiledat表示filedat文件存放在D盘中的CC目录下的temp子目录下面文件名文件名文件名文件路径表示文件在外部存储设备中的位置。如:D:CCtempfiledat表示filedat文件存放在D盘中的CC目录下的temp子目录下面命名规则遵循标识符的命名规则文件名文件名文件路径表示文件在外部存储设备中的位置。如:D:CCtempfiledat表示filedat文件存放在D盘中的CC目录下的temp子目录下面一般不超过个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)文件的分类文件的分类根据数据的组织形式数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储的如果不加转换地输出到外存就是二进制文件如果要求在外存上以ASCII代码形式存储则需要在存储前进行转换ASCII文件又称文本文件每一个字节放一个字符的ASCII代码文件的分类文件的分类字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储也可以用二进制形式存储如有整数如果用ASCII码形式输出到磁盘则在磁盘中占5个字节(每一个字符占一个字节)而用二进制形式输出则在磁盘上只占个字节(用VCC时)文件的分类文件的分类()()()()()ASCII形式二进制形式()文件缓冲区文件缓冲区ANSIC标准采用“缓冲文件系统”处理数据文件所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区文件缓冲区文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区)然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)文件缓冲区文件缓冲区程序数据区输出文件缓冲区输入文件缓冲区磁盘从内存向磁盘输出数据装满缓冲区文件缓冲区文件缓冲区程序数据区输出文件缓冲区输入文件缓冲区磁盘从磁盘向计算机读入数据充满缓冲区文件类型指针文件类型指针缓冲文件系统中关键的概念是“文件类型指针”简称“文件指针”每个被使用的文件都在内存中开辟一个相应的文件信息区用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的取名为FILE文件类型指针文件类型指针声明FILE结构体类型的信息包含在头文件“stdioh”中一般设置一个指向FILE类型变量的指针变量然后通过它来引用这些FILE类型变量文件类型指针文件类型指针FILE *fp,*fp,*fp文件f的文件信息区fp文件f的文件信息区fp文件f的文件信息区fp打开与关闭文件打开与关闭文件用fopen函数打开数据文件用fclose函数关闭数据文件用fopen函数打开数据文件用fopen函数打开数据文件对文件读写之前应该“打开”该文件在使用结束之后应“关闭”该文件。所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。用fopen函数打开数据文件用fopen函数打开数据文件在编写程序时在打开文件的同时一般都指定一个指针变量指向该文件也就是建立起指针变量与文件之间的联系这样就可以通过该指针变量对文件进行读写所谓“关闭”是指撤销文件信息区和文件缓冲区用fopen函数打开数据文件用fopen函数打开数据文件fopen函数的调用方式为:fopen(文件名,使用文件方式)例如:fopen(“a”,”r”)表示要打开名为“a”的文件使用文件方式为“读入”fopen函数的返回值是指向a文件的指针用fopen函数打开数据文件用fopen函数打开数据文件通常将fopen函数的返回值赋给一个指向文件的指针变量。如:FILE*fpfp=fopen(“a”,”r”)fp和文件a相联系fp指向了a文件用fopen函数打开数据文件用fopen函数打开数据文件在打开一个文件时通知编译系统以下个信息:①需要访问的文件的名字②使用文件的方式(“读”还是“写”等)③让哪一个指针变量指向被打开的文件使用文件方式参见教材表。说明:()用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据而且该文件应该已经存在并存有数据这样程序才能从文件中读数据。不能用“r”方式打开一个并不存在的文件否则出错。说明:()用“w”方式打开的文件只能用于向该文件写数据(即输出文件)而不能用来向计算机输入。如果原来不存在该文件则在打开文件前新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件则在打开文件前先将该文件删去然后重新建立一个新文件。说明:()如果希望向文件末尾添加新的数据(不希望删除原有数据)则应该用“a”方式打开但此时应保证该文件已存在否则将得到出错信息。打开文件时文件读写标记移到文件末尾说明:()用r、w、a方式打开的文件既可以用来输入数据也可以用来输出数据。用r方式时该文件应该已经存在。用w方式则新建立一个文件先向此文件写数据然后可以读此文件中的数据。用a方式打开的文件原来的文件不被删去文件读写位置标记移到文件末尾可以添加也可以读。说明:()如果打开失败fopen函数将会带回一个出错信息。fopen函数将带回一个空指针值常用下面的方法打开一个文件:if((fp=fopen(“file”,’r″))==) {printf(“cannotopenthisfilen”)exit() }终止正在执行的程序说明:()C标准建议用表列出的文件使用方式打开文本文件或二进制文件但目前使用的有些C编译系统可能不完全提供所有这些功能说明:()计算机输从ASCII文件读入字符时遇到回车换行符系统把它转换为一个换行符在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时不进行这种转换在内存中的数据形式与输出到外部文件中的数据形式完全一致一一对应。说明:()程序中可以使用个标准的流文件:标准输入流、标准输出流、标准出错输出流。系统已对这个文件指定了与终端的对应关系标准输入流是从终端的输入标准输出流是向终端的输出标准出错输出流是当程序出错时将出错信息发送到终端程序开始运行时系统自动打开这个标准流文件。因此程序编写者不需要在程序中用fopen函数打开它们。所以以前我们用到的从终端输入或输出到终端都不需要打开终端文件。用fclose函数关闭数据文件用fclose函数关闭数据文件关闭文件用fclose函数。fclose函数调用的一般形式为fclose(文件指针)例如:fclose(fp)如果不关闭文件将会丢失数据。顺序读写数据文件顺序读写数据文件在顺序写时先写入的数据存放在文件中前面后写入的数据存放在文件中后面在顺序读时先读文件中前面的数据后读文件中后面的数据对顺序读写来说对文件读写数据的顺序和数据在文件中的物理顺序是一致的顺序读写需要用库函数实现顺序读写数据文件顺序读写数据文件怎样向文件读写字符怎样向文件读写一个字符串用格式化的方式读写文件用二进制方式向文件读写一组数据怎样向文件读写字符怎样向文件读写字符读写一个字符的函数例从键盘输入一些字符逐个把它们送到磁盘上去直到用户输入一个“#”为止。解题思路:用fgetc函数从键盘逐个输入字符然后用fputc函数写到磁盘文件即可。#include<stdioh>#include<stdlibh>intmain(){FILE*fpcharch,filenameprintf("请输入所用的文件名:")scanf("s",filename)if((fp=fopen(filename,“w”))==){printf("无法打开此文件n")exit()}ch=getchar()接收最后输入的回车符输入文件名只写用exit函数时加printf(“请输入一个字符串(以#结束):")ch=getchar()while(ch!=‘#’){fputc(ch,fp)putchar(ch)ch=getchar()}fclose(fp)putchar()return}例将一个磁盘文件中的信息复制到另一个磁盘文件中。今要求将上例建立的filedat文件中的内容复制到另一个磁盘文件filedat中。解题思路:处理此问题的算法是:从filedat文件中逐个读入字符然后逐个输出到filedat中。#include<stdioh>#include<stdlibh>intmain(){FILE*in,*outcharch,infile,oileprintf("输入读入文件的名字:")scanf("s",infile)printf("输入输出文件的名字:")scanf(“s”,oile)if((in=fopen(infile,“r”))==){printf("无法打开此文件n")exit()}if((out=fopen(oile,“w”))==){printf("无法打开此文件n")exit()}改为rb和wb则复制一个二进制文件改为rb和wb则复制一个二进制文件while(!feof(in)){ch=fgetc(in)fputc(ch,out)putchar(ch)}putchar()fclose(in)fclose(out)return}检查当前读写位置是否移到文件末尾怎样向文件读写一个字符串怎样向文件读写一个字符串读写一个字符串的函数说明:fgets函数的函数原型为:char*fgets(char*str,intn,FILE*fp)其作用是从文件读入一个字符串调用时可以写成:fgets(str,n,fp)说明:fgets(str,n,fp)中n是要求得到的字符个数但实际上只读n个字符然后在最后加一个’’字符这样得到的字符串共有n个字符把它们放到字符数组str中如果在读完n个字符之前遇到换行符“n”或文件结束符EOF读入即结束但将所遇到的换行符“n”也作为一个字符读入执行fgets成功返回str数组首地址如果一开始就遇到文件尾或读数据错返回说明:fputs函数的函数原型为:intfputs(char*str,FILE*fp)str指向的字符串输出到fp所指向的文件中调用时可以写成:fputs(″China”,fp)fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针字符串末尾的′′不输出输出成功函数值为0失败函数值为EOF例从键盘读入若干个字符串对它们按字母大小的顺序排序然后把排好序的字符串送到磁盘文件中保存。解题思路:为解决问题可分为三个步骤:从键盘读入n个字符串存放在一个二维字符数组中每一个一维数组存放一个字符串对字符数组中的n个字符串按字母顺序排序排好序的字符串仍存放在字符数组中将字符数组中的字符串顺序输出。#include<stdioh>#include<stdlibh>#include<stringh>intmain(){FILE*fpcharstr,tempinti,j,k,n=printf(“Enterstrings:n”)for(i=i<ni)gets(stri)for(i=i<ni){k=ifor(j=ij<nj)if(strcmp(strk,strj)>)k=jif(k!=i){strcpy(temp,stri)strcpy(stri,strk)strcpy(strk,temp)}}if((fp=fopen(“D:CCstringdat”,“w”))==){printf("can'topenfile!n")exit()}printf("nThenewsequence:n")for(i=i<ni){fputs(stri,fp)fputs(“n”,fp)printf(“sn”,stri)}return}人为地输出一个’n’思考:从文件stringdat中读回字符串并在屏幕上显示应如何编写程序?#include<stdioh>#include<stdlibh>intmain(){FILE*fpcharstrinti=if((fp=fopen(“D:CCstringdat”,“r”))==){printf("can'topenfile!n")exit()}while(fgets(stri,,fp)!=){printf("s",stri)i}fclose(fp)return}不用人为地输出’n’用格式化的方式读写文件用格式化的方式读写文件一般调用方式为:fprintf(文件指针,格式字符串,输出表列)fscanf(文件指针,格式字符串,输入表列)如:fprintf(fp,”d,f”,i,f)fscanf(fp,”d,f”,i,f)用二进制方式向文件读写一组数据用二进制方式向文件读写一组数据一般调用形式为:fread(buffersizecountfp)fwrite(buffersizecountfp)用二进制方式向文件读写一组数据用二进制方式向文件读写一组数据buffer:是一个地址对fread来说它是用来存放从文件读入的数据的存储区的地址对fwrite来说是要把此地址开始的存储区中的数据向文件输出size:要读写的字节数count:要读写多少个数据项fp:FILE类型指针例从键盘输入个学生的有关数据然后把它们转存到磁盘文件上去。解题思路:定义有个元素的结构体数组用来存放个学生的数据从main函数输入个学生的数据用save函数实现向磁盘输出学生数据用fwrite函数一次输出一个学生的数据#include<stdioh>#defineSIZEstructStudenttype{charnameintnumintagecharaddr}studSIZEvoidsave(){FILE*fpintiif((fp=fopen("studat","wb"))==){printf("cannotopenfilen")return}for(i=i<SIZEi)if(fwrite(studi,sizeof(structStudenttype),,fp)!=)printf("filewriteerrorn")fclose(fp)}=实际上开辟字节是的倍数当前路径下的文件intmain(){intiprintf(“enterdataofstudents:n")for(i=i<SIZEi)scanf("sdds",studiname,studinum,studiage,studiaddr)save()return}为了验证在磁盘文件“studat”中是否已存在此数据可以用以下程序从“studat”文件中读入数据然后在屏幕上输出。#include<stdioh>#include<stdlibh>#defineSIZEstructStudenttype{charnameintnumintagecharaddr}studSIZEintmain(){intiFILE*fpif((fp=fopen("studat","rb"))==){printf("cannotopenfilen")exit()}for(i=i<SIZEi){fread(studi,sizeof(structStudenttype),,fp)printf(“sddsn”,studiname,studinum,studiage,studiaddr)}fclose(fp)return}如果修改例:从已有的二进制文件“stulist”中读入数据并输出到“studat”文件中应如何修改程序?解题思路:编写load函数main函数中再调用load函数voidload(){FILE*fpintiif((fp=fopen("stulist","rb"))==){printf("cannotopeninfilen")return}for(i=i<SIZEi)if(fread(studi,sizeof(structstudenttype),,fp)!=){if(feof(fp)){fclose(fp)return}printf("filereaderrorn")}fclose(fp)}intmain(){load()  save()return}随机读写数据文件随机读写数据文件对文件进行顺序读写比较容易理解也容易操作但有时效率不高随机访问不是按数据在文件中的物理位置次序进行读写而是可以对任何位置上的数据进行访问显然这种方法比顺序访问效率高得多随机读写数据文件随机读写数据文件文件位置标记及其定位随机读写文件位置标记及其定位文件位置标记及其定位文件位置标记为了对读写进行控制系统为每个文件设置了一个文件读写位置标记(简称文件标记)用来指示“接下来要读写的下一个字符的位置”文件位置标记及其定位文件位置标记及其定位文件指针读写当前位置文件尾文件位置标记文件头文件位置标记及其定位文件位置标记及其定位文件位置标记一般情况下在对字符文件进行顺序读写时文件标记指向文件开头进行读的操作时就读第一个字符然后文件标记向后移一个位置在下一次读操作时就将位置标记指向的第二个字符读入。依此类推直到遇文件尾结束文件位置标记及其定位文件位置标记及其定位文件位置标记如果是顺序写文件则每写完一个数据后文件标记顺序向后移一个位置然后在下一次执行写操作时把数据写入指针所指的位置。直到把全部数据写完此时文件位置标记在最后一个数据之后文件位置标记及其定位文件位置标记及其定位文件位置标记可以根据读写的需要人为地移动了文件标记的位置。文件标记可以向前移、向后移移到文件头或文件尾然后对该位置进行读写随机读写随机读写可以在任何位置写入数据在任何位置读取数据文件位置标记及其定位文件位置标记及其定位文件位置标记的定位可以强制使文件位置标记指向指定的位置可以用以下函数实现:()用rewind函数使文件标记指向文件开头rewind函数的作用是使文件标记重新返回文件的开头此函数没有返回值。例有一个磁盘文件内有一些信息。要求第一次将它的内容显示在屏幕上第二次把它复制到另一文件上。解题思路:因为在第一次读入完文件内容后文件标记已指到文件的末尾如果再接着读数据就遇到文件结束标志feof函数的值等于(真)无法再读数据必须在程序中用rewind函数使位置指针返回文件的开头#include<stdioh>intmain(){FILE*fp,*fpfp=fopen(“filedat”,“r”)fp=fopen(“filedat”,“w”)while(!feof(fp))putchar(getc(fp))putchar()rewind(fp)while(!feof(fp))putc(getc(fp),fp)fclose(fp)fclose(fp)return}文件位置标记及其定位文件位置标记及其定位文件位置标记的定位可以强制使文件标记指向指定的位置可以用以下函数实现:()用fseek函数改变文件标记fseek函数的调用形式为:fseek(文件类型指针,位移量,起始点)起始点代表“文件开始位置”为“当前位置”为“文件末尾位置”C标准指定的名字位移量指以起始点为基点向前移动的字节数。位移量应是long型数据(在数字的末尾加一个字母L)。fseek函数一般用于二进制文件。下面是fseek函数调用的几个例子:fseek(fp,L,)fseek(fp,L,)fseek(fp,L,)文件位置标记及其定位文件位置标记及其定位文件位置标记的定位可以强制使文件位置标记指向指定的位置可以用以下函数实现:()用ftell函数测定文件位置标记的当前位置ftell函数的作用是得到流式文件中文件位置标记的当前位置。由于文件中的文件位置标记经常移动人们往往不容易知道其当前位置所以常用ftell函数得到当前位置用相对于文件开头的位移量来表示。如果调用函数时出错(如不存在fp指向的文件)ftell函数返回值为L。例如:i=ftell(fp)if(i==L)printf(“errorn”)随机读写随机读写例在磁盘文件上存有个学生的数据。要求将第,,,,个学生数据输入计算机并在屏幕上显示出来。要求:从例中建立的“studat”中读入数据随机读写随机读写解题思路:按二进制只读方式打开文件将文件位置标记指向文件的开头读入一个学生的信息并把它显示在屏幕上再将文件标记指向文件中第个学生的数据区的开头读入相应学生的信息并把它显示在屏幕上关闭文件#include<stdioh>#include<stdlibh>structSt{charnameintnumintagecharaddr}studintmain(){intiFILE*fpif((fp=fopen(“studat”,“rb”))==){printf("cannotopenfilen")exit()}for(i=i<i=){fseek(fp,i*sizeof(structSt),)fread(studi,sizeof(structSt),,fp)printf(“sddsn”,studiname,studinum,studiage,studiaddr)}fclose(fp)return}文件读写的出错检测文件读写的出错检测ferror函数ferror函数的一般调用形式为ferror(fp)如果返回值为表示未出错否则表示出错每次调用输入输出函数都产生新的ferror函数值因此调用输入输出函数后立即检查调用fopen时ferror的初始值自动置为文件读写的出错检测文件读写的出错检测clearerr函数作用是使文件错误标志和文件结束标志置为调用一个输入输出函数时出现错误(ferror值为非零值)立即调用clearerr(fp)使ferror(fp)值变以便再进行下一次检测只要出现文件读写错误标志它就一直保留直到对同一文件调用clearerr函数或rewind函数或任何其他一个输入输出函数

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/96

第10章 对文件的输入输出

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利