2015-11-29 2 views
1

Возникли проблемы с этим. Я много читал в qsort в прошлый день, и я ДУМАЮ, что у меня есть приличное понимание, но я борюсь с ним, когда использую его в сочетании с файлом (bin или text). Это заставляет меня полагать, что проблема может заключаться не в сравнении int или qsorting, а в фактическом процессе открытия и закрытия файла или самого самого fread. Это МОЖНО быть массивом «Заказ» является виновником. Я пробовал различные итерации кода, приведенного ниже, без везения.Qsorting из файла bin, ничего не отображающий

Моя цель - просто использовать qsort, чтобы привести прибывающие аэропорты в порядок. Мне также нужно преобразовать метку времени, чтобы она была понята для человека, и я не понимаю, как это сделать, но я решил, что мне нужно, чтобы мой массив работал, прежде чем я даже потрудился.

Если кому-то интересно, то файл бен вопрос был загружен в 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

+0

Вы должны разработать новую функциональность * в изоляции *, как можно больше. Вы пытаетесь 1) обрабатывать эту структуру, сравнивать и переупорядочивать ее экземпляры, 2) читать данные из файла и 3) выполнять quicksort. Какой из них не удается? Можете ли вы читать и записывать файлы с ints? Можете ли вы сравнить Mystructs? (Плохое имя, кстати.) Можете ли вы сортировать ints? Вы можете сравнить два аэропорта? Можете ли вы их прочитать и написать? Можете ли вы отсортировать их в виде жесткого кода? * Ограничьте проблему. * – Beta

+0

http://imgur.com/JiRRiGs Я могу читать и, по-видимому, писать просто отлично, как показано здесь. Это не цикл. Это имеет какое-то отношение к массиву, который я создал, или к int. –

+0

Это хороший первый шаг. Теперь попробуйте прочитать две из этих вещей в «Mysctruct [2]», а затем распечатать их. Или попробуйте жестко кодировать два из них и сравнить их. (Я не буду пытаться, потому что использование filedropper, похоже, требует больше работы, чем мне хочется, - вы должны рассмотреть возможность публикации функции, которая генерирует небольшой файл аэропортов.) – Beta

ответ

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 (!feof(bin)) fread(Order + (count++), sizeof(MyStruct), 1, bin); 
+0

Переход на это по-прежнему не работает. Результатом является http://imgur.com/MGcS92O. –

+0

Вы уверены, что файл написан с полноразмерными структурами 'MyStruct'. Я имею в виду: вы уверены, что, скажем, 3 символьная строка 'OriginAirportCode' написана с 5 символами, а не только с четырьмя символами (всего один дополнительный для '\ 0'). –

+0

KMCO - один из кодов аэропорта, все они 4 символа с дополнительными 5 для \ 0. См. \t http://imgur.com/JiRRiGs –

Смежные вопросы