- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.3.1 文件的打开与关闭
C文件操作用库函数实现,包含在stdio.h 例 文件打开与测试 含义 文件使用方式 文件使用方式:打开文件-->文件读/写-->关闭文件 FILE *fp; “r/rb” (只读) 为输入打开一个文本/二进制文件 系统自动打开和关闭三个标准文件: fp=fopen(“aa.c”,“w”);
例 从键盘输入4个学生数据,把他们转存到磁盘文件中去
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(); }
文件处理方法
缓冲文件系统:高级文件系统,系统自动为正在使用 的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为 每个文件设定缓冲区
程序 输入文件缓冲区 缓冲文件系统: 非缓冲文件系统: 指令区 程序数据区 用户数据区 a 磁盘文件 磁盘
输出文件缓冲区 缓冲区
10.2 文件类型指针
文本文件特点: 存储量大、速度慢、便于对字符操作
如 int型数10000 ASCII形式 0011000100110000001100000011000000110000 0010011100010000 0010011100010000 内存存储形式 二进制形式
二进制文件特点: 存储量小、速度快、便于存放中间结果
字符串读写函数: fgets与fputs #include<stdio.h> 函数形式: fgets(str,n,fp ) main() { fp) fputs(str,FILE *fp;
char string[81]; 功能:从fp指向的文件读/写一个字符串 if((fp=fopen("file.txt","w"))==NULL) 返值: fputs把str指向的字符串写入fp指向的文件 { printf("cann't open file");exit(0); fgets从fp所指文件读n-1个字符送入s指向的内存区, } fgets正常时返回读取字符串的首地址;出错或文件尾,返回 并在最后加一个‘\0’while(strlen(gets(string))>0) NULL { fputs(string,fp); (若读入n-1个字符前遇换行符或文件尾(EOF)即结束) fputs正常时返回写入的最后一个字符;出错为EOF fputs("\n",fp); 例 从键盘读入字符串存入文件,再从文件读回显示 } fclose(fp); if((fp=fopen("file.txt","r"))==NULL) { printf("cann't open file");exit(0); } while(fgets(string,81,fp)!=NULL) fputs(string,stdout); fclose(fp); }
例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);
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);
例 FILE *fp; char *filename=“c:\\fengyi\\bkc\\test.dat” exit(0); fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); 标准出错输出-----显示器 stderr “r+/rb+” (读写) 为读/写打开一个文本/二进制文件 fp= fopen(filename,”r”); } error!\n”); “a/ab” 例 FILE *fp; 向文本/二进制文件尾追加数据 (追加) { printf(“File open stdout 标准输出------显示器
“w/wb”标准输入------键盘 (只写) if(fp==NULL) stdin 为输出打开或建立一个文本/二进制文件
打开文件fopen “w+/wb+” (读写)
为读/写建立一个文本/二进制文件 函数形式: 为读/写打开或建立一个文本/二进制文件 fopen(文件名,使用文件方式 ) 文件名, “a+/ab+” (读写)
功能:按指定方式打开文件 返值:正常打开,为指向文件结构体的指针;打 开失败,为NULL
文件关闭fclose
作用:使文件指针变量与文件“脱钩”,释放文件结构 体和文件指针 函数形式: fclose(文件指针 ) 功能:关闭文件指针fp指向的文件 返值:正常关闭为0;出错时,非0 文件打开时返回的文件类型指针
缓冲文件系统:
不关闭文件可能会丢失数据
磁盘文件
输入文件缓冲区 程序数据区 a
输出文件缓冲区
fclose
10.3.2 文件的读写
字符读写函数:fputc与fgetc
fputc
函数形式:fputc(fp) 功能:把一字节代码c写入文件指针fp指向的文件中 返值:正常,返回c;出错,为EOF
fgetc
函数形式:fgetc(fp) 功能:从文件指针fp指向的文件中读取一字节代码 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF
磁盘
10.3 缓冲文件系统
系统自动地在内存区为每个正在使用的文件名开辟 一个缓冲区,为程序中的每一个文件使用, 一个缓冲区,为程序中的每一个文件使用,当执行 读文件的操作时,从磁盘文件将数据先读入内存 读文件的操作时, “缓冲区”,装满后再从内存“缓冲区”依此读入 缓冲区” 装满后再从内存“缓冲区” 接收的变量。执行写文件的操作时, 接收的变量。执行写文件的操作时,先将数据写入 内存“缓冲区” 待内存“缓冲区” 内存“缓冲区”,待内存“缓冲区”装满后再写入 文件。 文件。
文件结构体FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信 息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中 typedef struct { int _fd; int _cleft; int _mode; char *_next; char *_buff; }FILE;
一个的字节组成,称为“流(stream)”,以字 节为单位访问,输入输出的数据流的开始 和结束仅受程序控制而不受物理符号(如 回车换行符)控制。
文件分类
按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放
#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)
#include <stdio.h> 例 从键盘输入字符,逐个 #include <stdio.h> main() 存到磁盘文件中,直到 main() { { FILE *in, *out; FILE *fp; 输入‘#“为止 char ch,infile[10],outfile[10]; char <stdio.h> #includech,*filename=“out.txt”; scanf("%s",infile); if((fp=fopen(filename,"w"))==NULL) main() scanf("%s",outfile); { printf("cannot open 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 input string:"); printf("cannot open file\n"); } ch=getchar(); 例 文件拷贝 exit(0); feof if while(ch!='#') ((out = fopen(outfile, "w"))== NULL) } 函数形式: feof(fp) { printf("Cannot open outfile.\n"); { fputc(ch,fp); while((ch=fgetc(fp))!=EOF) exit(0); 功能:判断文件是否结 putchar(ch); putchar(ch); 束 } ch=getchar(); fclose(fp); 判断文本文件是否结束 返值:文件结束,返回 while (!feof(in)) } 真(非0);文件未结束, } fputc(fgetc(in), out); fclose(fp); 返回0 fclose(in); fclose(out); } }