C语言输出结果一直有乱码,不知道哪错了

大一的,我想在读取文件中加一个按成绩降序排序

#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

img

程序主要两个问题:
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;
}