【实验7】文件


实验任务一、二

已自主验证。


实验任务三

stdout成功:(话说时间有点长)

二进制文件生成成功:

可见,dat文件内容正确可读。


实验任务四

子任务一

stdout成功:

打开二进制文件:

令人费解的不直观。

子任务二

程序源代码:

 1 // 从文本数据文件file4.dat中读入数据,将结果输出到屏幕上
 2 #include <stdio.h> 
 3 #include <stdlib.h>
 4 
 5 #define N 10
 6 
 7 typedef struct student {
 8     int num;
 9     char name[20];
10     int score;
11 }STU;
12 
13 int main(){
14     FILE *fin,*fout;
15     STU st[N];
16     int i;
17     
18     fin=fopen("file4.dat","rb");
19     if(!fin){
20         printf("Failed to open the file
");
21         exit(0);
22     }
23     
24     fread(st,sizeof(STU),N,fin);
25         
26     fclose(fin);
27         
28     for(i=0; i<N; i++) 
29         fprintf(stdout,"%-6d%-10s%3d
", st[i].num, st[i].name, st[i].score);
30         
31     fclose(fout);
32     
33     return 0;
34 }

运行结果:


实验任务五

程序源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 10;
 4 
 5 // 定义结构体类型struct student,并定义其别名为STU 
 6 typedef struct student {
 7     long int id;
 8     char name[20];
 9     float objective;    /*客观题得分*/
10     float subjective;    /*操作题得分*/
11     float sum;
12     char level[10];    
13 }STU; 
14 
15 // 函数声明
16 void input(STU s[], int n);
17 void output(STU s[], int n);
18 void process(STU s[], int n);
19 
20 int main() {
21     STU stu[N];
22     
23     printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)
", N); 
24     input(stu, N);
25     
26     printf("
对考生信息进行处理: 计算总分,确定等级
");
27     process(stu, N);
28     
29     printf("
打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
");
30     output(stu, N); 
31     
32     return 0;
33 } 
34 
35 // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
36 void input(STU s[], int n) {
37     // 补足代码
38     // ××× 
39     FILE *fin;
40     int i;
41     
42     fin=fopen("examinee.txt","r");
43     if(!fin){
44         printf("failed to open!
");
45         return;
46     }
47     
48     for(i=0;i<n;i++){
49         fscanf(fin,"%d %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective);
50     }
51     
52     fclose(fin);
53 }
54 
55 // 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
56 // 不仅输出到屏幕上,还写到文本文件result.txt中 
57 void output(STU s[], int n) {
58     // 补足代码
59     // ××× 
60     FILE *fout;
61     int i;
62     fout=fopen("result.txt","w+");
63     for(i=0;i<n;i++)
64         fprintf(fout,"%-4ld %s %-4f %-4f %f %s
",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
65     for(i=0;i<n;i++)
66         fprintf(stdout,"%-4ld %s %-4f %-4f %f %s
",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
67     fclose(fout);
68 }
69 
70 // 对考生信息进行处理:计算总分,排序,确定等级
71 void process(STU s[], int n) {
72     // 补足代码
73     // ××× 
74     int i,t;
75     int k=0;
76     STU temp;
77     for(i=0;i<n;i++){
78         s[i].sum=s[i].objective + s[i].subjective;
79         if(s[i].sum<60)
80             strcpy(s[i].level,"不及格");
81         else if(s[i].sum>95)
82             strcpy(s[i].level,"优秀");
83         else
84             strcpy(s[i].level,"及格");
85     }
86 
87     for(i=0;i<n;i++){
88         for(t=i+1;t<n;t++){
89             if(s[t].sum>s[i].sum){
90                 temp=s[i];
91                 s[i]=s[t];
92                 s[t]=temp;
93             }
94         }
95     }
96 }

运行结果:

result.txt


实验任务六

程序源代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 #define N 80
 5 
 6 //定义结构体; 
 7 typedef struct student {
 8     int num;
 9     long int id;
10     char name[20];
11     char classes[20];
12 }STU;
13 
14 int main(){
15     FILE *fin,*fout;
16     int i,lucky_num[5],z;
17     STU st[N];
18     
19     time_t t;
20     int n=5;
21     
22     fin=fopen("list.txt","r");
23     if(!fin){
24         printf("failed to load list!
");
25         exit(0);
26     }
27     
28     for(i=0;i<N;i++)
29         fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
30     
31     fclose(fin);
32     
33     fout=fopen("lucky.txt","w");
34     
35     srand((unsigned int)time(NULL));
36     for( i = 0 ; i < n ; i++ ){
37         lucky_num[i]=rand() % N;
38         if(lucky_num[i]==0){
39             lucky_num[i]=1;
40         }
41     }
42     
43     for(i=0;i<n;i++){
44         z=lucky_num[i];
45         fprintf(fout,"%d %ld %s %s
",st[z].num,st[z].id,st[z].name,st[z].classes);
46         printf("%d %ld %s %s
",st[z].num,st[z].id,st[z].name,st[z].classes);
47     }
48 
49         
50     fclose(fout);
51     return 0;
52 }

运行结果:


拓展题 Bonus task

重复多次抽取,且不抽出重复的学生,将点过的学生保存在txt文件中。

源程序代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 #define N 80
 5 
 6 //定义结构体; 
 7 typedef struct student {
 8     int num;
 9     long int id;
10     char name[20];
11     char classes[20];
12     int flag;
13 }STU;
14 
15 int main(){
16     //定义变量 
17     FILE *fin,*fout;    //文件变量 
18     int i,lucky_num[5],z,last_lucky_num[5],n=5,count_while;        
19     STU st[N];                                     //工具变量 
20     
21     for(i=0;i<N;i++)
22         st[i].flag=0;        //全体同学设置为未标记 
23     time_t t;            //随机数 
24 
25 
26     
27     
28     fin=fopen("list.txt","r");
29     if(!fin){
30         printf("failed to load list!
");
31         exit(0);
32     }
33     
34     for(i=0;i<N;i++)
35         fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
36     
37     fout=fopen("lucky.txt","w");
38     
39     printf("Press enter key to select randomly:");
40     while(getchar()!=EOF){
41         for(i=0;i<N;i++)
42             fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
43     
44         fout=fopen("lucky.txt","a+");
45         
46     
47         srand((unsigned int)time(NULL));
48         for(i=0;i<n;i++){
49             lucky_num[i]=rand() % N;
50             if(lucky_num[i]==0){
51                 lucky_num[i]=1;
52             }
53             z=lucky_num[i];
54             count_while=0;
55             while(st[z].flag==1){        //判断是否为已标记学生 
56                 lucky_num[i]=rand() % N;
57                 if(lucky_num[i]==0){
58                     lucky_num[i]=1;
59                 }
60                 z=lucky_num[i];
61                 if(count_while++==80){        //循环结束的条件 
62                     printf("

Have no enough students to select!

Program will break soon……
");
63                     return 0;
64                 }
65             }
66             st[z].flag=1;
67         }
68         
69         for(i=0;i<n;i++){        //输出 
70             z=lucky_num[i];
71             fprintf(fout,"%d %ld %s %s
",st[z].num,st[z].id,st[z].name,st[z].classes);
72             printf("%d %ld %s %s
",st[z].num,st[z].id,st[z].name,st[z].classes);
73         }
74             
75         fclose(fout);
76         printf("
Press enter key to select randomly:");
77     }
78     fclose(fin);
79     
80     return 0;
81 }

运行结果:


实验结论

本章节函数较多,内容较新,需要熟练应用才能掌握。

私以为实验任务六是很重要的,不是选作不选作的问题。task1到5都是程序填空,没有自己完整地写一遍程序。

实验任务五中,我遇到了一个问题:

很清楚很明显就能发现,我把输出结果的数据类型搞错了。

但是当时我认为这并不影响,最多是强制转换。

但过了半个小时,反复调试、中途输出验证的几种debug方法我试了又试,输出结果始终是零。我便开始没办法只能让程序完美化了。

果不其然将int输出改成float就通了。

我的教训就是每一个代码都有他的合理性。

Thanks for reading.

原文地址:https://www.cnblogs.com/yinjx/p/14187013.html