u・ω・u100 2022-12-15 01:37 采纳率: 100%
浏览 104
已结题

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);
}

  • 写回答

4条回答 默认 最新

  • X-道至简 2022-12-15 08:48
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月15日
  • 已采纳回答 12月15日
  • 赞助了问题酬金15元 12月15日
  • 修改了问题 12月15日
  • 展开全部

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加