C语言文件操作.docx

上传人:ng****60 文档编号:2245883 上传时间:2019-05-02 格式:DOCX 页数:9 大小:26.20KB
下载 相关 举报
C语言文件操作.docx_第1页
第1页 / 共9页
C语言文件操作.docx_第2页
第2页 / 共9页
C语言文件操作.docx_第3页
第3页 / 共9页
C语言文件操作.docx_第4页
第4页 / 共9页
C语言文件操作.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、文 件教学目标:了解文件的概念;熟练掌握缓冲文件系统和非缓冲文件系统的概念及其区别;熟练掌握文件类型指针的概念;熟练掌握打开文件和关闭文件的方法;熟练掌握利用标准 I/O 提供的四种读写文件的方法对文件进行顺序读写和随机读写;了解文件操作的出错检测方法。教学重点:缓冲文件系统与非缓冲文件;文件类型指针;文件的打开与关闭;利用标准 I/O 提供的四种读写文件的方法对文件进行顺序读写和随机读写。教学难点:缓冲文件系统与非缓冲文件;利用标准 I/O 提供的四种读写文件的方法对文件进行顺序读写操作和随机读写操作。11.1 文件概述11.1.1 文件的概念所谓文件是指记录在外部存储介质上的数据集合。例如

2、,用 EDLN 编辑好的一个源程序就是一个文件,把它存储到磁盘上就是一个磁盘文件。从计算机上输出一个源文件到打印机,这也是一个文件。广义上说,所有输入输出设备都是文件。例如,键盘、显示器、打印机都是文件。计算机以这些设备为对象进行输入输出,对这些设备的处理方法统一按文件处理。计算机中的文件可以从不同角度进行分类:(1) 按文件介质:磁带文件、磁盘文件和卡片文件等。(2) 按文件内容:源程序文件、目标文件、可执行文件和数据文件等。(3) 按文件中数据的组织形式:二进制文件和文本文件。文本文件是指文件的内容是由一个一个的字符组成,每一个字符一般用该字符对应的 ASCII 码表示。例如,一个实数 1

3、36.56 占 6 个字符。二进制文件是以数据在内存中的存储形式原样输出到磁盘上去。例如,实数 136.56 在内存中以浮点形式存储,占 4 个字符,而不是 6 个字节。若以二进制形式输出此数,就将该 4 个字节按原来在内存中的存储形式送到磁盘上去。不管一个实数有多大,都占 4 个字节。一般来说,文本文件用于文档资料的保存,方便用户阅读理解;二进制文件节省存储空间而且输入输出的速度比较快。因为在输出时不需要把数据由二进制形式转换为字符代码,在输入时也不需要把字符代码先换成二进制形式然后存入内存。如果存入磁盘中的数据只是暂存的中间结果数据,以后还要调入继续处理,一般用二进制文件以节省时间和空间。

4、如果输出的数据是准备作为文档供给人们阅读的,一般用字符代码文件,它们通过显示器或打印机转换成字符输出,比较直观。11.1.2 缓冲文件系统和非缓冲文件系统目前 C 语言所使用的磁盘文件系统有两大类:一类称为缓冲文件系统,又称为标准文件系统或高层文件系统;另一类称非缓冲文件系统,又称为低层文件系统。(1) 缓冲文件系统的特点对程序中的每一个文件都在内存中开辟一个“缓冲区” 。从磁盘文件输入的数据先送到“ 输入缓冲区”,然后再从缓冲区依次将数据送给接收变量。在向磁盘文件输出数据时,先将程序数据区中变量或表达式的值送到“输出缓冲区” 中,然后待装满缓冲区后一起输出给磁盘文件。这样做的目的是减少对磁盘

5、的实际读写次数。因为每一次对磁盘的读写都要移动磁头并寻找磁道扇区,这个过程要花一些时间的,如果每一次用读写函数时都要对应一次实际的磁盘访问,那么就会花费较多的读写时间。用缓冲区就可以一次读入一批数据,或输出一批数据,即不是执行一次输入或输出函数就实际访问磁盘一次,而是若干次读写函数语句对应一次实际的磁盘访问。缓冲文件系统自动为文件设置所需的缓冲区,缓冲区的大小随机器而异。(2) 非缓冲区文件系统的特点系统不自动设置缓冲区,而由用户根据自己需要设置。(3) 缓冲区文件系统与非缓冲区文件系统的比较这两种文件系统分别对应使用不同的输入输出函数。应该说,缓冲文件系统功能强、使用方便,由系统代替用户做了

6、许多事情,提供了许多方便。而非缓冲系统则直接依赖于操作系统,通过操作系统的功能直接对文件进行操作。所以它称为系统输入输出或低层输入输出系统。在传统的 UNIX 标准中,用缓冲文件系统对文本文件进行操作,用非缓冲文件系统对二进制文件进行操作。ANSI 只建议使用缓冲文件系统,并对缓冲文件系统的功能进行了扩充,使之既能用于处理文本文件又能处理二进制文件。缓冲区文件系统的输入输出称为标准输入输出(标准 I/O) ,非缓冲区文件系统的输入输出称为系统级输入输出(系统 I/O) 。(4) 标准 I/O 读写文件的方法 读写一个字符:fgetc 函数和 fputc 函数。 读写一个字符串:fgets 函数

7、和 fputs 函数。 格式化读写:fscanf 函数和 fprintf 函数。 读写一个记录:fread 函数和 fwrite 函数。前三种读写方法和以前介绍的以终端为对象的读写方法相似,其含义如P295 表 9.1 所示。对这三种标准 I/O 函数是很好理解且使用很方便的,第四种按记录读写的函数在原来 UNIX 的缓冲文件系统中是没有的,是 ANSI C 扩充的功能,用来读写一个数据块。11.1.3 文件类型指针要调用一个文件,需要提供以下一些信息:文件当前的读写位置;与该文件对应的内存缓冲区的地址;缓冲区中未被处理的字符数;文件操作方式等。缓冲文件系统为每一个文件开辟一个“文件信息区 ”

8、,用来存放以上这些信息。这个“文件信息区 ”在内存中,是一个结构体变量,这个结构体变量是由系统定义的,用户不必定义。其形式为:typeder struct FILE;上面结构体的成员就是用来存放以上信息的数据项。对 FILE 的定义是在stdio.h 头文件中由系统事先指定的。只要程序中用到一个文件,系统就为此文件开辟一个如上定义的结构体变量存储该文件的有关信息。这个结构体变量不用变量名来标识,而设置一个指向该结构体变量的指针变量,通过指针变量来访问该结构体变量。定义文件类型指针变量的语法格式为:FILE *文件结构体指针变量名;例如:FILE *fp1, *fp2, *fp3;文件指针是缓冲

9、文件系统的一个很重要的概念,只有通过文件指针才能调用相应的文件。11.2 文件打开与关闭11.2.1 文件的打开对磁盘文件的操作必须是“先打开,后读写,最后关闭” 。所谓“打开文件 ”就是在程序和操作系统之间建立起联系,程序把所要操作文件的一些信息通知给操作系统。这些信息中除包括文件名外,还要指出文件操作方式是读还是写:(1) 读文件。首先确定此文件是否已存在,如果存在则将读写当前位置设定在文件开头,以便从文件开头读取数据,否则进行错误处理。(2) 写文件。首先检查原来是否有同名文件,如果有则将该文件删除并建立一个新文件,否则就将读写当前位置设定在文件开头,以便从文件开头写入数据。打开文件用

10、fopen 函数实现。它的调用语法格式为:fopen(文件名,文件使用方式);例如:fopen(“file.txt”, “r”);表示要打开 file.txt 文件,对文件的使用方式为只读方式。文件操作方式见P297 表 9.2。调用 fopen 函数之后,fopen 函数有一个返回值。它是一个地址值,指向被打开文件的文件信息区的起始地址。如果打开文件失败,则返回一个 NULL 指针。fopen 函数的返回值应当立即赋给一个文件类型指针变量,以便以后能通过该指针变量来访问此文件,否则此函数返回值就会丢失而导致程序中无法对此文件进行操作。简而言之,在打开一个文件时,程序通知编译系统三个方面的信息

11、:(1) 要打开哪一个文件,以“文件名”指出。(2) 对文件的使用方式。(3) 函数的返回值赋给哪一个指针变量,或者说让哪一个指针变量指向该文件。对于磁盘文件,在使用前要先打开,而对终端设备,尽管它们也作为文件来处理,但为什么在前面的程序中从未使用过打开文件的操作吗?这是由于在程序运行时,系统自动地打开三个标准文件:标准输入、标准输出和标准出错输出。系统自动地定义了三个指针变量:stdin,stdout,stderr 分别指向标准输入、标准输出和标准出错输出。这三个文件都是以终端设备作为输入输出对象的。如果指定输出一个数据到 stdout 所指向的文件,就是指输出到终端设备。为使用方便,允许在

12、程序中不指定这三个文件,也就是说,系统隐含的标准输入输出文件是指终端。11.2.2 文件的关闭关闭文件用 fclose 函数实现。调用 fopen 函数的语法格式为:fclose(文件指针变量 );关闭文件的功能是通知系统将此指针指向的文件关闭,释放相应的文件信息区。这样,原来的指针变量不再指向该文件,以后也就不可能通过此指针变量来访问该文件。如果关闭的是写操作的文件,则系统在关闭该文件之前先将输出文件缓冲区的内容全部输出给文件,然后关闭文件。如果不关闭文件而直接使程序停止运行,这时会丢失缓冲区中还未写入文件的部分信息。因此必须注意,文件用完之后必须关闭。如果关闭文件操作正确,则 fclose

13、 函数返回 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.

14、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 fi

15、len”); 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

16、”)=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

17、 中。如果在读入 n-1 个字符完成之前遇到换行符n 或文件结束符 EOF 则结束读入,但将遇到的换行符n也作为一个字符送入字符数组 str 中。在读入的字符串之后自动加一个字符串结束字符0 。 fgets 函数返回值为字符数组 str 的首地址,如果遇到文件结束或出错,则返回 NULL。C 语言提供一个输出字符串到磁盘文件的 fputs 函数。例如:fputs(str,fp);的功能是将字符数组 str 中的字符串输出到 fp 所指向的文件。但字符串的结束符0不输出。如果成功则返回 0,否则返回非 0。例 11.3 从键盘上输入字符串送到文件 file2.txt 中,然后再从该文件中读出所有

18、的字符串。#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 fil

19、en”);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所指向

20、的文件中去。函数返回值为实际输出的字符数。例 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,while(strlen(name)1) fprintf(fp,“%s %d %f”

21、,name,num,score);scanf(“%s %d %f”,name,fclose(fp);if (fp=fopen(“file3.txt”,“r”)= =NULL) printf(“cannot open this filen”); exit(0);while(fscanf(fp,“%s %d %f”,name,fclose(fp);11.3.4 按记录的方式输入输出C 语言提供一个按记录的方式输入函数 fread。例如:fread(buffer,size,count,fp);C 语言提供一个按记录的方式输出函数 fwrite。例如:fwrite(buffer,size,count,

22、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

23、 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(stud.name); gets(numstr); stud.num=atol(numstr);gets(numstr); stud.score=atof(numstr);fwrite(printf(“have another student record(y/n)?”);ch=getchar( );

24、 getchar( );while (ch= =y);fclose(fp);if (fp=fopen(“file5.txt”,“r”)= NULL)printf(“cannot open this filen”); exit(0);while (fread(fclose(fp); 11.4 文件定位与随机读写上面介绍的对文件的读写都是顺序读写,即从文件的开头逐个数据读或写。文件中有一个“ 读写位置指针 ”,指向当前读或写的位置。在顺序读写时,每读或写一个数据后,位置指针就自动移到它后面一个位置。如果读写的数据项包含多个字节,则对该数据项读写完后位置指针移到该数据项之末。在实际读写文件中,常常希

25、望能直接读到某一数据项而不是按物理顺序逐个地读下来。这种可以任意指定读写位置的操作称为文件的随机读写。可以想象,只要能移动位置指针到所需要的地方,就能实现随机读写。11.4.1 文件的定位(1) fseek 函数fseek 函数的功能是使位置指针移动到所需的位置。调用函数 fseek 的格式为:fseek(文件类型指针 ,位移量,起始点)其中,起始点是指用数字代表以什么地方作为基准进行移动。0,1,2 分别代表文件的开头、当前位置和结尾。如果位移量为正数则表示以起始点为基点向前移动的字节数,否则表示以起始点为基点向后移动的字节数。位移量应该为long 型数据,这样当文件长度很长时,位移量仍在

26、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.

27、2 文件随机读写例 9.6 任意指定输出 file5.txt 文件中的一条记录。#include “stdio.h”#include “stdlib.h”main( ) struct char name20;long num; float score;stud;FILE *fp; long offset; int recno;if (fp=fopen(“file5.txt”,“r”)=NULL)printf(“cannot open this filen”); exit(0);printf(“enter record number”); scanf(“%d”,offset=(recno-1)*

28、sizeof(stud);if (fseek(fp,offset,0)!=0) printf(“cannot move pointer there.n”); exit(0);fread(printf(“%s,%ld,%fn”,stud.name,stud.num,stud.score)fclose(fp);11.5 文件操作的出错检测大多数标准 I/O 函数并不具有明确的出错信息返回。例如,如果调用 fputc函数返回 EOF,它可能表示文件结束,也可能是调用失败而出错。调用 fgets 时,如果返回 NULL,它可能是文件结束,也可能是出错。为了明确地检查出是否出错,C 提供一个检测文件操作的出错函数 ferror。例如:ferror(fp);如果函数返回值为 0,则表示没有出错,否则表示出错。在调用 fopen 函数时,会自动使相应的文件的 ferror 函数的初值为零。应当注意,每调用一次输入输出函数后,都有一个 ferror 函数值与之对应。如果想检测调用输入输出函数是否出错,应在调用该函数后立即测试 ferror 函数值,否则会丢失。小结:本章主要介绍了文件的概念,缓冲文件系统和非缓冲文件系统的概念及其区别,文件类型指针,文件的打开和关闭,利用标准 I/O 提供的四种读写文件的方法对文件进行顺序读写和随机读写,文件操作的出错检测。

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

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。