大一的,我想在读取文件中加一个按成绩降序排序
#include<stdio.h>
#include<string.h>
#define N 17
typedef struct Student
{
int xuhao;
char name[10];
char sex;
long xuehao;
float score;
} Student;
void TxtToArray_FromFile(FILE* fp, Student s[])
{
int i;
fp=fopen("score.txt","r");
if(fp==NULL)
{
printf("打开score.txt文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fscanf(fp,"%d",&s[i].xuhao);
fscanf(fp," %s",s[i].name);
fscanf(fp," %c",&s[i].sex);
fscanf(fp,"%ld",&s[i].xuehao);
fscanf(fp,"%f",&s[i].score);
}
fclose(fp);
}
void ArrayToTxt_ToFile(FILE*fp, Student s[])
{
int i;
fp=fopen("result.txt","w");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fprintf(fp,"%d\t",s[i].xuhao);
fprintf(fp,"%s\t",s[i].name);
fprintf(fp,"%c\t",s[i].sex);
fprintf(fp,"%ld\t",s[i].xuehao);
fprintf(fp,"%.1f\n",s[i].score);
}
fclose(fp);
}
void sort(Student s[], int n)
{
int i,j;
Student temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(s[j].score>s[i].score)
{
temp= s[i];
s[i] = s[j];
s[j]=temp;
}
}
}
printf("序号\t姓名\t性别\t学号\t成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%c\t%ld\t%.1f\n",s[i].xuhao,s[i].name,s[i].sex,s[i].xuehao,s[i].score);
}
}
int main()
{
FILE* fp;
Student s[N];
TxtToArray_FromFile(fp,s);
sort(s,N);
ArrayToTxt_ToFile(fp,s);
return 0;
}
文件score.txt内容是这个
1 王华 女 220911 88
2 吕若楠 女 220912 90
3 王烁东 男 220913 66
4 张嘉 男 220914 76
5 王博 女 220915 89
6 刘庆珅 男 220916 82
7 李庆 男 220917 76
8 罗宁 男 220918 88
9 王亚楠 女 220919 90
10 王嵘业 男 220920 98
11 王宇政 男 220921 69
12 郑振铎 男 220922 89
13 梁家铭 男 220923 75
14 康嘉伟 男 220924 93
15 王峰 男 220925 75
16 冉红 女 220926 91
17 丁晋艳 女 220927 82
把学生结构中的性别字段改为字符数组就可以了,因为'男'或'女' 在C语言中不止一个字符长度,改为字符数组来读取或存储应该是可以解决这个问题的。
修改如下:
参考链接:
#include<stdio.h>
#include<string.h>
#define N 17
typedef struct Student
{
int xuhao;
char name[10];
// https://blog.csdn.net/qq_38880380/article/details/86585271
// 因为"男"或"女",在C语言中不止一个字符长度,
// 所以性别字段改为字符数组
char sex[10];
long xuehao;
float score;
} Student;
void TxtToArray_FromFile(FILE* fp, Student s[])
{
int i;
fp=fopen("score.txt","r");
if(fp==NULL)
{
printf("打开score.txt文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fscanf(fp,"%d",&s[i].xuhao);
fscanf(fp," %s",s[i].name);
fscanf(fp," %s",s[i].sex);
fscanf(fp,"%ld",&s[i].xuehao);
fscanf(fp,"%f",&s[i].score);
}
fclose(fp);
}
void ArrayToTxt_ToFile(FILE*fp, Student s[])
{
int i;
fp=fopen("result.txt","w");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fprintf(fp,"%d\t",s[i].xuhao);
fprintf(fp,"%s\t",s[i].name);
fprintf(fp,"%s\t",s[i].sex);
fprintf(fp,"%ld\t",s[i].xuehao);
fprintf(fp,"%.1f\n",s[i].score);
}
fclose(fp);
}
void sort(Student s[], int n)
{
int i,j;
Student temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(s[j].score>s[i].score)
{
temp= s[i];
s[i] = s[j];
s[j]=temp;
}
}
}
printf("序号\t姓名\t性别\t学号\t成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%ld\t%.1f\n",s[i].xuhao,s[i].name,s[i].sex,s[i].xuehao,s[i].score);
}
}
int main()
{
FILE* fp;
Student s[N];
TxtToArray_FromFile(fp,s);
sort(s,N);
ArrayToTxt_ToFile(fp,s);
return 0;
}
score.txt(测试数据文件,和代码放在同一个目录):
1 王华 女 220911 88
2 吕若楠 女 220912 90
3 王烁东 男 220913 66
4 张嘉 男 220914 76
5 王博 女 220915 89
6 刘庆珅 男 220916 82
7 李庆 男 220917 76
8 罗宁 男 220918 88
9 王亚楠 女 220919 90
10 王嵘业 男 220920 98
11 王宇政 男 220921 69
12 郑振铎 男 220922 89
13 梁家铭 男 220923 75
14 康嘉伟 男 220924 93
15 王峰 男 220925 75
16 冉红 女 220926 91
17 丁晋艳 女 220927 82
程序主要两个问题:
1.格式上有点问题;
2.性别中文男或女应该用字符串表示,不能用字符。
修改代码如下所示:
#include<stdio.h>
#include<string.h>
#define N 17
typedef struct Student
{
int xuhao;
char name[10];
char sex[2];
long xuehao;
float score;
} Student;
void TxtToArray_FromFile(FILE* fp, Student *s)
{
int i;
fp=fopen("score.txt","r");
if(fp==NULL)
{
printf("打开score.txt文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fscanf(fp,"%d",&s[i].xuhao);
fscanf(fp," %s",s[i].name);
fscanf(fp," %s",s[i].sex);
fscanf(fp,"%ld",&s[i].xuehao);
fscanf(fp,"%f",&s[i].score);
}
fclose(fp);
}
void ArrayToTxt_ToFile(FILE*fp, Student *s)
{
int i;
fp=fopen("result.txt","w");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fprintf(fp,"%d\t",s[i].xuhao);
fprintf(fp,"%s\t",s[i].name);
fprintf(fp,"%s\t",s[i].sex);
fprintf(fp,"%ld\t",s[i].xuehao);
fprintf(fp,"%.1f\n",s[i].score);
}
fclose(fp);
}
void sort(Student *s, int n)
{
int i,j;
Student temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(s[j].score>s[i].score)
{
temp= s[i];
s[i] = s[j];
s[j]=temp;
}
}
}
printf("序号\t姓名\t性别\t学号\t成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%ld\t%.1f\n",s[i].xuhao,s[i].name,s[i].sex,s[i].xuehao,s[i].score);
}
}
int main()
{
FILE* fp;
Student s[N];
TxtToArray_FromFile(fp,s);
sort(s,N);
ArrayToTxt_ToFile(fp,s);
return 0;
}
供参考:
#include<stdio.h>
#include<string.h>
#define N 17
typedef struct Student
{
int xuhao;
char name[10];
char sex[4]; //char sex; 修改
long xuehao;
float score;
} Student;
void TxtToArray_FromFile(FILE* fp, Student s[])
{
int i;
fp=fopen("score.txt","r");
if(fp==NULL)
{
printf("打开score.txt文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fscanf(fp,"%d",&s[i].xuhao);
fscanf(fp," %s",s[i].name);
fscanf(fp," %s",s[i].sex); //fscanf(fp," %c",&s[i].sex); 修改
fscanf(fp,"%ld",&s[i].xuehao);
fscanf(fp,"%f", &s[i].score);
}
fclose(fp);
}
void ArrayToTxt_ToFile(FILE*fp, Student s[])
{
int i;
fp=fopen("result.txt","w");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
for(i=0;i<N;i++)
{
fprintf(fp,"%d\t",s[i].xuhao);
fprintf(fp,"%s\t",s[i].name);
fprintf(fp,"%s\t",s[i].sex); //fprintf(fp,"%c\t",s[i].sex); 修改
fprintf(fp,"%ld\t",s[i].xuehao);
fprintf(fp,"%.1f\n",s[i].score);
}
fclose(fp);
}
void sort(Student s[], int n)
{
int i,j;
Student temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(s[j].score>s[i].score)
{
temp= s[i];
s[i] = s[j];
s[j]=temp;
}
}
}
printf("序号\t姓名\t性别\t学号\t成绩\n");
for(i=0;i<n;i++)
{
printf("%d\t%s\t%s\t%ld\t%.1f\n",s[i].xuhao,s[i].name,s[i].sex,s[i].xuehao,s[i].score);
//printf("%d\t%s\t%c\t%ld\t%.1f\n",s[i].xuhao,s[i].name,s[i].sex,s[i].xuehao,s[i].score); 修改
}
}
int main()
{
FILE* fp;
Student s[N];
TxtToArray_FromFile(fp,s);
sort(s,N);
ArrayToTxt_ToFile(fp,s);
return 0;
}