c - 尝试根据排序的学生 ID 显示文件中的学生数据

标签 c file sorting file-handling

我无法对从文件中获取的数据进行排序,我希望它按 ID 的升序打印到控制台,我无法将字符 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;
        }
    }
}    
}

最佳答案

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

如果您愿意,我可以提供有关动态数组的帮助,但我确信一些谷歌搜索也能达到目的。

如果你有一个学生结构数组(我也建议你 typedef,但为了这个答案的清晰起见,我不会)称为 arr ,你可以像这样对它们进行排序:

  • 第一#include <stdlib.h>在文件顶部
  • 然后使用以下函数将它们的 ID 与 strcmp 进行比较:

    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()像这样:

    qsort(arr, 2, sizeof(struct student), student_cmp);

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

关于c - 尝试根据排序的学生 ID 显示文件中的学生数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667622/

相关文章:

ruby - 如何使用 Ruby 中的一个命令检查目录/文件/符号链接(symbolic link)是否存在

objective-c - 使用 obj-c 忽略隐藏文件和目录

java - 无法删除本地文件 - 错误 "Is a Directory"

c# - Array.Sort/IComparable 有时在第一次调用时排序不正确

c - 定义预处理器宏 swap(t, x, y)

对 for 循环和字符串常量感到困惑。给一个字符串常量超过它可以容纳的。

c - 递归 FloodFill 算法的段错误

c - 在输入期间跳过第一个 fgets() 调用?

java - 按顺序将字符串添加到数组列表

Java比较器接口(interface)和初始化比较器