C语言文件操作.docx_第1页
C语言文件操作.docx_第2页
C语言文件操作.docx_第3页
C语言文件操作.docx_第4页
C语言文件操作.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

文 件教学目标:了解文件的概念;熟练掌握缓冲文件系统和非缓冲文件系统的概念及其区别;熟练掌握文件类型指针的概念;熟练掌握打开文件和关闭文件的方法;熟练掌握利用标准I/O提供的四种读写文件的方法对文件进行顺序读写和随机读写;了解文件操作的出错检测方法。教学重点:缓冲文件系统与非缓冲文件;文件类型指针;文件的打开与关闭;利用标准I/O提供的四种读写文件的方法对文件进行顺序读写和随机读写。教学难点:缓冲文件系统与非缓冲文件;利用标准I/O提供的四种读写文件的方法对文件进行顺序读写操作和随机读写操作。11.1 文件概述11.1.1 文件的概念所谓文件是指记录在外部存储介质上的数据集合。例如,用EDLN编辑好的一个源程序就是一个文件,把它存储到磁盘上就是一个磁盘文件。从计算机上输出一个源文件到打印机,这也是一个文件。广义上说,所有输入输出设备都是文件。例如,键盘、显示器、打印机都是文件。计算机以这些设备为对象进行输入输出,对这些设备的处理方法统一按文件处理。计算机中的文件可以从不同角度进行分类:(1) 按文件介质:磁带文件、磁盘文件和卡片文件等。(2) 按文件内容:源程序文件、目标文件、可执行文件和数据文件等。(3) 按文件中数据的组织形式:二进制文件和文本文件。文本文件是指文件的内容是由一个一个的字符组成,每一个字符一般用该字符对应的ASCII码表示。例如,一个实数136.56占6个字符。二进制文件是以数据在内存中的存储形式原样输出到磁盘上去。例如,实数136.56在内存中以浮点形式存储,占4个字符,而不是6个字节。若以二进制形式输出此数,就将该4个字节按原来在内存中的存储形式送到磁盘上去。不管一个实数有多大,都占4个字节。一般来说,文本文件用于文档资料的保存,方便用户阅读理解;二进制文件节省存储空间而且输入输出的速度比较快。因为在输出时不需要把数据由二进制形式转换为字符代码,在输入时也不需要把字符代码先换成二进制形式然后存入内存。如果存入磁盘中的数据只是暂存的中间结果数据,以后还要调入继续处理,一般用二进制文件以节省时间和空间。如果输出的数据是准备作为文档供给人们阅读的,一般用字符代码文件,它们通过显示器或打印机转换成字符输出,比较直观。11.1.2 缓冲文件系统和非缓冲文件系统目前C语言所使用的磁盘文件系统有两大类:一类称为缓冲文件系统,又称为标准文件系统或高层文件系统;另一类称非缓冲文件系统,又称为低层文件系统。(1) 缓冲文件系统的特点对程序中的每一个文件都在内存中开辟一个“缓冲区”。从磁盘文件输入的数据先送到“输入缓冲区”,然后再从缓冲区依次将数据送给接收变量。在向磁盘文件输出数据时,先将程序数据区中变量或表达式的值送到“输出缓冲区”中,然后待装满缓冲区后一起输出给磁盘文件。这样做的目的是减少对磁盘的实际读写次数。因为每一次对磁盘的读写都要移动磁头并寻找磁道扇区,这个过程要花一些时间的,如果每一次用读写函数时都要对应一次实际的磁盘访问,那么就会花费较多的读写时间。用缓冲区就可以一次读入一批数据,或输出一批数据,即不是执行一次输入或输出函数就实际访问磁盘一次,而是若干次读写函数语句对应一次实际的磁盘访问。缓冲文件系统自动为文件设置所需的缓冲区,缓冲区的大小随机器而异。(2) 非缓冲区文件系统的特点系统不自动设置缓冲区,而由用户根据自己需要设置。(3) 缓冲区文件系统与非缓冲区文件系统的比较这两种文件系统分别对应使用不同的输入输出函数。应该说,缓冲文件系统功能强、使用方便,由系统代替用户做了许多事情,提供了许多方便。而非缓冲系统则直接依赖于操作系统,通过操作系统的功能直接对文件进行操作。所以它称为系统输入输出或低层输入输出系统。在传统的UNIX标准中,用缓冲文件系统对文本文件进行操作,用非缓冲文件系统对二进制文件进行操作。ANSI只建议使用缓冲文件系统,并对缓冲文件系统的功能进行了扩充,使之既能用于处理文本文件又能处理二进制文件。缓冲区文件系统的输入输出称为标准输入输出(标准I/O),非缓冲区文件系统的输入输出称为系统级输入输出(系统I/O)。(4) 标准I/O读写文件的方法 读写一个字符:fgetc函数和fputc函数。 读写一个字符串:fgets函数和fputs函数。 格式化读写:fscanf函数和fprintf函数。 读写一个记录:fread函数和fwrite函数。前三种读写方法和以前介绍的以终端为对象的读写方法相似,其含义如P295表9.1所示。对这三种标准I/O函数是很好理解且使用很方便的,第四种按记录读写的函数在原来UNIX的缓冲文件系统中是没有的,是ANSI C扩充的功能,用来读写一个数据块。11.1.3 文件类型指针要调用一个文件,需要提供以下一些信息:文件当前的读写位置;与该文件对应的内存缓冲区的地址;缓冲区中未被处理的字符数;文件操作方式等。缓冲文件系统为每一个文件开辟一个“文件信息区”,用来存放以上这些信息。这个“文件信息区”在内存中,是一个结构体变量,这个结构体变量是由系统定义的,用户不必定义。其形式为:typeder struct FILE;上面结构体的成员就是用来存放以上信息的数据项。对FILE的定义是在stdio.h头文件中由系统事先指定的。只要程序中用到一个文件,系统就为此文件开辟一个如上定义的结构体变量存储该文件的有关信息。这个结构体变量不用变量名来标识,而设置一个指向该结构体变量的指针变量,通过指针变量来访问该结构体变量。定义文件类型指针变量的语法格式为:FILE *文件结构体指针变量名;例如:FILE *fp1, *fp2, *fp3;文件指针是缓冲文件系统的一个很重要的概念,只有通过文件指针才能调用相应的文件。11.2 文件打开与关闭11.2.1 文件的打开对磁盘文件的操作必须是“先打开,后读写,最后关闭”。所谓“打开文件”就是在程序和操作系统之间建立起联系,程序把所要操作文件的一些信息通知给操作系统。这些信息中除包括文件名外,还要指出文件操作方式是读还是写:(1) 读文件。首先确定此文件是否已存在,如果存在则将读写当前位置设定在文件开头,以便从文件开头读取数据,否则进行错误处理。(2) 写文件。首先检查原来是否有同名文件,如果有则将该文件删除并建立一个新文件,否则就将读写当前位置设定在文件开头,以便从文件开头写入数据。打开文件用fopen函数实现。它的调用语法格式为:fopen(文件名,文件使用方式);例如:fopen(“file.txt”, “r”);表示要打开file.txt文件,对文件的使用方式为只读方式。文件操作方式见P297表9.2。调用fopen函数之后,fopen函数有一个返回值。它是一个地址值,指向被打开文件的文件信息区的起始地址。如果打开文件失败,则返回一个NULL指针。fopen函数的返回值应当立即赋给一个文件类型指针变量,以便以后能通过该指针变量来访问此文件,否则此函数返回值就会丢失而导致程序中无法对此文件进行操作。简而言之,在打开一个文件时,程序通知编译系统三个方面的信息:(1) 要打开哪一个文件,以“文件名”指出。(2) 对文件的使用方式。(3) 函数的返回值赋给哪一个指针变量,或者说让哪一个指针变量指向该文件。对于磁盘文件,在使用前要先打开,而对终端设备,尽管它们也作为文件来处理,但为什么在前面的程序中从未使用过打开文件的操作吗?这是由于在程序运行时,系统自动地打开三个标准文件:标准输入、标准输出和标准出错输出。系统自动地定义了三个指针变量:stdin,stdout,stderr分别指向标准输入、标准输出和标准出错输出。这三个文件都是以终端设备作为输入输出对象的。如果指定输出一个数据到stdout所指向的文件,就是指输出到终端设备。为使用方便,允许在程序中不指定这三个文件,也就是说,系统隐含的标准输入输出文件是指终端。11.2.2 文件的关闭关闭文件用fclose函数实现。调用fopen函数的语法格式为:fclose(文件指针变量);关闭文件的功能是通知系统将此指针指向的文件关闭,释放相应的文件信息区。这样,原来的指针变量不再指向该文件,以后也就不可能通过此指针变量来访问该文件。如果关闭的是写操作的文件,则系统在关闭该文件之前先将输出文件缓冲区的内容全部输出给文件,然后关闭文件。如果不关闭文件而直接使程序停止运行,这时会丢失缓冲区中还未写入文件的部分信息。因此必须注意,文件用完之后必须关闭。如果关闭文件操作正确,则fclose函数返回0,否则返回-1。11.3 文件的顺序读写11.3.1 输入和输出一个字符C语言提供了一个输出一个字符到磁盘文件的fputc函数。例如:fputc(ch,fp);的功能把字符变量ch的值输出到指针变量fp所指向的FILE结构体的文件。这个fp是用fopen函数打开时得到的。如果调用成功,则返回该字符,否则返回EOF。C语言提供了一个从磁盘文件中接收一个字符fgetc函数。例如:ch=fgetc(fp);的功能是从指针变量fp所指向的文件中读入一个字符并赋给字符变量ch。如果执行fgetc函数时遇到文件结束或出错,则返回EOF。例11.1 从键盘上输入一串字符送到文件file1.txt中,然后再从该文件中读出所有的字符。#include “stdio.h”#include “stdlib.h”main( ) FILE *fp; char ch;if (fp=fopen(“file1.txt”,“w”)=NULL)printf(“cannot open this filen”); exit(0);while (ch=getchar( )!=n) fputc(ch,fp);fclose(fp); if (fp=fopen(“file1.txt”,“r”)= = NULL)printf(“cannot open this filen”); exit(0);while (ch=fgetc(fp )!=EOF) putchar(ch);fclose(fp); 程序中在终端输入字符、显示字符的语句:ch=getchar(); putchar(ch);也可改为:ch=fgetcr(); fputc(ch,stdout)前面已经介绍,因为stdin,stdout是指向标准输入输出设备文件信息区的指针。例11.2 统计文件中的字符个数。#include “stdio.h”#include “stdlib.h”main( ) FILE *fp; int count=0;if (fp=fopen(“file1.txt”,“r”)=NULL)printf(“cannot open this filen”);exit(0);while (fgetc(fp )!=EOF) count+;fclose(fp);以上这个程序只能用来统计file1.txt文件中的字符个数,缺乏通用性。如果想用此程序去统计任意指定的文件中的字符个数,则不应把文件名写在程序中,可以利用main函数的参数把文件名从命令行中传递给程序。11.3.2 输入和输出一个字符串C语言提供一个从磁盘文件中输入字符串的fgets函数。例如:fgets(str,n,fp);的功能是从fp指向的文件读取n-1个字符并把它们放到字符数组str中。如果在读入n-1个字符完成之前遇到换行符n或文件结束符EOF则结束读入,但将遇到的换行符n也作为一个字符送入字符数组str中。在读入的字符串之后自动加一个字符串结束字符0。 fgets函数返回值为字符数组str的首地址,如果遇到文件结束或出错,则返回NULL。C语言提供一个输出字符串到磁盘文件的fputs函数。例如:fputs(str,fp);的功能是将字符数组str中的字符串输出到fp所指向的文件。但字符串的结束符0不输出。如果成功则返回0,否则返回非0。例11.3 从键盘上输入字符串送到文件file2.txt中,然后再从该文件中读出所有的字符串。#include “stdio.h”#include “string.h”#include “stdlib.h”main( ) FILE *fp; char string81;if(fp=fopen(“file2.txt”,“w”)=NULL)printf(“cannot open this filen”);exit(0);while(strlen(gets(string )0)fputs(string,fp);fputs(“n”,fp);fclose(fp);if(fp=fopen(“file2.txt”,“r”)=NULL)printf(“cannot open this filen”);exit(0);while(fgets(string,81,fp )!=NULL)printf(“%s”,string);fclose(fp);11.3.3 格式化的输入和输出C语言提供一个格式化输入函数fscanf。例如:fscanf(fp,format,args,);的功能是按format给定的格式将输入数据送到args所指向的内存单元中去。函数返回值为已成功输入的数据个数。C语言提供一个格式化输出函数fprintf。例如:fprintf(fp,format,args,);的功能是把args所指向的存储单元中的值按照format指定的格式输出到fp所指向的文件中去。函数返回值为实际输出的字符数。例11.4 从键盘上输入格式数据到文件file3.txt中,然后再从该文件中读出所有格式数据。#include “stdio.h”#include “stdlib.h”main( ) FILE *fp; char name20; int num;float score;if (fp=fopen(“file3.txt”,“w”)=NULL)printf(“cannot open this filen”); exit(0);scanf(“%s %d %f”,name,&num,&score);while(strlen(name)1) fprintf(fp,“%s %d %f”,name,num,score);scanf(“%s %d %f”,name,&num,&score);fclose(fp);if (fp=fopen(“file3.txt”,“r”)= =NULL) printf(“cannot open this filen”); exit(0);while(fscanf(fp,“%s %d %f”,name,&num,&score)!=EOF)printf( “%s %d %f”,name,num,score);fclose(fp);11.3.4 按记录的方式输入输出C语言提供一个按记录的方式输入函数fread。例如:fread(buffer,size,count,fp);C语言提供一个按记录的方式输出函数fwrite。例如:fwrite(buffer,size,count,fp);其中,buffer是一个指针,对fread函数来说,它是读入数据存储区域的起始地址,对fwrite函数来说,buffer是将要输出数据存储区域的起始地址。size为要读写的字节数。count表示读写多少个size字节的数据项。fp为文件类型指针变量。fread和fwrite函数的返回值为实际上已读入或输出的项数,即如果执行正确则返回count的值。例11.5 从键盘输入一批学生数据到磁盘文件file5.txt,然后从该文件中读出所有的数据。#include “stdio.h”#include “stdlib.h”main( ) struct char name20;long num; float score;stud; char numstr81,ch; FILE *fp;if (fp=fopen(“file5.txt”,“w”)= NULL) printf(“cannot open this filen”); exit(0);dogets(); gets(numstr); stud.num=atol(numstr);gets(numstr); stud.score=atof(numstr);fwrite(&stud,sizeof(stud),1,fp);printf(“have another student record(y/n)?”);ch=getchar( ); getchar( );while (ch= =y);fclose(fp);if (fp=fopen(“file5.txt”,“r”)= NULL)printf(“cannot open this filen”); exit(0);while (fread(&stud,sizeof(stud),1,fp)=1)printf(“%s,%ld,%fn”,,stud.num,stud.score);fclose(fp); 11.4 文件定位与随机读写上面介绍的对文件的读写都是顺序读写,即从文件的开头逐个数据读或写。文件中有一个“读写位置指针”,指向当前读或写的位置。在顺序读写时,每读或写一个数据后,位置指针就自动移到它后面一个位置。如果读写的数据项包含多个字节,则对该数据项读写完后位置指针移到该数据项之末。在实际读写文件中,常常希望能直接读到某一数据项而不是按物理顺序逐个地读下来。这种可以任意指定读写位置的操作称为文件的随机读写。可以想象,只要能移动位置指针到所需要的地方,就能实现随机读写。11.4.1 文件的定位(1) fseek函数fseek函数的功能是使位置指针移动到所需的位置。调用函数fseek的格式为:fseek(文件类型指针,位移量,起始点)其中,起始点是指用数字代表以什么地方作为基准进行移动。0,1,2分别代表文件的开头、当前位置和结尾。如果位移量为正数则表示以起始点为基点向前移动的字节数,否则表示以起始点为基点向后移动的字节数。位移量应该为long型数据,这样当文件长度很长时,位移量仍在long型数据的表示范围。例如:fseek(fp,10L,0);的功能将位置指针移动到离文件开始处10个字节的地方。函数调用成功时则返回值为0,否则返回一个非0值。(2) ftell函数ftell函数的作用是告诉用户位置指针的当前位置。例如:ftell(fp);函数ftell返回值是fp所指向的文件中位置指针的当前位置。如果出错,则ftell返回值为-1。(3) rewind函数函数rewind的作用是使位置指针重新返回到文件的开头处。例如:rewind(fp);函数rewind的作用是使位置指针置于文件开头位置。函数rewind无返回值。11.4.2 文件随机读写例9.6 任意指定输出file5.

温馨提示

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

评论

0/150

提交评论