Сортировка в файле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Приветствую! Есть такая программа - она по некоторому критерию выписывает в файл несколько строк, которые должна отсортировать по убыванию в этом файле. Выглядит он до сортировки так, как в файле out2.txt, в нем же и должна происходить. Мой код сортировки (по условию сортировка идет по 1 столбцу):
struct answ
{
    char name[20];char coal[10];
};
 
int main()
{
...
filein2 = fopen("out2.txt","r");
fileout2 = fopen ("out2.txt","w");
fseek (filein2,0,SEEK_SET);
fseek (fileout2,0,SEEK_SET);
        while (i<((sizeof(aa1)+1)*(c-1)))
       {
        fseek (filein2,i,SEEK_SET);
        fscanf (filein2,"%s %s",aa1.name,aa1.coal);
         j=i+sizeof(struct answ)+1;
            while (j<((sizeof(struct answ)+1)*c))
              {
                 fseek(filein2,j,SEEK_SET);
                   fscanf (filein2,"%s %s",aa2.name,aa2.coal);
                   if (strcmp (aa1.name,aa2.name)<0)
                   {
                       fseek (fileout2,i,SEEK_SET);
                       fprintf (fileout2, "%-20s %-10s\n",aa2.name,aa2.coal);
                       fseek (fileout2,j,SEEK_SET);
                       fprintf (fileout2, "%-20s %-10s\n",aa1.name,aa1.coal);
                   }
                   j+=sizeof(struct answ)+1;
              }
              i+=sizeof(struct answ)+1;
        }
В этом "огрызке" вся проблема, полный код - lb9.txt (проблемный код с 88 строки), файл-источник - in.txt

Решение задачи: «Сортировка в файле»

textual
Листинг программы
       posi = -32;
       fseek (filein2,0,SEEK_SET);
        fseek (fileout2,0,SEEK_SET);
        while (i<c)
        {
        posi+=32;
        fseek (filein2,posi,SEEK_SET);
       fscanf (filein2,"%s %s",aa1.name,aa1.coal);
        posj=posi+32;
            while (j<(c-i))
              {
                  fseek(filein2,posj,SEEK_SET);
                   fscanf (filein2,"%s %s",aa2.name,aa2.coal);
                   if (strcmp (aa1.name,aa2.name)<0)
                   {
                       printf ("%s      %s\n",aa1.name,aa2.name);
                       fseek (fileout2,posi,SEEK_SET);
                       fprintf (fileout2, "%-20s %-10s\n",aa2.name,aa2.coal);
                       fseek (fileout2,posj,SEEK_SET);
                       fprintf (fileout2, "\n %-20s %-10s",aa1.name,aa1.coal);
                   }
                   posj+=32; j++;
              }
              i++;
        }

Объяснение кода листинга программы

  1. В начале кода объявлены две переменные: posi и c. Значение переменной c равно 32, а значение posi равно -32.
  2. Используя функцию fseek, код перемещает указатель чтения файла filein2 в начало файла.
  3. Аналогично, код перемещает указатель записи файла fileout2 в начало файла.
  4. Код входит в цикл while, который выполняется до тех пор, пока значение переменной i меньше значения переменной c.
  5. Внутри цикла переменная posi увеличивается на 32.
  6. Код использует функцию fseek, чтобы переместить указатель чтения файла filein2 к позиции posi.
  7. Затем код использует функцию fscanf для чтения двух строк из файла filein2 и сохранения их в структурах данных aa1 и aa2.
  8. Переменная posj устанавливается равной posi + 32.
  9. Код входит в вложенный цикл while, который выполняется до тех пор, пока значение переменной j меньше значения (c-i).
  10. Внутри вложенного цикла код снова использует функции fseek и fscanf для чтения двух строк из файла filein2 и сохранения их в структурах данных aa2 и aa1.
  11. Если строка name в структуре данных aa1 меньше строки name в структуре данных aa2, код выводит эти строки на экран.
  12. Код использует функцию fseek, чтобы переместить указатель записи файла fileout2 к позиции posi.
  13. Затем код использует функцию fprintf для записи строки name и строки coal из структуры данных aa2 в файл fileout2.
  14. Код снова использует функцию fseek, чтобы переместить указатель записи файла fileout2 к позиции posj.
  15. Затем код использует функцию fprintf для записи строки name и строки coal из структуры данных aa1 в файл fileout2.
  16. Значение переменной posj увеличивается на 32, а значение переменной j увеличивается на 1.
  17. Вложенный цикл while повторяется с шага 10.
  18. Цикл while повторяется с шага 5.
  19. В конце кода значение переменной c может быть изменено на другое число, что приведет к изменению поведения цикла while.
  20. Если в начале кода значение переменной c было равно 32, то после выполнения кода значение переменной c будет равно 0.

Оцени полезность:

14   голосов , оценка 4.5 из 5
Похожие ответы