遇到麻烦。我在过去的一天里对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;
}
}
答案 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);