第12章 文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输出文件缓冲区 缓冲区
§13.2 文件类型指针
文件结构体FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信 息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中 typedef struct { int _fd; int _cleft; int _mode; char *_next; char *_buff; }FILE; //文件号 //缓冲区中剩下的字符数 //文件操作方式 //文件当前读写位置 //文件缓冲区位置
数据块I/O:fread与fwrite
函数原型: size_t fread(void *buffer,size_t size, size_t count,FILE *fp) size_t fwrite(void *buffer,size_t size, size_t count,FILE *fp) 功能:读/写数据块 返值:成功,返回读/写的块数;出错或文件尾,返回0 说明:
for(i=0;i<2;i++) fread(&f[i],4,1,fp);
例 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);
typedef unsigned size_t; buffer: 指向要输入/输出数据块的首地址的指针 size: 每个要读/写的数据块的大小(字节数) count: 要读/写的数据块的个数 fp: 要读/写的文件指针 fread与fwrite 一般用于二进制文件的输入/输出
例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);
按存储介质:
普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放
文本文件特点: 存储量大、速度慢、便于对字符操作
如 int型数10000 ASCII形式 0011000100110000001100000011000000110000 0010011100010000 0010011100010000 内存存储形式 二进制形式
#include <stdio.h> 例 从键盘输入字符,逐个 #include <stdio.h> main() 存到磁盘文件中,直到 main() FILE *in, 输入‘#“为止 {{ FILE *fp; *out; 判断二进制文件是否结束 char ch,infile[10],outfile[10]; char ch,*filename=“out.txt”; #include <stdio.h> while(!feof(fp)) scanf("%s",infile); if((fp=fopen(filename,"w"))==NULL) main() Ch12_1.c {printf("cannot open c=fgetc(fp); {scanf("%s",outfile); file\n"); { FILE *fp; if ((in =…….. fopen(infile, "r"))== NULL) exit(0); 例 读文本文件内容, char ch,*filename=“out.txt”; } { printf("Cannot open infile.\n"); } if((fp=fopen(filename,”r"))==NULL) 并显示 exit(0); printf("Please inputopen file\n"); { printf("cannot string:"); } ch=getchar(); 例 文件拷贝 exit(0); feof if ((out = fopen(outfile, "w"))== NULL) while(ch!='#') } { printf("Cannot 函数原型: int feof(FILE *fp) open outfile.\n"); fputc(ch,fp); { while((ch=fgetc(fp))!=EOF) Ch12_2.c exit(0); 功能:判断文件是否结束 putchar(ch); } ch=getchar(); 返值:文件结束,返回真(非0);文件未结束,返回0 fclose(fp); 判断文本文件是否结束 while (!feof(in)) }} fputc(fgetc(in), out); fclose(fp); } fclose(in); fclose(out); }
缓冲文件系统:
不关闭文件可能会丢失数据
磁盘文件
输入文件缓冲区 程序数据区 a
输出文件缓Hale Waihona Puke Baidu区
fclose
§13.4 文件的读写
字符I/O:fputc与fgetc
fputc
函数原型:int
fputc(int c, FILE *fp)
功能:把一字节代码c写入fp指向的文件中 返值:正常,返回c;出错,为EOF
二进制文件特点: 存储量小、速度快、便于存放中间结果
文件处理方法
缓冲文件系统:高级文件系统,系统自动为正在使用 的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为 每个文件设定缓冲区
程序 输入文件缓冲区 缓冲文件系统: 非缓冲文件系统: 指令区 程序数据区 用户数据区 a 磁盘文件 磁盘
含义 文件使用方式 C文件操作用库函数实现,包含在stdio.h
打开文件fopen
函数原型: FILE *fopen(char *name,char *mode) 功能:按指定方式打开文件 要打开的文件名 返值:正常打开,为指向文件结构体的指针;打 开失败,为NULL
文件关闭fclose
作用:使文件指针变量与文件“脱钩”,释放文件结构 体和文件指针 函数原型:int fclose(FILE *fp) 功能:关闭fp指向的文件 返值:正常关闭为0;出错时,非0 文件打开时返回的文件类型指针
文件类型指针
指针变量说明: FILE *fp; 用法:
文件打开时,系统自动建立文件结构体,并把指向它的指针 返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放 文件名 C程序 文件使用 方式 文件类型指针 操作系统
磁盘
§13.3 文件的打开与关闭
例 文件打开与测试 “r/rb” (只读) FILE *fp; 为输入打开一个文本/二进制文件 文件使用方式:打开文件-->文件读/写-->关闭文件 “w/wb” (只写) fp=fopen(“aa.c”,“w”); 为输出打开或建立一个文本/二进制文件 系统自动打开和关闭三个标准文件: “a/ab” (追加) if(fp==NULL) 向文本/二进制文件尾追加数据 标准输入------键盘 例 FILE printf(“File open stdin *fp; error!\n”); 例 FILE “r+/rb+” (读写){ *fp; 为读/写打开一个文本/二进制文件 char *filename=“c:\\fengyi\\bkc\\test.dat” 标准输出------显示器 stdout exit(0); fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); “w+/wb+” (读写) fopen(filename,”r”); 为读/写建立一个文本/二进制文件 fp= 标准出错输出-----显示器 stderr } “a+/ab+” (读写) 为读/写打开或建立一个文本/二进制文件 使用文件方式
例 从键盘输入4个学生数据,把他们转存到磁盘文件中去
Ch12_3.c
void save() void display() #include <stdio.h> { {FILE *fp; FILE *fp; #define SIZE 2 int i; i; int struct student_type if((fp=fopen("d:\\fengyi\\exe\\stu_dat","wb"))==NULL) if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL) { char name[10]; { { printf("cannot open file\n"); printf("cannot open file\n"); int num; return; return; int age; }} char addr[15]; for(i=0;i<SIZE;i++) for(i=0;i<SIZE;i++) }stud[SIZE]; if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) { fread(&stud[i],sizeof(struct student_type),1,fp); main() printf("file write error\n"); printf("%-10s %4d %4d %-15s\n",stud[i].name, { fclose(fp); stud[i].num,stud[i].age,stud[i].addr); int i; } for(i=0;i<SIZE;i++) } fclose(fp); scanf("%s%d%d%s",stud[i].name,&stud[i].num, } &stud[i].age,stud[i].addr); save(); display(); }
格式化I/O:fprintf与fscanf
#include <stdio.h> 函数原型: main() int fprintf(FILE *fp,const char *format[,argument,…]) { char *fp,const char *format[,address,…]) int fscanf(FILE s[80],c[80]; int a,b; 功能:按格式对文件进行I/O操作 FILE *fp; 返值:成功,返回I/O的个数;出错或文件尾,返回EOF if((fp=fopen("test","w"))==NULL) { puts("can't open file"); exit() ; } 例 fprintf(fp,“%d,%6.2f”,i,t); //将i和t按%d,%6.2f格式输出到fp文件 fscanf(stdin,"%s%d",s,&a);/*read from keaboard*/ fscanf(fp,“%d,%f”,&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t fprintf(fp,"%s %d",s,a);/*write to file*/ fclose(fp); 例 从键盘按格式输入数据存到磁盘文件中去 if((fp=fopen("test","r"))==NULL) { puts("can't open file"); exit(); } Ch12_70.c fscanf(fp,"%s%d",c,&b);/*read from file*/ fprintf(stdout,"%s %d",c,b);/*print to screen*/ fclose(fp); }
fgetc
函数原型:int
fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF
#define #define #define #define
文件I/O与终端I/O putc(ch,fp) fputc(ch,fp) getc(fp) fgetc(fp) putchar( c ) fputc(c,stdout) getchar( ) fgetc(stdin)
§ 13.1 C文件概述
第十三章
文件
文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 使用数据文件的目的 1、数据文件的改动不引起程序的改动——程序与数据分离 2、不同程序可以访问同一数据文件中的数据——数据共享 3、能长期保存程序运行的中间数据或结果数据
§ 文件分类
按文件的逻辑结构:
记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成