尝试根据已排序的学生ID从文件显示给学生数据

时间:2019-04-13 16:32:17

标签: c file sorting file-handling

我无法对我从文件中获取的数据进行排序,我希望通过ID的升序将其打印到控制台,我无法将char ID转换为整数ID进行比较

struct student{
    char ID[15];
    char name[20];
    char add[20];
    char parname[20];
    int Class;
    float gpa;
    long unsigned int phone_no;
};
void sort_accord_id()
{
    while(fread(&stu,sizeof(stu),1,fp))
{
    strcpy(s[count].ID,stu.ID);
    strcpy(s[count].name,stu.name);
    printf("ID:%s\n", stu.ID);

    printf("\t%s",s[count].ID);
    printf("\t%s",s[count].name);
    count++;
}



for(i=0;i<=count-1;i++)
{
    for(j=0;j<=count-1;j++)
    {
        if(s[j].ID-'0'<s[j+1].ID-'0')
        {
            temp=s[j];
            s[j]=s[j+1];
            s[j+1]=temp;
        }
    }
}    
}

1 个答案:

答案 0 :(得分:1)

如果它可以正确读取(我假设是)学生结构“对象” stu,则一种方法是将它们全部保留在数组中(最好在堆上动态分配,否则就足够大以至于让它们全都[小心!]),然后用stdlib.h的{​​{1}}对它们进行排序。

如果您愿意的话,我可以提供有关动态数组的帮助,但是我可以肯定地使用一些谷歌搜索功能。

如果您有一个称为qsort()的学生结构数组(我也建议您输入typedef,但是为了清楚起见,我不会),您可以像这样对它们进行排序:

  • 文件顶部的第一个arr
  • 然后使用以下函数将其ID与strcmp进行比较:

    #include <stdlib.h>
  • 最后,您可以像这样:在您的int student_cmp(const void* a, const void* b) { struct student* studentA = (struct student*)a; struct student* studentB = (struct student*)b; return strcmp(studentA->ID, studentB->ID); } 中呼叫qsort

    sort_accord_id()

如果您还有其他问题,请告诉我。欢迎使用Stack Overflow!