1、第11讲 文件,合肥师范学院计算机科学与技术系,1.16 文件的概念,语言中的文件是数据流 文件的两种数据形式:ASCII码 (文本文件 text stream)字符流二进制码(二进制文件 binary stream)二进制文件是直接把内存数据以二进制形式保存。 例如,整数1234 文本文件保存:49 50 51 52 (4个字符) 二进制文件保存: 04D2 (1234的二进制数),缓冲文件系统,内存单元 内存单元,数据,缓冲器,512字节,文件,由操作系统自动完成,程序控制,由于磁盘速度慢 直接把数据写到磁盘效率很低,缓冲文件系统,向磁盘输出数据:数据 缓冲区,装满缓冲区后 磁盘文件。 从
2、磁盘读入数据:先一次性从磁盘文件将一批数据输入到缓冲区,然后再从缓冲区逐个读入数据到变量。,数据,缓冲器,512字节,文件,由操作系统自动完成,程序控制,文件名,内存单元 内存单元,用什么标识,FILE:结构类型 用 typedef 定义,stdio.htypedef structshort level; /* 缓冲区使用量 */unsigned flags; /* 文件状态标志 */char fd; /* 文件描述符 */short bsize; /* 缓冲区大小 */unsigned char *buffer; /* 文件缓冲区的首地址 */unsigned char *curp; /*
3、指向文件缓冲区的工作指针 */unsigned char hold; /* 其他信息 */unsigned istemp; short token; FILE;,文件结构FILE,文件类型指针,FILE * fp 指向文件缓冲区,通过移动指针实现对文件的操作,fp,同时使用多个文件时,每个文件都有缓冲区,用不同的文件指针分别指示。,如何使fp与具体文件挂钩?,1.16.1 用fopen 打开文件,例 已知一个数据文件f.txt中保存了5个学生的计算机等级考试成绩,包括学号、姓名和分数,文件内容如下,请将文件的内容读出并显示到屏幕中。 301101 张文 91 301102 陈慧 85 3011
4、03 王卫东 76 301104 郑伟 69 301105 郭温涛 55,程序解析,#include “stdio.h“ int main(void) FILE * fp; /* 定义文件指针*/long num;char stname20;int score;if(fp = fopen(“f.txt“, “r“) = NULL) /* 打开文件 */printf(“File open error!n“);while( !feof(fp) )fscanf(fp, “%ld%s%d“, ,11.16.1 打开文件,if(fp = fopen(“f.txt“, “r“) = NULL)printf
5、(“File open error!n“); fopen(“文件名“,“文件打开方式“) 使文件指针与相应文件实体对应起来 程序对文件指针进行操作,即fp代表磁盘文件 函数fopen() 的返回值 执行成功,则返回包含文件缓冲区等信息的FILE型地址,赋给文件指针fp 不成功,则返回一个NULL(空值),文件打开方式,fp = fopen(“f.txt“, “r“) 文件打开方式参数表,文件读写与打开方式,if 读文件指定的文件必须存在,否则出错; if 写文件(指定的文件可以存在,也可以不存在)if 以 “w“ 方式写if 该文件已经存在原文件将被删去重新建立;else 按指定的名字新建一个
6、文件;else if 以 “a“ 方式写if 该文件已经存在写入的数据将被添加到指定文件原有数据的后面,不会删去原来的内容;else 按指定的名字新建一个文件(与“w”相同); if 文件同时读和写使用 “r+“、“w+“ 或 “a+“ 打开文件,1.16.2 用 fclose 关闭文件,if( fclose(fp) )printf( “Can not close the file!n“ ); fclose(文件指针) 把缓冲区中的数据写入磁盘扇区,确保写文件的正常完成 释放文件缓冲区单元和FILE结构体,使文件指针与具体文件脱钩。函数fclose() 的返回值 返回0:正常关闭文件 返回非0
7、:无法正常关闭文件,已知一个文本数据文件f1.txt,请将该文件复制一份,保存为f2.txt。新建一个文本文件f1.txt,将该文件与源程序放在同一目录下,执行程序,观察结果。,文件读写函数,字符读写函数: fgetc / fputc 字符串读写函数:fputs / fgets 格式化读写函数:fscanf / fprintf 二进制读写函数:fread / fwrite 其他相关函数: 检测文件结尾函数feof 检测文件读写出错函数ferror 清除末尾标志和出错标志函数clearerr 文件定位的函数fseek,#include int main(void) FILE *fp1,*fp2;
8、char c;if( fp1 = fopen( “f1.txt“, “r“ ) = NULL)printf(“ File open error!n“ );if( fp2 = fopen( “f2.txt“, “w“ ) = NULL)printf(“ File open error!n“ );while( !feof( fp1 ) )c = fgetc( fp1 );fputc(c, fp2);fclose( fp1 );fclose( fp2 );return 0; ,打开多个文件,if(fp1 = fopen(f1.txt, “r“) = NULL)printf(“File open er
9、ror!n“); if(fp2=fopen(“f2.txt“, “w“) = NULL)printf(“File open error!n“); C语言允许同时打开多个文件 不同的文件对应不同的文件指针 不允许同一个文件在关闭前再次打开,12.3.4 格式化文件读写fscanf和fprintf,fscanf(文件指针,格式字符串,输入表); fprintf(文件指针,格式字符串,输出表); 指定格式的输入输出函数FILE *fp; int n; float x; fp = fopen(“a.txt“, “r“); fscanf(fp,“%d%f“, 表示把变量n和x的数值写入文件b.txt,12.3.5 数据块读写fread()和fwrite(),fread(buffer, size, count, fp); 从二进制文件中读入一个数据块到变量 fwrite(buffer, size, count, fp); 向二进制文件中写入一个数据块 buffer:指针,表示存放数据的首地址; size:数据块的字节数 count:要读写的数据块块数 fp:文件指针,