Сортировка в файле - C (СИ)
Формулировка задачи:
Приветствую! Есть такая программа - она по некоторому критерию выписывает в файл несколько строк, которые должна отсортировать по убыванию в этом файле. Выглядит он до сортировки так, как в файле out2.txt, в нем же и должна происходить.
Мой код сортировки (по условию сортировка идет по 1 столбцу):
В этом "огрызке" вся проблема, полный код - lb9.txt (проблемный код с 88 строки), файл-источник - in.txt
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; }
Решение задачи: «Сортировка в файле»
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++; }
Объяснение кода листинга программы
- В начале кода объявлены две переменные: posi и c. Значение переменной c равно 32, а значение posi равно -32.
- Используя функцию fseek, код перемещает указатель чтения файла filein2 в начало файла.
- Аналогично, код перемещает указатель записи файла fileout2 в начало файла.
- Код входит в цикл while, который выполняется до тех пор, пока значение переменной i меньше значения переменной c.
- Внутри цикла переменная posi увеличивается на 32.
- Код использует функцию fseek, чтобы переместить указатель чтения файла filein2 к позиции posi.
- Затем код использует функцию fscanf для чтения двух строк из файла filein2 и сохранения их в структурах данных aa1 и aa2.
- Переменная posj устанавливается равной posi + 32.
- Код входит в вложенный цикл while, который выполняется до тех пор, пока значение переменной j меньше значения (c-i).
- Внутри вложенного цикла код снова использует функции fseek и fscanf для чтения двух строк из файла filein2 и сохранения их в структурах данных aa2 и aa1.
- Если строка name в структуре данных aa1 меньше строки name в структуре данных aa2, код выводит эти строки на экран.
- Код использует функцию fseek, чтобы переместить указатель записи файла fileout2 к позиции posi.
- Затем код использует функцию fprintf для записи строки name и строки coal из структуры данных aa2 в файл fileout2.
- Код снова использует функцию fseek, чтобы переместить указатель записи файла fileout2 к позиции posj.
- Затем код использует функцию fprintf для записи строки name и строки coal из структуры данных aa1 в файл fileout2.
- Значение переменной posj увеличивается на 32, а значение переменной j увеличивается на 1.
- Вложенный цикл while повторяется с шага 10.
- Цикл while повторяется с шага 5.
- В конце кода значение переменной c может быть изменено на другое число, что приведет к изменению поведения цикла while.
- Если в начале кода значение переменной c было равно 32, то после выполнения кода значение переменной c будет равно 0.