C语言程序设计基础郑军红版—文件部分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10章文件
10.1 文件类型指针的概念
计算机的主要功能是计算和存储数据,各种数据都是以二进制形式存储在计算机的辅助存储器上,而且相关的数据以集合的形式供系统存取,这种存储在外部介质上的数据集合称为“文件”。
10.1.1 文件数据的存储形式
文件中数据的存储形式有两种形式:一种是字符形式,另一种是二进制形式。
以字符形式存储数据的文件称为文本文件,字符可以是字母、数字、运算符等,每个字符通过相应的编码存储在文件中,常用的编码是ASCII码,即一个字符有一个ASCII代码,占用一个字节的存储空间。这种存储形式的缺点是占用空间大,比如存储一个整数12345,在这里就被看作是5个字符,因此需要用5个字节的存储空间。
以二进制形式存储数据的文件称为二进制文件,它是按照数据在内存中的存储形式原样存储数据的。如上面的整数12345在二进制文件中只需占用2个字节的存储单元。
10.1.2 文件的处理方法
C语言对文件的处理方法有两种:一种叫“缓冲文件系统”,一种叫“非缓冲文件系统”。
所谓缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。
从内存向外部存储器输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送出去。如果从外部存储器向内读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。
所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。
在Unix系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件。用缓冲文件系统进行的输入输出又称为高级(或高层)磁盘输入输出(高层I/O),用非缓冲文件系统进行的输入输出又称为低级(低层)输入输出系统。ANSI C标准决定不采用非缓冲文件系统,而只采用缓冲文件系统。即既用缓冲文件系统处理文本文件,也用它来处理二进制文件,也就是将缓冲文件系统扩充为可以处理二进制文件。
C语言提供了相应的文件操作函数,它们都是标准库函数,用它们可以实现对文件的读写、打开和关闭等操作。
本章主要学习掌握的是用缓冲文件系统处理文件。
缓冲文件系统中,关键的概念是“文件指针”。在对一个缓冲文件进行操作时,系统需要许多控制信息,如:文件名、文件当前的读写位置、与该文件对应的内存缓冲区的地址、缓冲区中未被处理的字符数、文件的操作方式等。缓冲文件系统为每一个文件定义一个FILE型的结构体变量来存放这些控制信息。FILE定义在头文件stdio.h中,声明如下:
Typedef struct
{
Short level; //缓冲区“满”或“空”的程度
Unsigned flags;//文件状态标志
Char fd;//文件描述符
Unsigned char hold;//如无缓冲区不读取字符
Short bsize;//缓冲区的大小
Unsigned char *buffer;//数据缓冲区的位置
Unsigned char *curp;//指针,当前的指向
Unsigned istemp;//临时文件,指示器
Short token;//用于有效性检查
}FILE;
有了结构体FILE类型以后,可以用它来定义若干个FILE类型的变量,以便存放若干个文件的信息。
FILE *fp;
Fp是一个指向FILE类型结构体的指针变量,通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。如有n个文件,一般应设n 个FILE类型结构体的指针变量,使它们分别指向n个文件,实现对文件的访问。
10.2 文件的常用操作
10.2.1 文件的打开与关闭
进行文件读写之前,要先将文件打开;文件操作完毕后,要将文件关闭。
1.文件的打开
在C语言程序中,打开文件的操作用函数fopen()来实现,它的一般使用形式如下:FILE *fp;
Fp=fopen(文件名,文件使用方式);
例如:fp=fopen(“fal”,”r”);
其中fal是要打开的文件名,此文件的使用方式为“读入”(r代表read,即读入),fopen函数开会指向fal文件的指针并赋给fp,或者说,fp指向fal文件。那么,在打开一个文件时,需要给出3条信息:需要打开的文件名;文件的使用方式(“读”还是“写”等);哪个指针变量指向被打开的文件。
注意:fopen函数返回一个指向要打开文件的指针,若未成功打开,则返回一个NULL(空)指针。
文件的使用方式有很多种。
R 为输入打开一个文本文件
W 为输出打开一个文本文件
A 向文本文件尾增加数据
Rb 为输入打开一个二进制文件
Wb 为输出打开一个二进制文件
Ab 向二进制文件尾增加数据
R+ 为读/写打开一个文本文件
W+ 为读/写建立一个新的文本文件
A+ 为读/写打开一个文本文件
Rb+ 为读/写打开一个二进制文件
Wb+ 为读/写建立一个新的二进制文件
Ab+ 为读/写打开一个二进制文件
下面是常用的打开文件的程序段:
#include
FILE *fp;
If((fp=fopen(“filename”,”r”))==NULL){
Printf(“cannot open this file\n”);
Exit(0);
}
2.文件的关闭
在c程序中,用fclose函数关闭文件。Fclose函数调用的一般形式如下:
Fclose(文件指针);
例如:fclose(fp);
前面曾用fp指向被打开的文件,现在用fclose函数把fp所指向的文件关闭。即fp不再指向该文件。
Fclose函数也返回一个值,若顺利地执行了关闭操作,则返回值为0;否则返回EOF(-1)。
10.2.2 文件的读写与定位
1.文件的读写操作
(1)以字符方式读写文件。
以下函数是以字符为单位进行文件读写的,此类函数主要用于对字符组成的文本文件进行读写操作。
①int fputc(int ch,FILE *fp);
写字符函数。该函数的功能是将字符ch写入文件指针fp所指的文件中去。若写入成功,则返回值是字符ch;若写入失败,则返回EOF(值为-1)。
②int fgetc(FILE *fp);
读字符函数。该函数功能是从文件指针fp所指文件读取一个字符,并返回该字符。若读取失败,则返回EOF(值为-1)。
③int feof(FILE *fp);
该函数的功能是检查文件是否结束。若文件指针指向文件末尾,则函数返回值为1;否则,函数返回值为0。
例10.1 将一个文本文件的内容复制到另一个文本文件中。
程序如下:
#include
Main(){
FILE *fpin,*fpout;
Char ch,infile[100],outfile[100];
Printf(“enter the infile name:\n”);
Scanf(“%s”,infile);
Printf(enter the outfile name:\n);
Scanf(“%s”,outfile);
Fpin=fopen(infile,”r”);
Fpout=fopen(outfile,”w”);