1、文件的分类
ANSI C 的缓冲文件系统
- 缓冲文件系统
缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。
从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。
从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。 - 非缓冲文件系统
是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区
C的“缓冲文件系统”自动地在内存中开辟一个文件缓冲区, 在对文件进行处理时, 通过文件缓冲区进行输入与输出。
流式文件
C语言将文件看作是一个一个字符(字节)序列组成的,分为ASCII码文件和二进制文件两种,将这样的文件称为流式文件。
ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)
二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。
文件分类
(1)根据文件的性质(内容),将文件分为程序文件和数据文件。
(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。
(3)从用户的角度看,文件可以分为普通文件和设备文件两种。
(4)根据文件的存储形式(编码方式),文件分为ASCII码文件和二进制码文件,ASCII文件也称为文本文件。
2、读文件与写文件
读文件是将磁盘文件中的数据传送到计算机内存。
写文件是从计算机内存向磁盘文件中传送数据的操作。
3、文 件 指 针
文件类型 FILE
在C系统的头文件stdio.h中定义了一个名叫FILE的结构体类型。
系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。
结构类型名“FILE”必须大写
“文件指针”是缓冲文件系统中的一个重要概念。
typedef struct
{ short level; /* 缓冲区饱和程度 */
unsigned flage; /* 文件状态标志 */
char fd; /* 文件号 */
unsigned char hold; /* 无缓冲区取消字符输入 */
short bsize; /* 缓冲区大小缺省值512 */
unsigned char *buffer; /* 缓冲区指针*/
unsigned char *curp; /* 当前活动指针 */
unsigned istemp; /* 草稿文件标识 */
short token; /* 作正确性检验 */
} FILE ;
在缓冲文件系统中可以进行文件的打开、关闭、读、写、 定位等操作。要对文件进行相应的操作,必先定义一个指向文件的指针,这个指针称为文件指针
文件指针定义
定义文件指针的形式:
FILE *指针变量标识符;
其中FILE是由系统定义的一个结构类型, 该结构体类型中含有文件名、文件状态和文件当前位置等信息
例如,FILE *fp;
表示fp是指向FILE(文件)的指针变量,通过fp可找到它指向的文件的信息。
4、文件的打开和关闭
对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。
1.打开文件函数fopen()
FILE *fopen(“文件名”,“操作方式”);
功能:返回一个指向指定文件的指针。
函数原型:stdio.h 。
注:对文件操作的库函数,函数原型均在头文件stdio.h中
文件操作说明
(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。
用 fp 指向打开的文件后, 就可以用它来访问该文件
FILE *fp;
fp=fopen("data.99","r");
如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。为增强程序的可靠性,常用下面的方法打开一个文件:
if((fp=fopen("文件名","操作方式"))==NULL)
{ printf("can not open this file\n");
exit(0);
}
对文件操作的方式(模式)
r ---- 以只读方式打开一个文本文件(该文件已存在)
位置指针指向文件头,从此处读数据
w ------ 以只写方式打开一个文本文件,若该文件不存
在,系统自动建立它,否则,刷新此文件,位
置指针指向文件头,从此处写数据。
a ------- 以追加方式打开一个文本文件,指针指向文件尾
r+ --------以读/写方式打开一个文本文件
打开文件时,读写位置指针指向文件头,以覆
盖方式写文件
w+ ------- 以读/写方式建立一个新的文本文件
对文件操作的方式(模式)
a+ --------以读/写方式打开一个文本文件打开文件时,读从文件头开始;写从文件尾部追加。
rb -------- 以只读方式打开一个二进制文件
wb -------- 以只写方式打开一个二进制文件
ab --------- 以追加方式打开一个二进制文件
rb+ -------- 以读/写方式打开一个二进制文件
wb+ ------- 以读/写方式打开一个新的二进制文件
ab+ -------- 以读/写方式打开一个二进制文件
有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。
使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;
在输出时,将换行符转换成回车和换行两个字符。
使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。
在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:
标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据
标准输出文件——stdout:指向终端输出(一般为显示器)
标准错误文件——stderr:指向终端标准错误输出(一般为显示器)
文件关闭函数fcolse()
对一个文件操作完成后,要将该文件关闭,以避免文件的数据丢失等错误。
C语言中关闭一个文件通过系统函数fclose实现。
用法: int fclose(FILE *文件指针);
功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。
例如,fclose(fp);
关闭fp所指向的文件
示例:“w”方式打开文件(文本文件)
#include <stdio.h>
int main()
{ FILE *fp;
fp=fopen("mydata1.txt","w");
if (fp==NULL)
{ printf("file open error!\n");
exit(0); }
else
{ printf("file open OK!\n");
fclose(fp); }
}
5、文件的读写
字符读写函数fgetc和fputc
fgetc()函数从文件中读入一个字符
用法:int fgetc(文件指针);
功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。
在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
fputc()函数将一个字符写到文件中
int fputc(字符数据,文件指针);
其中“字符数据”,既可以是字符常量,也可以是字符变量。
功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1)
字符串读写函数fgets和fputs
函数 fgets() 从文件中读一个字符串
用法:char *fgets(指针,串长度+1,文件指针);
功能:从指定文件中读入一个规定长度字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志‘\0’;同时将读写位置指针向前移动字符串长度个字节
库函数 fputs() 向指定文件输出一个字符串
用法:int fputs(字符串,文件指针);
向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。
函数返回值: 如果输出成功函数返回值为0;否则,为非0值
数据块读写函数
fread()和fwrite()函数一般用于二进制文件的处理。
读数据块函数fread
fread(buffer,size,count,fp);
其中fp 是文件指针;buffer是一个指针,用来存放输入数据块的首地址;size 表示一个数据块的字节数;count表示要写的数据块块数。
函数功能:从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size * count个字节。
写数据块函数fwrite
fwrite(buffer,size,count,fp);
从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size*count个字节。
函数返回值:如果调用fread()或fwrite()成功,则函数返回值等于count。
位置指针复位函数 rewind
文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。 如果想改变系统这种读写规律,可使用有关文件定位的函数。
rewind函数调用形式为
rewind(文件指针);
函数的功能:使文件的位置指针返回到文件头。其中文件指针必须是有效的文件指针,即已指向文件。
格式化读写函数fscanf和fprintf
fscanf()和fprintf()函数的操作对象是指定文件,
scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。
按格式化读取函数fscanf()
int fscanf(FILE *fp, char *format, &a1,&a2,…&an)
int fscanf(文件指针, “格式符”, 输入变量首地址表);
调用形式:
fscanf( fp, format, &a1, &a2, &a3);
作用:按format给出的输入控制符,把从fp中读取的内容,分别赋给变元a1,a2,…an。
按格式化写入函数fprintf()
int fprintf(FILE *fp, char *format, a1,a2,…an);
作用: 按format给出的输出控制符,将变元a1,a2,…an的值写入到fp所指的文件中去。
随机读写与fseek()函数
对于流式文件,既可以顺序读写,也可随机读写
所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。
所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。
用法:int fseek(文件指针,位移量,参照点);
功能:将指定文件的位置指针,从参照点开始,移动指定的字节数