第十章 文件
§ 12.1 C文件概述
文件:存储在外部介质上数据的集合,是操作系统数据管理的单位使用数据文件的目的
1、数据文件的改动不引起程序的改动 ——程序与数据分离
2、不同程序可以访问同一数据文件中的数据 ——数据共享
3、能 长期保存 程序运行的中间数据或结果数据
文件分类
按文件的逻辑结构:
记录文件:由具有一定结构的记录组成(定长和不定长)
流式文件,由一个个字符(字节)数据顺序组成
按存储介质:
普通文件:存储介质文件(磁盘、磁带等)
设备文件,非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件,ASCII文件,每个字节存放一个字符的 ASCII码
二进制文件,数据按其在内存中的存储形式原样存放
§ 12.2 文件类型指针
文件结构体 FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区
文件信息用系统定义的名为 FILE的结构体描述
FILE定义在 stdio.h中
typedef struct
{ short level; //缓冲区满或空的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
short bsize; //缓冲区大小
unsigned char *curp; //指针,当前的指向
unsigned char *buff; //数据 缓冲区位置
unsigned istemp; //临时文件,指示器
short token; //用于有效性检查
}FILE;
文件类型指针
指针变量说明,FILE *fp;
用法:
文件打开 时,系统 自动 建立文件结构体,
并把指向它的指针返回来,程序通过这个指针获得 文件信息,访问文件
文件关闭 后,它的文件结构体被释放
§ 12.3 文件的打开与关闭
C文件操作用 库函数 实现,包含在 stdio.h
文件使用方式,打开文件 -->文件读 /写 -->关闭文件
系统 自动 打开和关闭三个 标准文件,
标准输入 ------键盘 stdin
标准输出 ------显示器 stdout
标准出错输出 -----显示器 stderr
打开文件 fopen
函数原型,FILE *fopen(char *name,char *mode)
功能:按指定方式打开文件
返值:正常打开,为指向文件结构体的指针;
打开失败,为 NULL
要打开的文件名使用文件方式例 文件打开与测试
FILE *fp;
fp=fopen(“aa.c”,“w”);
if(fp==NULL)
{ printf(“File open error!\n”);
exit(0);
}
例 FILE *fp;
fp= fopen (“c:\zhou\test.dat”,”r”);
例 FILE *fp;
char *filename=“c:\zhou\test.dat”
fp= fopen(filename,”r”);“r+/rb+” (读写 )
“a/ab” (追加 )
“w/wb” (只写 )
“r/rb” (只读 )
“w+/wb+” (读写 )
“a+/ab+” (读写 )
为 输入 打开一个文本 /二进制文件为 输出 打开或建立一个文本 /二进制文件为读 /写打开一个文本 /二进制文件为读 /写建立一个文本 /二进制文件为读 /写打开或建立一个文本 /二进制文件向文本 /二进制文件尾 追加 数据文件使用方式 含义
文件关闭 fclose
作用,使文件指针变量与文件“脱钩”,释放文件结构体和文件指针
函数原型,int fclose(FILE *fp)
功能:关闭 fp指向的文件
返值:正常关闭为 0;出错时,非 0文件打开时返回的文件类型指针
§ 12.4 文件的读写
字符 I/O:fputc与 fgetc
fputc
函数原型,fputc(ch,fp)
功能:把一字符 ch写入 fp指向的文件中
返值:正常,返回 ch;出错,为 EOF
fgetc
函数原型,fgetc(fp)
功能:从 fp指向的文件中读取 一字符
返值:正常,返回读到的代码值 ;读到文件尾或出错,为 EOF
数据块 I/O:fread与 fwrite
函数原型:
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
功能:读 /写数据块
返值:成功,返回读 /写的块数;出错或文件尾,返回 0
说明:
buffer,指向要输入 /输出数据块的首地址的指针
size,每个要读 /写的数据块的大小(字节数)
count,要读 /写的数据块的个数
fp,要读 /写的文件指针
fread与 fwrite 一般用于 二进制文件 的输入 /输出例 struct student
{ int num;
char name[20];
char sex;
int age;
float score[3];
}stud[10];
for(i=0;i<10;i++)
fread(&stud[i],sizeof(struct student),1,fp);
格式化 I/O:fprintf与 fscanf
函数原型:
fprintf(文件指针,格式字符串,输出表列 )
fscanf(文件指针,格式字符串,输出表列 )
功能:按格式对文件进行 I/O操作
返值:成功,返回 I/O的个数 ;出错或文件尾,返回 EOF
例 fprintf(fp,“%d,%6.2f”,i,t); //将 i和 t按 %d,%6.2f格式输出到
fp文件
fscanf(fp,“%d,%f”,&i,&t); //若文件中有 3,4.5,则将 3送入 i,
4.5送入 t
§ 12.5 文件的定位
几个概念
文件位置指针 -----指向当前读写位置的指针
读写方式
顺序读写:位置指针按字节位置顺序移动,叫 ~
随机读写:位置指针按需要移动到任意位置,叫 ~
rewind函数
函数原型,void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返值:无
fseek函数
函数原型,fseek(文件类型指针,位移量,起始点 )
功能:改变文件位置指针的位置
返值:成功,返回 0;失败,返回非 0值文件指针位移量(以起始点为基点,移动的字节数 )
>0 向后移动
<0 向前移动起始点文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例 fseek(fp,100L,0); //将位置指针移到离文件头 100个字节处
fseek(fp,50L,1); //将位置指针移到离当前位置 50个字节处
fseek(fp,-10L,2); //将位置指针从文件末尾处向后退 10个字节