实验七
实验七 文件
◊实验结论
Part1: 验证性实验
♦ 验证性实验2
• 如果事先不知道学生人数,尝试对line29做如下修改后,程序运行结果正确,运行结果截图如下↓
• 对比验证性实验3和验证性实验4的程序源码及运行结果,总结比较二进制文件与文本文件的区别。
(1) 定义区别:
文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。文本文件是基于字符编码的文件,
常见的编码有ASCII编码,UNICODE编码等等。
二进制文件:是基于值编码的文件,可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。
(2) 存储方式的区别:
二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。
文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式
文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取与文本文件的存取差不多,只是编码解码方式不同而已。
如果存储的是字符数据,无论采用文本文件还是二进制文件都是没有任何区别的。
如果存储的是非字符数据,又要看我们使用的情况来决定:
¹如果是需要频繁的保存和访问数据,那么应该采取二进制文件进行存放,这样可以节省存储空间和转换时间。
²如果需要频繁的向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。
• 写一个简单的程序,尝试从二进制文件file4.dat中读出数据,并在屏幕上显示,以此查看文件file4.dat的内容。
程序源码↓
#include<stdio.h> #include<stdlib.h> const int n=10; typedef struct student { int num; char name[20]; int score; }STU; int main() { int i; STU st[n]; FILE *hp; hp=fopen("file4.dat","r"); if(hp==NULL) { printf("fail to open file4.dat\n"); } for(i=0;i<n;i++) { fread(&st[i],sizeof(STU),n,hp); //使用块读写函数读取二进制文本中内容 } fclose(hp); FILE *fp; fp=fopen("file4_1.txt","w"); if(fp==NULL) { printf("fail to open file4_1.txt\n"); } for(i=0;i<n;i++) { printf("%d %s %d\n",st[i].num,st[i].name,st[i].score); } fwrite(st, sizeof(STU), n, fp); fclose(fp); return 0; }
运行截图↓
Part2: 编程练习
♦ 修改examinee.txt中测试数据,给出程序运行源码及运行结果截图。
程序源码↓
#include <stdio.h> #include <string.h> #include <stdlib.h> const int N = 10; // 定义结构体类型struct student,并定义其别名为STU typedef struct student { long int id; char name[20]; float objective; /*客观题得分*/ float subjective; /*操作题得分*/ float sum; char level[10]; }STU; // 函数声明 void input(STU s[], int n); void output(STU s[], int n); void process(STU s[], int n); int main() { STU stu[N]; printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N); input(stu, N); printf("\n对考生信息进行处理: 计算总分,确定等级\n"); process(stu, N); printf("\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\n"); output(stu, N); return 0; } // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分 void input(STU s[], int n) { FILE *fin; int i; fin = fopen("examinee.txt","r") ; if( !fin ) { printf("fail to open file\n"); exit(0); } for(i=0;i<n;i++) fscanf(fin,"%ld %s %f %f", &s[i].id,s[i].name,&s[i].objective,&s[i].subjective); if( fscanf(fin,"%ld %s %f %f", &s[i].id,s[i].name,&s[i].objective,&s[i].subjective)==0) { printf("读取错误!请重试!"); } fclose(fin); } // 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级 // 不仅输出到屏幕上,还写到文本文件result.txt中 void output(STU s[], int n) { FILE *fout; int i; if((fout=fopen("result.txt","w"))==NULL) { printf("cannot open file"); exit(0); } for(i=0;i<n;i++) { printf("%5d %10s %5.1f %5.1f %5.1f %5s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); fprintf(fout,"%5d %10s %5.1f %5.1f %5.1f %5s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); } fclose(fout); } // 对考生信息进行处理:计算总分,排序,确定等级 void process(STU s[], int n) { int i,j,k; int a1,a2; a1=(int)(N*0.1),a2=(int)(N*0.5); STU temp; for(i=0;i<n;i++) s[i].sum=s[i].objective+s[i].subjective; for(j=0;j<n-1;j++) { for(k=0;k<n-j-1;k++) { if(s[k].sum<s[k+1].sum) { temp=s[k]; s[k]=s[k+1]; s[k+1]=temp; } } } strcpy(s[0].level,"优秀" ); for(i=1;i<=4;i++){ strcpy(s[i].level,"合格"); } for(i=5;i<=9;i++){ strcpy(s[i].level,"不合格"); } }
运行截图↓
◊实验总结与体会
结课期末复习周的实验作业没有按时提交真的感觉蛮糟糕的,最后一节课的自我评价表格上才写过,也对自己这一个学期的学习进行了反思,但又发生了这个事情_(:_」∠)_
从这次实验运行的截图可以看出本次实验之前有些不同,由于个人对macOS系统的不熟悉,初始运行不成功,便打算去机房电脑做完本次试验,结果就延误了...
昨晚想起来没有提交实验但机房也关门了,便借了一个电脑开始做这个实验但还是没有赶上最后的截止时间,临近考试心情很浮躁,本次实验质量也很不足
学期最后的报告弄成这个样子,感觉挺不好的 =(
互评地址:
https://www.cnblogs.com/yzxazj/p/11079071.html
https://www.cnblogs.com/gundongtiao/p/11079914.html
https://www.cnblogs.com/Baeky/p/11080131.html