[课件资料]第9章文件_第1页
[课件资料]第9章文件_第2页
[课件资料]第9章文件_第3页
[课件资料]第9章文件_第4页
[课件资料]第9章文件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第9章文件,2,教学目标,理解文件的概念以及文件是如何实现信息的永久存储的功能能够使用函数fopen和fclose来打开和关闭文件。掌握文件的读写以及文件指针的定位操作,基本概念,程序处理的数据是如何进入到计算机内部的?计算机程序计算的结果又要输出到哪里去呢?,3,在前面的章节中将输出输入的问题都交给了基本输入输出系统来完成,也就是从键盘输入数据,通过监视器输出计算结果。,但当需要实现大量数据的输入和输出时,再选用标准输入输出形式来与外界交互,就显得力不从心了。,基本概念,为此我们将磁盘作为信息载体,用于数据的输入与输出。这时的输入和输出设备就是针对文件系统。本章将讨论文件的一般性概念及C语言程序中的文件使用方法。但文件并没有内建在C语言中,对于它的操作,是通过标准库函数来实现的,即本章的的主要内容是学习这些能够操作函数的基本库函数,4,9.1文件和流的概念,文件的定义C语言把每个独立的数据流称作文件,每个文在相应的磁盘目录(或者文件夹)下,文件用文件名(包括文件的目录路径)来标识,5,9.1文件和流的概念,在C的标准库中,提供了一套流操作函数,其中包括流的创建(打开文件)、撤消(关闭文件),对流的读写(实际上是通过流对文件的读和写),以及其他一些与文件操作相关的函数。通过定义一个结构体类型FILE,将存储与流操作有关的(与打开的文件有关的)所有信息。打开文件操作返回一个指向FILE的指针(称为文件指针),它代表所创建的流,对这个流的所有操作都将通过这个指针进行。,6,9.1文件和流的概念,C程序启动时自动创建三个流(建立三个文件指针并指定值)标准输入流(指针名为stdin)标准输出流(指针名为stdout)标准错误流(指针名为stderr)stdin通常与操作系统的标准输入连接stdout与操作系统的标准输出连接stderr通常直接与显示器连接,这说明stderr不能重新定向。,7,文件分类,按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放,8,9,9.2文件的使用,文件类型指针文件结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构体描述FILE定义在stdio.h中,10,9.2文件的使用,11,typedefstructshortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据传输缓冲区*/unsignedchar*curp;/*当前激活指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于合法性校合*/FILE;,在操作文件以前,应先定义文件指针变量:FILE*fp1,*fp2;,9.2文件的使用,在C程序中使用文件,需要完成以下工作:声明一个FILE*类型的文件指针变量调用fopen函数打开(open)文件(将文件指针和某实际文件相联系)。打开文件时须指定文件名以及使用文件的目的-用于输入还是输出调用stdio.h中适当的函数完成必要的I/O操作调用fclose函数表明文件操作结束,这一操作称为关闭(close)文件,它断开了文件指针变量与实际文件间的联系,12,9.2.1文件的打开与关闭,打开文件的操作通过标准库函数fopen完成,函数fopen返回一个FILE类型的指针值函数fopen的原型是:FILE*fopen(constchar*filename,constchar*mode);filename表示希望打开的文件名mode用于指定文件打开方式。,13,14,文件打开模式,文件的操作方式文本文件二进制文件打开文件的方法,15,#includeFILE*fp;/*定义文件指针*/*创建一个只写的新文本文件*/if(fp=fopen(test.txt,w)=NULL)/*判断写方式打开文件是否成功*/printf(cannotopenfilen);exit(0);,关闭文件是丢掉缓冲区的内容,释放对应的内存。通过函数fclose完成intfclose(FILE*fp);fclose正常完成时返回0,出问题时返回值为EOF一个程序可以同时打开的文件数通常是有限的,所以,文件使用完毕后应及时将它关闭。,16,9.2.1文件的打开与关闭,例9.1:文件操作的基本过程。,17,FILE*fp;fp=fopen(myfile.abc,r);/*建立文件与流的关系,使用指定的模式*/if(fp=NULL)/*判断文件打开是否成功*/*当文件打不开时的处理*/./*对文件的各种操作*/fclose(fp);,判断文件结束,函数feof函数是很常用的判断文件是否到了结束标志。通常用该函数来检查文件中的数据是否都已访问。函数原型:intfeof(FILE*fp);函数的返回值若是非0的数,则说明文件指针已指向文件的结尾。while(!feof(fp)putch(fgetc(fp);说明当文件没结束时,以输出文件中的内容。,18,9.2.2文件的读写操作,当文件按指定的工作方式打开以后,就可以执行对文件的读和写。对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。,19,读写字符函数fgetc和fputc,从文件中读取一个字符:intfgetc(FILE*fp);将一个字符写入文件:intfputc(intch,FILE*fp);,20,fputc()函数完成将字符ch的值写入所指定的流文件的当前位置处,并将文件指针后移一位。fputc()函数的返回值是所写入字符的值,出错时返回EOF。,fgetc()函数从输入流的当前位置读取一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,例9.2:显示文件内容。将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕。采用带参数的main(),指定的磁盘文件名由命令行方式通过键盘给定,21,#includeintmain(intargc,char*argv)charch;FILE*fp;inti;/*打开一个由argv1所指的文件*/if(fp=fopen(argv1,r)=NULL)printf(notopen);exit(0);/*从文件读一字符,显示到屏幕*/while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);return0;,22,输入:ex9_2ex9_2.c输出:上述源文件,例9.3:从键盘输入字符,存到文件test.txt中:,23,#includeintmain()FILE*fp;charch;if(fp=fopen(test.txt,w)=NULL)printf(cannotopenfile!n);exit(0);while(ch=getchar()!=n)/*只要输入字符非回车符*/fputc(ch,fp);/*写入文件一个字符*/fclose(fp);return0;,读写字符串读写函数fgets和fputs,从文件中读取一个字符串函数形式为:char*fgets(char*str,intnum,FILE*fp);,24,fgets()函数从流文件stream中读取至多num-1个字符,并把它们放入str指向的字符数组中。读取字符直到遇见回车符或EOF(文件结束符)为止,或读入了所限定的字符数。,fputs()函数将str指向的字符串写入流文件。操作成功时,函数返回0值,失败返回非零值。,将一个字符串写入文件函数形式为:intfputs(char*str,FILE*fp);,例9.4:向磁盘写入字符串,并写入文本文件test.txt,#includeintmain()FILE*fp;charstr128;if(fp=fopen(test.txt,w)=NULL)printf(cannotopenfile!);exit(0);while(scanf(%s,str)!=EOF)/*若输入Ctrl+Z,则结束*/fputs(str,fp);/*写入串*/fputs(n,fp);/*写入回车符*/fclose(fp);return0;,25,例9.5:从一个文本文件test1.txt中读出字符串,再写入一个文件test2.txt。,26,#includeintmain()FILE*fp1,*fp2;charstr128;/*以只读方式打开文件1*/if(fp1=fopen(test.txt,r)=NULL)printf(cannotopenfilen);exit(0);,/*以只写方式打开文件2*/if(fp2=fopen(test2.txt,w)=NULL)printf(cannotopenfilen);exit(0);/*从文件中读回的字符串长度大于0*/while(fgets(str,128,fp1)0)fputs(str,fp2);/*从文件1读字符串并写入文件2*/printf(%s,str);/*在屏幕显示*/fclose(fp1);fclose(fp2);return0;,27,格式化输入输出函数fscanf和fprintf,按照指定的格式对文件内容进行读写按指定格式将文件内容读入:intfscanf(FILE*fp,char*format,arg_list);按指定格式将内容写入文件intfprintf(FILE*fp,char*format,arg_list);,28,例9.6:将包括姓名、学号、两科成绩班级数据写入文本文件,再从该文件中以格式化方法读出显示到屏幕上。,29,30,#include#includestructstucharname15;charnum6;floatscore2;student;intmain()FILE*fp;inti;if(fp=fopen(test.txt,w)=NULL)printf(cannotopenfile);exit(0);,31,for(i=0;i2;i+)scanf(%s%s%f%f,,student.num,32,while(fscanf(fp,%s%s%f%fn,,student.num,块读写函数fread和fwrite,对二进制文件无法以整体形式向文件写入或从文件读出。C语言提供成块的读写方式来操作文件,使其数组或结构体等类型可以进行一次性读写size_tfread(void*pointer,size_tsize,size_tnum,FILE*fp);size_tfwrite(void*pointer,size_tsize,size_tnum,FILE*fp);,33,说明:size_t是C语言系统确定的无符号整型。函数fwrite向流fp输出一批数据,数据的起始位置由指针pointer给定,元素大小是size,共num个。函数fread的功能正好与fwrite对应,它要求读入num个数据元素,每个元素的大小为size,指针参数pointer应指向接受数据的起始存储位置。,例9.7:使用文件存储块操作函数实现对班级同学高考基本成绩信息的存储与输出。同学基本信息包括学号,姓名,年龄和高考成绩,34,9.2.3文件指针的定位,C语言在标准I/O库stdio.h中提供了用于一组文件指针定位的函数,它的作用是使文件指针移动到所需要的位置。函数原型及功能如:,35,9.2.3文件指针的定位,fseek函数origin参数的含义:,36,如下列语句:fseek(fp,5L,0);其含义为:将文件指针从文件头向下移动5个字节fseek(fp,-10L,2);表示将文件指针从结尾位置向上移动10个字节,例9.8在命令行窗口输入一个二进制文件,并指定文件的指针的偏移量,输出当前文件指针所指的数据。,37,if(fseek(fp,atol(argv2),SEEK_SET)printf(Seekerror.n);exit(1);printf(Byteat%ldis%c.n,atol(argv2),getc(fp);fclose(fp);return0;,#includeintmain(intargc,char*argv)FILE*fp;if(argc!=3)printf(Usage:SEEKfilenamebyten);exit(1);if(fp=fopen(argv1,rb)=NULL)printf(Cannotopenfile.n);exit(1);,注意:当对数据不很清楚的情况下,是很难把握偏移量的计算的,所以对于文件指针的移动需要慎重,否则数据很容易读入错误,9.2.4出错的检测,调用各种输入输出函数(如fputc、fgetc、fread、fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。函数的原型为:intferror(FILE*fp);如果ferror返回值为O(假),表示文件操作未出错;如果返回一个非零值,则说明文件操作失败。,38,例9.9ferror函数的使用方法,39,#include#includeintmain()FILE*stream;stream=fopen(test.dat,w);fgetc(stream);/*对一个不存在的文件进行读操作*/if(ferror(stream)printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论