一、C文件概述
文件:存储在外部介质上的数据的集合,是操作系统数据管理的单位。
使用数据文件的目的
1、数据文件的改的不影响程序的改动--程序与数据分离
2、不同程序可以访问同一数据文件中的数据--数据共享
3、能长期保存程序运行的中间数据或结果数据
二、文件的分类
1、按存储介质:
普通文件:存储介质文件(磁盘、磁带等)
设备文件:非存储介质(键盘、显示器、打印机等)
2、按数据的组织形式
文本文件:ASCII文件,每个字节存放一个字符的ASCII码
二进制文件:数据按其在内存中的存储形式原样存放
3、C语言的文件时流式文件
所谓流就是一系列的字节或者字符,输入输出数据流的开始和结束仅受程序控制,而不受物理符号(如回车符)的控制。这种文件称为流式文件
4、文件处理方法:
缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区,可减少主机和外部设备频繁交换数据的次数。
非缓冲文件系统:低级文件系统,由用户在程序中为每个文件开辟缓冲区。
三、文件类型的指针
1、文件结构体类型FILE
缓冲文件系统为每个正在使用的文件在内存中开辟文件信息区
文件信息用系统定义的名为FILE的结构体描述
在stdio.h文件中有以下的文件类型声明:
1 typedef struct 2 { 3 short level; /*缓冲区“满”或“空”的程度*/ 4 unsigned flags; /*文件状态标志*/ 5 char fd; /*文件描述符*/ 6 unsigned char hold; /*如无缓冲区不读取字符*/ 7 short bsizse; /*缓冲区的大小*/ 8 unsigned char *buffer; /*数据缓冲区的位置*/ 9 unsigned char *curp; /*指针,当前的指向*/ 10 unsigned istemp; /*临时文件,指示器*/ 11 short token; /*用于有效性检查*/ 12 }FILE;
2、定义文件类型变量
存放文件的信息
如:定义FILE类型数组,存放若干文件信息:FILE f[5];
定义文件类型指针变量,指向FILE类型结构体变量,通过该结构体变量中的文件信息访问文件。
如:FILE *fp;
四、文件的打开与关闭
C文件操作用库函数实现,包含在stdio.h
1、文件使用方式:打开文件--文件读写---关闭文件
2、文件打开(fopen函数)
函数原型:FILE *fopen(char *name, char *mode)
调用方式:fopen(“文件名”,“使用文件方式”)
例如:FILE *fp;
fp = fopen("d:\user\myfile.txt","r");
返回值:正常打开,返回指向文件结构体的指针,打开失败,返回NULL
注:(文件的几种操作方式)
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
3、文件的关闭(fclose函数)
作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针
返回值:用于表示文件是否被正常关闭,如果文件顺利关闭,该值为0;否则为-1(EOF)
返回值可以用ferror函数测试
4、文件的读写
文件打开之后,就可以对它进行读写操作
(1)读/写文件中的一个字符
fputc函数(putc函数)----写
函数原型:int fputc(int c,FILE *fp)
功能:把一字节代码c写入fp指向的文件中
返回值:正常,返回c,出错,为EOF
fgetc函数(getc)
函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码
返回值:返回独到的代码值,独到文件尾或出错为EOF
feof函数
调用方式:feof(fp)
功能:对于二进制文件读取时判断文件是否结束
返回值:结束:-1,反之0
(2)数据块输入输出函数:fread与fwrite
一般调用形式:
fread(buffer,size,count,fp);
fread(buffer,size,count,fp);
参数说明:
buffer:要读入的数据块的存放首地址或要输出的数据块的起始地址
size:每个要读/写的数据块的个数
count:要读/写的数据块的个数
fp:要读/写的文件指针
返回值:成功,返count值,出错或文件尾,0值
fread与fwrite一般用于二进制文件的输入输出
(3)按指定格式读写文件的函数:fprintf和fscanf
一般调用格式:fscanf(fp,格式字符串,输入列表);
fprintf(fp,格式字符串,输入列表);
返回值:成功,返回I/O的个数,出错或文件尾,返回EOF
由于输入输出时要进行ASCII码和二进制形式的转换,费时较多
1 fscanf(fp,"%d,%f",&i,&t"); 2 /*若文件中有,3,4.5,则将3读出送入i,4.5读出送入t*/ 3 fprintf(fp,"%d,%6.2f",i,t); 4 /*将i和t按%d,%6.2f格式写入到fp文件*/
(4)其他读写函数
1、putw和getw函数
作用:以二进制形式,对磁盘文件读写一个int型的整数,4个字节
返回值:成功:所写的整数值,失败:EOF
eg:putw(10,fp);
i=getw(fp);
2、fgets和fputs函数(逐行读出、写入)
形式:fgets(str,n,fp);(str字符数组,n-1个字符)
fputs(字符串,fp);(“ ”不输出)
作用:从fp指向的文件读/写一个字符串
返回值:
fgets正常时返回字符串的首地址,出错或文件尾,NULL
fputs正常时返回写入的最后一个字符;出错为EOF
五、文件的定位
几个概念:
文件位置指针---指向当前读写位置的指针,具体位置由文件打开方式确定
“r”、"w":指向文件头
“a”:指向文件尾
读写方式:
顺序读写:位置指针按字节位置顺序移动
随机读写:位置指针按需要移动到任意位置
(1)rewind函数:
函数原型:void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返回值:无
(2)fseek函数和随机读写
调用形式:fseek(文件类型指针,位移量,起始点)
位移量:>0向后移,<0向前移
起始点:文件开始:SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
功能:改变文件位置指针的位置
返回值:成功,返回值,失败,返回非0值
(3)ftell函数
函数原型:long ftell(FILE *fp)
功能:得到流式文件中位置指针当前位置(用相对于文件开头的位移量表示)
返回值:返回当前位置指针位置,失败,返回-1L