从bin文件中进行Qsorting,不显示任何内容

时间:2015-11-29 18:41:42

标签: c arrays bin qsort

遇到麻烦。我在过去的一天里对qsort做了大量的阅读,我认为我对它有很好的把握,但是当我将它与文件(bin或文本)结合使用时,我正在努力解决它。它让我相信问题可能不在于int比较或qsorting,而在于打开和关闭文件的实际过程,或者fread本身。它可能是数组" Order"是罪魁祸首。我已经尝试了下面列出的代码的各种迭代,没有运气。

我的目标是简单地使用qsort使到达的机场井然有序。我还需要将时间戳转换为人类可读的,我还不明白该怎么做,但我想我需要让我的数组在我打扰之前工作。

如果有人有兴趣,相关的bin文件已上传到http://www.filedropper.com/acars_1

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>




            typedef struct MyStruct_struct{
            char FlightNum[7];
            char OriginAirportCode[5];
            char DestAirportCode[5];
            unsigned timeStamp;
        } MyStruct;


        MyStruct Order[5000];

        int compare (const void *v1, const void *v2)
        {
        int result;
        const MyStruct *ia = (MyStruct *)v1;
        const MyStruct *ib = (MyStruct *)v2;

            if ((result= strcmp(ia-> OriginAirportCode, ib-> OriginAirportCode)) != 0)
            return result;
            if ((result = strcmp(ia->DestAirportCode, ib->DestAirportCode)) != 0)
            return result;
            else return 0;

         }

        int main(){
        int i;



             FILE * bin;
             MyStruct myStruct;

             bin = fopen("acars.bin", "rb");
                               while(!feof(bin))
             {
                         fread(&myStruct,sizeof(MyStruct),1,bin);
             qsort(Order, 5000, sizeof( MyStruct), compare);


             }


            for (i = 0; i < 300; i++) {
            printf("%i) %s, %s, %s\n", i, Order[i].FlightNum, Order[i].OriginAirportCode, Order[i].DestAirportCode);

            }
            fclose(bin);

            return 0;
        }
        }

enter image description here

1 个答案:

答案 0 :(得分:0)

好吧,你排序5000个元素,而你可能少于5000个。此外,你正在阅读myStruct而不是Order

您可能希望使用以下代码:

int count = 0;
while (!feof(bin)) {
    fread(Order + count, sizeof(MyStruct), 1, bin);
    ++count;
}

qsort(Order, count, sizeof(MyStruct), compare);

或者您甚至可以将while循环更改为由一行组成:

while (!feof(bin)) fread(Order + (count++), sizeof(MyStruct), 1, bin);