210 likes | 427 Views
《C 语言程序设计 》. 第十二章 文 件. 主讲教师 : 杜风雷. 本 章 任 务. 任务 1 :将 5 个盘子的汉诺塔操作步骤输出到文件。 任务 2 :从文件中读入 50 个整数,按降序排列后输出到另一文件。 任务 3 :编程处理师生信息:编号、姓名、类别( T 老师, S 学生),如果是老师,增加工资信息(实型),如果是学生,增加成绩信息(整型)。从文件读入 5 名师生信息,教师工资增加 500 元,然后输出师生信息到另一文件。. 预 备 知 识. $12.1 文件 一、文件概念
E N D
《C语言程序设计》 第十二章 文 件 主讲教师: 杜风雷
本 章 任 务 任务1:将5个盘子的汉诺塔操作步骤输出到文件。 任务2:从文件中读入50个整数,按降序排列后输出到另一文件。 任务3:编程处理师生信息:编号、姓名、类别(T 老师,S 学生),如果是老师,增加工资信息(实型),如果是学生,增加成绩信息(整型)。从文件读入5名师生信息,教师工资增加500元,然后输出师生信息到另一文件。
预 备 知 识 $12.1 文件 一、文件概念 文件:一般指存储在外部介质上的数据的集合。广义而言,每一个也主机相联的输入输出设备都可以看作是一个文件。 比如:键盘是输入文件,显示屏和打印机是输出文件。 输入设备 程 序 流 文 件 抽 象 输出设备
预 备 知 识 二、文件分类 ASCII文件:文本文件,每一个字节存储一个ASCII码字符。 二进制文件:把内存中的数据原样存储到文件中。 例:把10000存储文件中,ASCII文件占5个字节,二进制文件占2个字节 ASCII文件 1 0 0 0 0 内存中的存储形式 二进制文件
预 备 知 识 三、文件类型 FILE:结构体类型 在VC++系统中定义如下(stdio.h): struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;
预 备 知 识 四、文件操作 1、打开文件 函数:FILE *fopen(char *fname,char *mode); 功能:以mode指定的方式打开文件fname。 返回值:正常打开文件时返回对应文件结构体的首地址,否则返回空指针 文件打开模式(mode取值): r 打开一个文本文件,只读 ,文件指针指向文件开头(文件已经存在) w 生成一个文本文件,只写 (若存在同名文件,将会被覆盖) a 打开一个文本文件,追加数据,文件指针指向文件尾 r+ 打开一个文本文件,可读可写 w+ 生成一个文本文件,可读可写 a+ 打开一个文本文件,可读可写 rb、wb、ab、rb+、wb+、ab+ 针对二进制文件操作
预 备 知 识 四、文件操作 2、关闭文件 函数:int fclose(FILE *stream); 功能:关闭stream所指向的文件。 返回值:正常关闭返回0,否则返回非零。 3、读文件(输入) 函数:int fscanf(FILE *stream,char *format,arg_list); 功能:从stream所指向的文件中按format指定的格式读取数据给变量地址列表中的变量。 返回值:正常读取返回实际被赋值的变量的个数,否则返回负值。 4、写文件(输出) 函数:int fprintf(FILE *stream,char *format,arg_list); 功能:将变量列表中的变量值按format指定的格式写入stream所指向的文件中。 返回值:正常写入返回实际写入的字符个数,否则返回负值。
任 务 1 任务1:将5个盘子的汉诺塔操作步骤输出到文件。 文本文件名:file_out.txt 打开方式:w
任 务 1 #include <stdio.h> void move(char a,char b); void hano(int n,char s,char m,char t); FILE *fp; void main( ) { char s='A',m='B',t='C'; int n=5; fp=fopen("c:\\file_out.txt","w"); hano(n,s,m,t); fclose(fp); }
任 务 1 void move(char a,char b) { fprintf(fp,"%c-->%c\n",a,b); } void hano(int n,char s,char m,char t) { if(n==1) move(s,t); else { hano(n-1,s,t,m); move(s,t); hano(n-1,m,s,t); } }
任 务 2 任务2:从文件中读入50个整数,按降序排列后输出到另一文件。 输入文件:file_in.txt 打开方式:r 输出文件:file_out.txt 打开方式:w
任 务 2 #include <stdio.h> #define N 50 void main( ) { FILE *fp; int a[N]; int i,j,t; fp=fopen("C:\\file_in.txt","r"); for(i=0;i<=N-1;i++) fscanf(fp,"%d",&a[i]); fclose(fp);
任 务 2 for(i=0;i<N-1;i++) for(j=i+1;j<=N-1;j++) if(a[i]<a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } fp=fopen("c:\\file_out.txt","w"); for(i=0;i<=N-1;i++) { fprintf(fp,"%d ",a[i]); if(i%10==9) fprintf(fp,"\n"); } fclose(fp); }
任 务 3 任务3:编程处理师生信息:编号、姓名、类别(T 老师,S 学生),如果是老师,增加工资信息(实型),如果是学生,增加成绩信息(整型)。从文件读入5名师生信息,教师工资增加500元,然后输出师生信息到另一文件。 输入文件:fin.txt 打开方式:r 输出文件:fout.txt 打开方式:w
任 务 3 #include <stdio.h> #define N 5 void main( ) { union gc { float gz; int cj; }; struct ss { int bh; char xm[8]; char lb; union gc d; }; struct ss a[N]; int i; FILE *fp;
任 务 3 fp=fopen("C:\\fin.txt","r"); for(i=0;i<=N-1;i++) { fscanf(fp,"%d %s %c",&a[i].bh,a[i].xm,&a[i].lb); if(a[i].lb=='T') fscanf(fp,"%f",&a[i].d.gz); else fscanf(fp,"%d",&a[i].d.cj); } fclose(fp);
任 务 3 for(i=0;i<=N-1;i++) if(a[i].lb=='T') a[i].d.gz+=500; fp=fopen("c:\\fout.txt","w"); for(i=0;i<=N-1;i++) if(a[i].lb=='T') fprintf(fp,"%d %s %c %.2f\n",a[i].bh,a[i].xm,a[i].lb,a[i].d.gz); else fprintf(fp,"%d %s %c %d\n",a[i].bh,a[i].xm,a[i].lb,a[i].d.cj); fclose(fp); }
知识拓展 1、getc函数 int getc(FILE *stream) 从指定文件中读取一个字符 2、putc函数 int putc(int ch,FILE *stream) 将ch写入指定文件 3、getw函数 int getw(FILE *stream) 从指定文件中读取一个整型量 4、putw函数 int putw(int i,FILE *stream) 将i的值写入指定文件 5、fgets函数 char *fgets(char *str,int num,FILE *stream) 从指定文件中读取num-1个字符存储到str所指向的字符数组中。
知识拓展 6、fputs函数 int fputs(char *str,FILE *stream) 将str所指向的字符串写入指定文件。 7、fread函数 int fread(void *buff,int SIZE,int count,FILE *stream) 从指定文件中读取一个数据块。 8、fwrite函数 Int fwrite(void *buf,int size,int count,FILE *stream) 向指定文件中写入一个数据块。
上机实训 掌握文件及基本操作; 能利用文件完成数据的输入和输出。 [详见实训12 文件] 作业:教材P262--263页第一、二、三(7)题。