#include<stdio.h> #include<stdlib.h> #define N 1 struct student_type//结构体 { char name [10]; int num; double ave; double score[3]; }stud[N],temp; void save()//存入磁盘函数 { FILE * fp; int i; if((fp=fopen("stud_dat","wb"))==NULL) { printf("无法打开此文件\n"); exit(0); } for(i=0;i<N;i++) if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) printf("文件存入失败!\n"); fclose(fp); } void main() { FILE *fp; int i,j; if((fp=fopen("stud_dat","r"))==NULL)//读取文件 { printf("无法打开此文件\n"); exit(0); } printf("文件内容:"); for(i=0;fread(&stud[N],sizeof(struct student_type),1,fp)!=0;i++)//设置循环输出一下输入的文件的内容 { printf("\n学号:%8d,姓名:%8s\n",stud[i].num,stud[i].name);//学号姓名 for(j=0;j<3;j++) printf("分数:%6lf",stud[i].score[j]);//得分情况 printf("均分:%10.2lf",stud[i].ave);//均分 } printf("\n"); fclose(fp);//关闭文件 for(i=0;i<N;i++)//排序,将文件中的的均分排序 for(j=0;j<i;j++) if(stud[i].ave<stud[j].ave) { temp=stud[i]; stud[i]=stud[j]; stud[j]=temp; } printf("\n输出拍完序的结果!!"); fp=fopen("stud_sort","w");//打开sort文件,将数据存入 for(i=0;i<N;i++) { fwrite(&stud[i],sizeof(struct student_type),1,fp); printf("\n学号:%8d,姓名:%8s\n",stud[i].num,stud[i].name);//学号姓名 for(j=0;j<3;j++) printf("分数:%6lf",stud[i].score[j]);//得分情况 printf("均分:%10.2lf",stud[i].ave);//均分 } fclose(fp); }优化一下上面这段代码
时间: 2024-01-24 20:01:39 浏览: 70
这段代码存在一些问题:
1. 在存入文件时使用了二进制的方式,但在读取时使用了文本方式,应该保持一致。
2. 在读取文件时,循环的条件应该是 `fread` 返回值不为0,而不是 `i<N`。
3. 在排序时,循环的条件应该是 `i<N-1`,而不是 `i<N`。
下面是对代码的优化:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1
struct student_type {
char name[10];
int num;
double ave;
double score[3];
} stud[N], temp;
void save() {
FILE *fp;
int i;
if ((fp = fopen("stud_dat", "wb")) == NULL) {
printf("无法打开此文件\n");
exit(0);
}
for (i = 0; i < N; i++) {
if (fwrite(&stud[i], sizeof(struct student_type), 1, fp) != 1) {
printf("文件存入失败!\n");
}
}
fclose(fp);
}
int main() {
FILE *fp;
int i, j;
if ((fp = fopen("stud_dat", "rb")) == NULL) {
printf("无法打开此文件\n");
exit(0);
}
printf("文件内容:\n");
i = 0;
while (fread(&stud[i], sizeof(struct student_type), 1, fp) == 1) {
printf("学号:%8d,姓名:%8s\n", stud[i].num, stud[i].name);
for (j = 0; j < 3; j++) {
printf("分数:%6lf", stud[i].score[j]);
}
printf("均分:%10.2lf\n", stud[i].ave);
i++;
}
fclose(fp);
for (i = 0; i < N - 1; i++) {
for (j = i + 1; j < N; j++) {
if (stud[i].ave > stud[j].ave) {
temp = stud[i];
stud[i] = stud[j];
stud[j] = temp;
}
}
}
printf("排序后的结果:\n");
if ((fp = fopen("stud_sort", "w")) == NULL) {
printf("无法打开此文件\n");
exit(0);
}
for (i = 0; i < N; i++) {
fwrite(&stud[i], sizeof(struct student_type), 1, fp);
printf("学号:%8d,姓名:%8s\n", stud[i].num, stud[i].name);
for (j = 0; j < 3; j++) {
printf("分数:%6lf", stud[i].score[j]);
}
printf("均分:%10.2lf\n", stud[i].ave);
}
fclose(fp);
return 0;
}
```
优化后的代码使用了 `rb` 和 `wb` 分别表示读取和写入二进制文件,循环条件也做了相应的修改。同时,对于 `printf` 的格式化字符串也做了一些修改,使输出更加清晰。
阅读全文