第 9章 文 件
9.1 文件的概念
9.2 文件的打开与关闭
9.3 文件的读写
9.4 文件的定位
9.5 程序举例
9.1 文件的概念
一般来说,文件是指存储在外存储器上的数据的集合。
9.1.1 文本文件与二进制文件
根据文件中数据的存储形式, 一般又将文件分为文本文件
和二进制文件两种 。
文本文件又称为 ASCII文件。在这种文件中,每个字节存
放一个字符的 ASCII码值。
9.1.2 缓冲文件系统
C语言编译系统对文件的处理有两种方式, 分别采用
缓冲文件系统方式与非缓冲文件系统方式进行 。
所谓缓冲文件系统是指系统自动地为正在被使用的
文件在内存中开辟一个缓冲区。当需要向外存储器中的
文件输出数据时,必须先将数据送到为该文件开辟的缓
冲区中,当缓冲区充满以后才一起送到外存储器中。当
需要对外存储器中的文件读入数据进行处理时,也首先
从外存储器一次将一批数据读入缓冲区 (将缓冲区充满 ),
然后再从缓冲区中将数据逐个读入。
9.1.3 文件类型指针
在 C语言的缓冲文件系统中,用文件类型指针来标识
文件。
定义文件类型指针的一般形式为
FILE *指针变量名;
其中 FILE是 C编译系统定义的一种结构体类型,其中
的成员用于存放有关文件的一些信息。指针变量名用于指
向一个文件,实际上是用于存放文件缓冲区的首地址。例
如,
FILE *fp;
定义了一个结构体 FILE类型的指针变量 fp。
一般来说,对文件操作有以下 3个方面:
(1) 打开文件
在计算机内存中开辟一个缓冲区,用于存放被打开文件
的有关信息。
(2) 文件处理
包括:读写、定位等操作。
(3) 关闭文件
将缓冲区中的内容写回到外存 (磁盘 ),并释放缓冲区。
9.2 文件的打开与关闭
9.2.1 文件的打开
在 C语言中, 打开一个文件的一般形式如下:
FILE *fp(或其他指针变量名 );

fp= fopen(“文件名,,, 文件使用方式, );
为了打开一个文件,首先要为该文件定义一个文件
类型指针,然后用 C语言提供的 fopen函数打开文件。
fopen函数有两个参数:, 文件名, 与, 文件使用方式, 。
它们均是字符串。
“文件使用方式, 可以规定以下几种对文件的访问形式:
r 只读 若文件不存在,则返回空指针;
w 只写 若指定的文件已存在,则其中原有内容被
删去;否则创建一个新文件;
a 追加 向文件尾增加数据。若指定的文件不存在,
则创建一个新文件;
r+ 读写 指定的文件必须已存在,否则返回 NULL;
w+ 读写 若指定的文件已存在,则其中原有内容被
删去;
a+ 读写 追加写。
9.2.2 文件的关闭
对文件操作完成后,要关闭文件。
在 C语言中,关闭文件的一般形式如下:
fclose(fp);
fclose函数的主要功能是将由 fp指向的缓冲区中的
数据存放到外存储器的文件中,然后释放该缓冲区。
9.3 文件的读写
9.3.1 文件读函数
对文件进行读操作, 是指从外存储器的文件中向程序输入
数据 。
在 C语言中, 读文件的函数主要有以下几个 。
1,fgetc函数
该函数的功能是,从指定的文件读入一个字符。
例如,
char c;

c= fgetc(fp); /*假设该文件已打开,下同 */
2,fread函数
该函数的功能是, 从指定的文件中读入一组数据 。 其形
式为
fread(buffer,size,count,fp);
其中,buffer 存放读入数据的内存首地址;
Size 每个数据项的字节数;
count 数据项个数;
fp 文件类型指针 。
3,fscanf函数
该函数的功能是, 从指定的文件中格式化读数据 。
其一般形式为
fscanf(文件指针, 格式控制, 地址表 );
这个函数与格式输入函数 scanf很相似,它们的区别
就在于,scanf函数是从键盘输入数据,而 fscanf函数是从
文件读入数据,因此在 fscanf函数参数中多了一个文件指
针,用于指出从哪个文件读入数据。
9.3.2 文件写函数
1,fputc函数
该函数的功能是,将一个字符写到指定的文件中。其
形式为
fputc(c,fp);
若写成功,则返回已输出的字符,否则返回 EOF。
2,fwrite函数
该函数的功能是,将一组数据写到指定的文件中。
其形式为
fwrite(buffer,size,count,fp);
其中,buffer 输出数据的首地址;
size 每个数据项的字节数;
count 数据个数;
fp 文件类型指针。
3,fprintf函数
该函数的功能是, 格式化写数据到指定的文件中 。
其形式为
fprintf(文件指针, 格式控制, 输出表 );
这个函数与格式输出函数 printf很相似, 它们的区
别就在于, printf函数是将数据输出到显示屏幕上, 而
fprintf函数是将数据输出到文件中, 因此在 fprintf函数
参数中多了一个文件指针, 用于指出将数据输出到哪
个文件中 。
9.4 文件的定位
1,rewind函数
该函数的功能是, 将文件的读写指针移动到文件的
开头 。 其形式为
rewind(fp);
其中 fp是已经打开的文件指针 。
2,fseek函数
该函数的功能是,将文件的读写指针移动到指定
的位置。其形式为
fseek(文件指针,偏移量,起始位置 );
其中各参数的意义如下:
起始位置是指移动文件读写指针的参考位置,它
有以下 3个值:
SEEK_SET或 0 表示文件首
SEEK_CUR或 1 表示当前读写的位置
SEEK_END或 2 表示文件尾
3,ftell函数
该函数的功能是, 返回文件的当前读写位置 (出错
返回- 1L)。 其形式为
ftell(fp);
9.5 程序举例
例 9.6 统计文件 letter.txt中的字符个数 。
C程序如下:
#include "stdio.h"
main()
{ long count= 0;
FILE *fp;
if ((fp= fopen("letter.txt","r+ "))== NULL)
{ printf("cannot open this file!\n");
exit(0);
}
fgetc(fp);
while(!feof(fp))
{ fgetc(fp); count= count+ 1; }
printf("count= %ld\n",count);
fclose(fp);
}
在上述程序中,函数 feof(fp)的功能是检查 fp
所指向的文件是否结束,如遇文件结束,则返回 1,
否则返回 0。语句 fgetc(fp)的功能主要是让文件的
读写指针往后移动一个字符,而不是读取一个字
符。