c语言实现从二进制文件读取数据冒泡排序后显示在屏幕上,总是乱码

出入校人员管理系统,要将出校人数降序排列,用了冒泡排序,不知道为什么输出的总是乱码,看不出来程序哪里有问题

img

img

img

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#include <conio.h>
#define N 10

void A()         //按出校时间降序
{
    FILE *fp,*fl;
    person a[N],c[N];
    char temp[20];
    int i=0,j,count=0,k,flag=0;
    if((fl=fopen("temp2","wb+"))==NULL)
    {
        printf("文件打开错误!");
    }
    if((fp=fopen("informations","rb"))==NULL)
    {
        printf("读取失败,可能是文件不存在,请先录入并保存信息!\n");
        //getch();
    }
    while((fread(&a[i],sizeof(person),1,fp))!=0)
    {
        if(strcmp(a[i].condition,"out")==0)
        {
            fwrite(&a[i],sizeof(person),1,fl);
            count++;
        }
    }
    if(count==0)
    {
        printf("无人出校\n");
        return;
    }
    if(count!=0)
    {
        for (k=0;!feof(fl);k++)
        {
            fread(&c[k],sizeof(person),1,fl);
        }
        for(k=0;k<count-1;k++)
        {
            flag=0;
            for (j=0;j<count-1-k;j++)
            {
                if(strcmp(c[j].day,c[j+1].day)<0)
                {
                    strcpy(temp,c[j].day);
                    strcpy(c[j].day,c[j+1].day);
                    strcpy(c[j+1].day,temp);
                    flag=1;
                }
            }
            if(flag==0)
                break;
        }
        printf("\n序号    身份       身份证号        姓名     联系方式       状态      日期     时间\n");
        for(k=0;k<count;k++)
        {
            printf("%s   %5s %s %4s   %s     %s  %5s %5s\n",c[k].no,c[k].degree,c[k].ID,c[k].name,c[k].phone,c[k].condition,c[k].day,c[k].time);
        }
        printf("对出校人员按出校时间进行降序排序成功,信息显示完毕,谢谢使用\n");
    }
    fclose(fp);
    fclose(fl);
}

如果是二进制文件,注意读入的时候是否正确,二进制文件里面的数字可能不是字符串,而是16进制数

第一步 看下数组a在从informations读入数据是否正确,可以在排序前打印下a数据看下是否是乱码
第二步 看下从a写入到temp2文件,是否正确写入了,
第三步  看下数组C读入的数据是否正确,并且在排序前打印下C的数据看下是否是乱码
第四步  注意二进制里面的数据有时候不能简单的用字符串strcpy拷贝函数,因为里面可能有0,这样会有问题,
要用内存拷贝和比较函数memcpy等, 比如 aaaa0aaa,  用strcpy只能拷贝aaaa,0后面的aaa是被截断的

还有交换数据的时候注意下

排序的时候,要交换整个数据结构,而不只是day

排序选择有问题