第8章 文件 P201 8.1 了解文件的处理过程 8.2 掌握文件的基本操作本领 8.3 文件的应用举例 *贯穿教学全过程的实例
8.1 了解文件的处理过程 P202 1.文件的概念 “文件”是指存储在外部介质上的数据集合。 如用Word写出的文章 用Excel设计的统计表 用C语言编写的程序 在磁盘中存放的文件叫做磁盘文件。 返回
8.1 了解文件的处理过程 P202 2.文件的存储 根据文件的组织形式,C语言中将文件分为文本文件和二进制文件,它们是常用的两种文件。 返回
8.1 了解文件的处理过程 P202 返回 123 00000000 01111011 123按二进制文件存放形式 00000000 01111011 123按二进制文件存放形式 123 123按文本文件存放形式 00110001 00110010 00101110 '1' (49) '2' (50) '3' (51) 返回
8.1 了解文件的处理过程 P202 3.文件的处理 文件的处理必须包括打开文件、读或写文件、关闭文件这3个过程。 返回
8.1 了解文件的处理过程 P202 磁盘文件 内存储器 数据 存储区 文件 缓冲区 …… 打开文件前文件与内存储器没有任何关系 返回
…… 8.1 了解文件的处理过程 P202 返回 文件 数据 缓冲区 磁盘文件 存储区 内存储器 打开文件时磁盘文件与文件缓冲区取得联系,做好读写准备 返回
8.1 了解文件的处理过程 P202 磁盘文件 内存储器 数据 存储区 文件 缓冲区 …… 写文件的过程 返回
8.1 了解文件的处理过程 P202 磁盘文件 内存储器 数据 存储区 文件 缓冲区 …… 读文件的过程 返回
8.1 了解文件的处理过程 P202 磁盘文件 内存储器 数据 存储区 文件 缓冲区 …… 关闭文件时磁盘文件与文件缓冲区断开联系 返回
8.1 了解文件的处理过程 P202 4.文件指针 打开文件和关闭文件的操作都通过文件指针实现。 文件指针是FILE类型,FILE类型已由系统声明,可直接用。 返回
8.2 掌握文件的基本操作本领 P203 8.2.1 创建文本文件 8.2.2 读取文本文件中的数据 8.2.3 创建二进制文件 8.2.4 读取二进制文件中的数据 返回
8.2.1 创建文本文件 P203 【实例8.1】编写程序,输入3种商品的品名、购买数量和单价,并用这些数据创建名为“f8_1.txt”的文本文件。 编程思路 打开文件用fopen函数,关闭文件用fclose函数,写文件用fprintf、fputc、fputs或fwrite等函数。
#include <stdio.h> main() { char nam[10]="\0"; int n=0,i=0; float pc=0.0; FILE *fp=NULL; fp=fopen("d:\\f8_1.txt","w"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); } 文本文件为写打开时可用“w”或“a”
printf("Input name_number_price:\n"); for(i=1; i<=3; i++) { scanf("%s %d %f",nam,&n,&pc); fprintf(fp,"%s %d %f\n",nam,n,pc); } fclose(fp);
8.2.2 读取文本文件中的数据 P205 【实例8.2】编写程序,从实例8.1所创建的文件“f8_1.txt”中读取数据计算购买每种商品所用的金额和购买3种商品所用的总金额。 编程思路 读文件用fscanf函数。 读文件时,每读一次判断是否读完,用feof函数实现。
#include <stdio.h> main() { char nam[10]="\0"; int n=0; float pc=0.0,s=0.0,sum=0.0; FILE *fp=NULL; fp=fopen("d:\\f8_1.txt","r"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); } 文本文件为读打开时可用“r”
fscanf(fp,"%s %d %f",nam,&n,&pc); while(feof(fp)==0) { printf("%17s%5d%9.2f",nam,n,pc); s=pc*n; sum=sum+s; printf("%9.2f\n",s); } fclose(fp); printf("Total:%8.2f\n",sum);
8.2.3 创建二进制文件 P207 【实例8.3】编写程序,输入3种商品的品名、购买数量和单价,并用这些数据创建名为“f8_3.dat”的二进制文件。 编程思路 创建二进制文件时要将数据块作为一个单位写到文件中。 写文件用fwrite函数。
#include <stdio.h> typedef struct goods { char nam[10]; int n; float pc; }GOODS;
二进制文件为写打开时可用“wb”或“ab” main() { GOODS g={0}; int i=0; float temp=0.0; FILE *fp=NULL; fp=fopen("d:\\f8_3.dat","wb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); } 二进制文件为写打开时可用“wb”或“ab”
printf("Input name_number_price:\n"); for(i=0; i<3; i++) { scanf("%s %d %f", g.nam,&g.n,&temp); g.pc=temp; fwrite(&g,sizeof(GOODS),1,fp); } fclose(fp);
8.2.4 读取二进制文件中的数据 P208 【实例8.4】编写程序,从实例8.3所创建的文件“f8_3.dat”中读取数据计算购买每种商品所用的金额和购买3种商品所用的总金额。 编程思路 从文件“f8_3.dat”中读取数据时,要用二进制文件模式。写文件用fread函数。
#include <stdio.h> typedef struct goods { char nam[10]; int n; float pc; }GOODS;
main() { GOODS g={0}; float s=0.0,sum=0.0; FILE *fp=NULL; fp=fopen("d:\\f8_3.dat","rb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); } 二进制文件为读打开时可用“rb”
fread(&g,sizeof(GOODS),1,fp); while(feof(fp)==0) { printf("%17s%5d%9.2f", g.nam,g.n,g.pc); s=g.pc*g.n; sum=sum+s; printf("%9.2f\n",s); } fclose(fp); printf("Total:%8.2f\n",sum);
8.3 文件的应用举例 P209 8.3.1 编写算术考试程序 8.3.2 编写阅卷程序 8.3.3 复制文件 8.3.4 修改文件 返回
8.3.1 编写算术考试程序 P209 编程思路 在同一时刻,1个文件指针只能指向1个文件,为了同时创建2个文件,需要定义2个文件指针。 【实例8.5】编写程序,给小学生出4道100以内2个数的加法题,最后分别将题目与学生的答题结果和正确答案保存在“f8_5_1.txt”和“f8_5_2.txt”文件中。 编程思路 在同一时刻,1个文件指针只能指向1个文件,为了同时创建2个文件,需要定义2个文件指针。
#include <stdio.h> #include <stdlib.h> #include <time.h> main() { int i=0,op1=0,op2=0,pupil=0,answer=0; FILE *fp=NULL,*fq=NULL; fp=fopen("d:\\f8_5_1.txt","w"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
fq=fopen("d:\\f8_5_2.txt","w"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
randomize(); for(i=1; i<=4; i++) { op1=random(100); op2=random(100); printf("%d+%d=",op1,op2); scanf("%d",&pupil); answer=op1+op2; fprintf(fp,"%d %d %d\n", op1,op2,pupil); fprintf(fq,"%d\n",answer); } fclose(fp); fclose(fq);
8.3.2 编写阅卷程序 P211 【实例8.6】编写程序,对实例8.5中小学生所做的答案进行阅卷,每道题分数为25。 编程思路 用读模式打开2个文件,并逐个比较学生答案和正确答案,只要答案相等,对总分加25。
#include <stdio.h> main() { int i=0,op1=0,op2=0,pupil=0, answer=0,total=0; FILE *fp=NULL,*fq=NULL; fp=fopen("d:\\f8_5_1.txt","r"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
fq=fopen("d:\\f8_5_2.txt","r"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
for(i=1; i<=4; i++) { fscanf(fp,"%d %d %d", &op1,&op2,&pupil); fscanf(fq,"%d",&answer); printf("%d+%d=%d %d ", op1,op2,pupil,answer); if(pupil==answer) {total=total+25; printf("Right!\n"); } else printf("Wrong!\n"); } fclose(fp); fclose(fq);
8.3.3 复制文件 P212 【实例8.7】编写程序,将实例8.3建立的文件“f8_3.dat”中内容复制到文件“f8_7.dat”中。 编程思路 复制文件的过程就是逐个读取一个文件中内容的的同时,再写入另一个文件中。
#include <stdio.h> typedef struct goods { char nam[10]; int n; float pc; }GOODS;
main() { GOODS g={0}; FILE *fp=NULL,*fq=NULL; fp=fopen("d:\\f8_3.dat","rb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
fq=fopen("d:\\f8_7.dat","wb"); if(fq==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
fread(&g,sizeof(GOODS),1,fp); while(feof(fp)==0) { fwrite(&g,sizeof(GOODS),1,fq); } fclose(fp); fclose(fq);
8.3.4 修改文件 P213 【实例8.8】编写程序,修改实例8.3建立的文件“f8_3.dat”中某商品的单价,商品名和单价由键盘输入。 编程思路 文件中读取数据存放到数组中,若要修改,修改后的单价存放到数组中,最后将数组中的数据写入原文件。
#include <stdio.h> typedef struct goods { char nam[10]; int n; float pc; }GOODS;
main() { GOODS g[3]={0}; char n[10]=""; int i=0; float new_pc=0.0; FILE *fp=NULL; fp=fopen("d:\\f8_3.dat","rb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
scanf("%s %f",n,&new_pc); fread(&g[i],sizeof(GOODS),1,fp); while(feof(fp)==0) { if(strcmp(g[i].nam,n)==0) g[i].pc=new_pc; i++; fread(&g[i],sizeof(GOODS),1,fp); } fclose(fp);
fp=fopen("d:\\f8_3.dat","wb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); }
fp=fopen("d:\\f8_3.dat","wb"); if(fp==NULL) { printf("Open error!!!\n"); getch(); exit(0); } for(i=0; i<3; i++) fwrite(&g[i],sizeof(GOODS),1,fp); fclose(fp);
贯穿教学全过程的实例 P215 根据教材第215~223页上机操作 返回