1、C语言程序设计,第12章 文件,文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,使用数据文件的目的 1、数据文件的改动不引起程序的改动程序与数据分离 2、不同程序可以访问同一数据文件中的数据数据共享 3、能长期保存程序运行的中间数据或结果数据,文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存
2、储形式原样存放,12.1 C文件概述,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区,文件处理方法,文件结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中 指针变量说明: FILE *fp;,typedef struct int _fd; /文件号int _cleft; /缓冲区中剩下的字符数int _mode; /
3、文件操作方式char *_next; /文件当前读写位置char *_buff; /文件缓冲区位置 FILE;,12.2 文件类型指针,C文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件文件读/写关闭文件 打开文件fopen 函数原型: FILE *fopen(“文件名”,“访问方式”),功能:按指定方式打开文件 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL,要打开的文件名,使用文件方式,例 文件打开与测试 FILE *fp;fp=fopen(“aa.c”,“w”);if(fp=NULL) printf(“File open error!n”);exit(0)
4、;,例 FILE *fp;fp= fopen (“c:fengyibkctest.txt”,”r”);,12.3 文件的打开与关闭,作用:使文件指针与文件“脱钩”,释放缓冲区单元 函数原型:int fclose(FILE *fp),功能:关闭fp指向的文件 返回值:正常关闭为0;出错时为非0,文件打开时返回的文件类型指针,不关闭文件可能会丢失数据,文件关闭fclose,字符I/O:fputc与fgetc fputc 函数原型:int fputc(int c, FILE *fp) 功能:把一字符代码c写入fp指向的文件中 返值:正常,返回c;出错,为EOF,fgetc 函数原型:int fget
5、c(FILE *fp) 功能:从fp指向的文件中读取一字符 返值:正常,返回读到的字符;读到文件尾或出错,为EOF,13.4 文件的读写,函数原型:,fread(buffer, size,count,fp) fwrite(buffer,size, count,fp),功能:读/写数据块 返回值:成功,返回读/写的块数;出错或文件尾,返回0 说明: buffer: 指向要输入/输出数据块的首地址的指针 size: 每个要读/写的数据块的大小(字节数) count: 要读/写的数据块的个数 fp: 要读/写的文件指针 fread与fwrite 一般用于二进制文件的输入/输出,数据块I/O:frea
6、d与fwrite,例 float f2;FILE *fp;fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);,for(i=0;i2;i+)fread(,例 struct student int num;char name20;char sex;int age;float score3;stud10;for(i=0;i10;i+)fread(,例12.1 程序填空:将数组a的4个元素和数组b的6个元素写到名为lett.dat的二进制文件中,#include “stdio.h” main() FILE *fp;char a4=“1234”,b6=“abcdef”;if
7、( (fp=fopen(“_”,”wb”)=NULL) exit(0)fwrite(a,sizeof(char),4,fp);fwrite(b,_,1,fp);fclose(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”, /若文件中有3,4.5 ,
8、则将3送入i, 4.5送入t,字符串I/O: fgets与fputs,函数原型:,char *fgets(char *s,int n,FILE *fp) int fputs(char *s,FILE *fp),功能:从fp指向的文件读/写一个字符串 返值: fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULL fputs正常时返回写入的最后一个字符;出错为EOF,fgets从fp所指文件读n-1个字符送入s指向的内存区, 并在最后加一个0 (若读入n-1个字符前遇换行符或文件尾(EOF)即结束),fputs把s指向的字符串写入fp指向的文件,几个概念 文件位置指针-指向当前读写位
9、置的指针 读写方式 顺序读写:位置指针按字节位置顺序移动,叫 随机读写:位置指针按需要移动到任意位置,叫 rewind函数 函数原型: void rewind(FILE *fp) 功能:重置文件位置指针到文件开头 返值:无,13.5 文件的定位,函数原型:int fseek(FILE *fp,long offset,int whence) 功能:改变文件位置指针的位置 返值:成功,返回0;失败,返回非0值,文件指针,位移量(以起始点为基点,移动的字节数) 0 向后移动 0 向前移动,起始点 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2,例
10、fseek(fp,100L,0);fseek(fp,50L,1);、fseek(fp,-10L,2);,fseek函数,ferror函数 函数原型: int ferror(FILE *fp) 功能:测试文件是否出现错误 返值:未出错,0;出错,非0 说明 每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试 fopen打开文件时,ferror函数初值自动置为0,13.6 出错的检测,函数原型: void clearerr(FILE *fp) 功能:使文件错误标志置为0 返值:无 说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数,clearerr函数,作业,验证上课和书上的例题 在上机作业中任选二道完成实验报告,