190 likes | 309 Views
单元 11 项目中学生数据的存储与重用 ---- 文件的读写操作 1. 学习目标: (1) 能力目标 ①能用字符读写函数读写字符数据。 ②能用数据块读写函数读写数据。 ③项目中学生数据的存储和重复使用。 (2) 知识目标 ①理解并掌握字符读写函数的格式。 ②理解并掌握用数据块读写函数的格式与使用方法。 ③理解数据块读写函数在“班级学生成绩管理系统”中的应用。 能力训练: 1 .编写用字符读写函数实现对字符数据的存储与重用。 2 .编写用数据块读写函数实现对不同类型数据的存储与重用。
E N D
单元11 项目中学生数据的存储与重用----文件的读写操作1 • 学习目标: (1)能力目标 ①能用字符读写函数读写字符数据。 ②能用数据块读写函数读写数据。 ③项目中学生数据的存储和重复使用。 (2)知识目标 ①理解并掌握字符读写函数的格式。 ②理解并掌握用数据块读写函数的格式与使用方法。 ③理解数据块读写函数在“班级学生成绩管理系统”中的应用。 • 能力训练: 1.编写用字符读写函数实现对字符数据的存储与重用。 2.编写用数据块读写函数实现对不同类型数据的存储与重用。 3.任务15:项目中学生数据的存储和重复使用。 • 考核内容: ①项目中学生数据的存储和重复使用。
单元11 项目中学生数据的存储与重用----任务15:项目中学生数据的存储和重复使用 • 11.2任务15:项目中学生数据的存储和重复使用 “班级学生成绩管理系统”项目中数据的存储主要涉及到学生信息的保存和学生信息的重复使用。学生信息的保存用Save函数,学生信息文件的打开用Open函数实现。 (1)首先将两个函数声明修改为: void Save(struct student stu[],int size);//保存文件 void Open(struct student stu[],int *size);//打开文件 (2)主函数中两个函数调用修改为: Open(stu,&stunum); Save(stu,stunum); (3)两个函数定义修改为: void Open(struct student stu[],int *size)//打开文件函数 { int i=0; FILE *fp; system("cls"); if((fp=fopen("stuscore","rb"))==NULL) { printf("文件不能正常打开!\n");
单元11 项目中学生数据的存储与重用----任务15:项目中学生数据的存储和重复使用 exit(0); } else { while(!feof(fp)) { fread(&stu[i],sizeof(struct student),1,fp); i++; } fclose(fp); } gotoxy(25,5); printf("打开文件成功!"); *size=i-1;//文件中学生数 getch(); } 该函数用读数据块函数打开保存在stuscore文件中的学生信息,文件中的学生数由形参指针变量size带回,想一想,带回的学生数为什么是i-1。
单元11 项目中学生数据的存储与重用----任务15:项目中学生数据的存储和重复使用 void Save(struct student stu[],int size)//保存文件函数 { FILE *fp; int i; system("cls"); if((fp=fopen("stuscore","wb"))==NULL) { printf("文件不能正常打开!\n"); exit(0); } else { for(i=0;i<size;i++) { fwrite(&stu[i],sizeof(struct student),1,fp); } fclose(fp); }
单元11 项目中学生数据的存储与重用----任务15:项目中学生数据的存储和重复使用 gotoxy(25,5); printf("保存文件成功,按任意键返回上级菜单!"); getch(); } 学生信息保存在一个名为stuscore文件中,以二进制文件的形式保存,保存的学生数由形参size决定,用写数据块函数实现保存,保存文件成功后给出提示。
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 2.文件的读写方法 文件打开之后,就可以对它进行读写了。通常C语言的文件读写函数是成对出现的,即有读就有写。下面介绍如下: (1) 读写字符函数 ①读字符函数 fgetc\getc 从指定的文件输入一个字符到内存。该文件必须是以读或读写方式打开的。 函数原型为: fp是一个文件类型指针,它指向要读的文件。 如果正常返回,则返回读取的字符代码。否则返回EOF;如果读到文件结束符(^Z)时,也返回EOF。 函数的一般用法:ch=fgetc(fp); 上述语句把读入字符的ASCII值存入变量ch。 int fgetc(FILE *fp); int getc(FILE *fp);
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 C语言规定,stdin代表标准输入设备文件(如键盘),前面我们已经说过,C语言将标准设备也看成是文件,除此之外还有标准输出设备文件stdout(代表显示器)和标准出错输出文件stderr。这三种文件系统自动定义,自动打开,自动关闭。实际上stdin、stdout、stderr就是这三个文件的指针。 用fgetc(stdin)输入字符与用单个字符输入函数getchar()的功能相同。 ②写字符函数 fputc\putc 把一个字符从内存输出到磁盘文件中。 函数原型为: 其中ch是要写的字符,它可以是字符常量,也可以是字符变量。fp是文件指针变量,指向当前打开的文件。 函数是将字符ch输出到fp所指向的文件中。如果调用成功,返回值就是输出的字符(ASCII码),如果失败返回一个EOF。 同学们想一想,单个字符输入函数putchar(ch),与fputc(ch,stdout)功能相同吗?为什么? 向文件写入一个字符后,文件的读写位置后移一个字节,因为文件指针在读写过程中是移动的,所以字符不会重叠 int fputc(char ch,FILE *fp); int putc(char ch,FILE *fp);
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 【例11.1】从键盘上输入一些字符,逐个把它们送到磁盘上去,“#”结束输入,然后输出这些字符。 程序代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main() 4 { 5 FILE *fp; 6 char ch,filename[10]; 7 printf("请输入保存文件名:"); 8 scanf("%s",filename); 9 ch=getchar();//该语句用来吃掉字符串后的回车符 10 if((fp=fopen(filename,"w"))==NULL)/*创建文件用于输出*/ 11 { 12 printf("can not creat the file.\n"); 13 exit(0); 14 }
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 15 printf("文件创建成功!请输入字符:"); 16 ch=getchar();/*输入第一个字符*/ 17 while(ch!='#') 18 { 19 fputc(ch,fp); /*把变量ch写入文件*/ 20 putchar(ch); /*屏幕显示ch的值*/ 21 ch=getchar(); /*继续输入下一个字符*/ 22 } 23 fclose(fp); /*关闭文件*/ 24} 程序运行结果: 请输入保存文件名:flie1<回车> 文件创建成功!请输入字符: One World One Deram#<回车> One World One Deram 该程序从16行到22行可以优化为, while((ch=getchar())!='#') { fputc(ch,fp); putchar(ch); }
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 【例11.2】用读写字符函数实现两文本文件的复制。 程序代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 void main() 4 { 5 FILE *fpin,*fpout; 6 char ch,infile[10],outfile[10]; 7 printf("请输入源文件名:\n"); 8 scanf("%s",infile);/*输入源文件名*/ 9 if((fpin=fopen(infile,"r"))==NULL) /*以读方式打开源文件*/ 10 { 11 printf("can not open the source file.\n"); 12 exit(0); 13 } 14 printf("请输入目标文件名:\n"); 15 scanf("%s",outfile);/*输入目标文件名*/
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 16 if((fpout=fopen(outfile,"w"))==NULL)/*以写方式打开目标文件*/ 17 { 18 printf("can not create the target file.\n"); 19 exit(0); 20 } 21 while(!feof(fpin))//feof函数是检测是否到了文件尾。 22 { 23 ch=fgetc(fpin); 24 fputc(ch,fpout); 25 } 26 fclose(fpin); 27 fclose(fpout); 28} 程序运行结果: 请输入源文件名:file1<回车> 请输入目标文件名:file2<回车> 如果file1文件已经存在,该程序将file1文件复制成file2文件。
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 (2)读写数据块函数 ①读数据块函数fread() fread函数从fp所指定的文件向内存输入数据块。 函数原型: 参数说明: buffer是指针变量,指向数据存放区域的首地址,size为一次读入的字节数,count为读取次数,fp为输入文件指针。 返回值: 正常操作返回为count的值(不是字节数),否则返回0。 如果文件能正常打开,fread函数可以读取任何类型的数据。例如: float fx; fread(fx,4,1,fp); 其中fx为实型数据变量,该函数从fp所指定的文件读入四个字节,送到fx变量中,并且只读一次。 我们还可以用这个函数读取一个结构体类型的数据。 int fread(数据类型 *buffer,unsigned size,unsigned count,FILE *fp);
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 例如: struct student { char Num[8]; char Name[10]; int Age; }stu[30]; 结构体数据有30个元素,每个元素占22个字节,如果学生数据存放在磁盘文件中,可以用for语句依次读取这30个学生数据,并存放在数组stu中。 for(k=0;k<30;k++) fread(&stu[k],sizeof(struct studen),1,fp); 同学们想一想,为什么要用&stu[k]? ②写数据块函数fwrite() fwrite函数将buffer缓冲区中的数据输出到fp所指定的文件中去。 函数原型: int fwrite(数据类型 *buffer,unsigned size,unsigned count,FILE *fp);
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 参数说明: buffer是指针变量,指向数据存放区域的首地址,size为一次输出的字节数,count为写入次数,fp为输出文件指针。 返回值: 正常操作返回为count的值(不是字节数),否则返回值为0。 如果文件能正常打开,fwrite函数可以写入任何类型的数据。 例如: struct student stu[30]; for(k=0;k<30;k++) fwrite(&stu[k],sizeof(struct student),1,fp); 该for语句将数组中30个元素依次写入fp所指定的文件中,并且只写一次。 【例11.3】从键盘上输入3个学生信息,然后将它们转存到磁盘文件中,并显示这些信息。 程序代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 3
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 4 void input(struct student stu[],int n); 5 void output(struct student stu[],int n); 6 7 struct student 8 { 9 char Num[7]; 10 char Name[10]; 11 int Age; 12 }; 13 14 void main() 15 { 16 struct student stu[N]; 17 input(stu,N); 18 output(stu,N); 19 } 20
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 21 void input(struct student stu[],int n) 22 { 23 FILE *fp; 24 int i; 25 if((fp=fopen("fbinary","wb"))==NULL)//以写方式开打二进制文件 26 { 27 printf("can not open this file.\n"); 28 exit(0); 29 } 30 for(i=0;i<n;i++)//输入学生信息 31 { 32 printf("请输入学号:"); 33 scanf("%s",stu[i].Num); 34 printf("请输入姓名:"); 35 scanf("%s",stu[i].Name); 36 printf("请输入年龄:"); 37 scanf("%d",&stu[i].Age); 38 } 39 for(i=0;i<n;i++)//保存学生信息 40 fwrite(&stu[i],sizeof(struct student),1,fp); 41 fclose(fp); 42 } 43
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 44 void output(struct student stu[],int n) 45 { 46 FILE *fp; 47 int i; 48 if((fp=fopen("fbinary","rb"))==NULL)//以读方式开打二进制文件 49 { 50 printf("can not open this file.\n"); 51 exit(0); 52 } 53 for(i=0;i<n;i++) 54 { 55 fread(&stu[i],sizeof(struct student),1,fp); 56 printf("%7s%10s%5d\n",stu[i].Num,stu[i].Name,stu[i].Age); 57 } 58 fclose(fp); 59 }
单元11 项目中学生数据的存储与重用----11.1.2 文件的基本操作 程序运行结果: 请输入学号:1001<回车> 请输入姓名:张三<回车> 请输入年龄:19<回车> 请输入学号:1002<回车> 请输入姓名:李四<回车> 请输入年龄:18<回车> 请输入学号:1003<回车> 请输入姓名:王五<回车> 请输入年龄:21<回车> 1001 张三 19 1002 李四 18 1003 王五 20
单元11 项目中学生数据的存储与重用----课后作业与思考 1.填空题: (1)feof(fp)函数用来判断文件是否结束,如果遇到文件结束,函数值为,否则为。 (2)fgetc(stdin)函数功能是 。 2.选择题: (1)系统的标准输入文件是。 A.键盘 B.显示器 C.软盘 D.硬盘 (2) fgetc函数的作用是从指定的文件读入一个字符,该文件的打开方式必须是。 A.只写 B.追加 C.读或读写 D.B和C都正确 3.编程题: (1)从键盘上输入10个整数,分别以文本文件和二进制文件方式存入磁盘。 (2)编程实现一个文本文件的复制。 (3)有3个学生,每个学生有3门课的成绩,从键盘上分别输入每个学生的学号、姓名、和3门课的成绩,保存到一个名为class31.dat的文本文件中去。