Сортировка данных в алфавитном порядке. Язык C
Есть программа-"База данных", у меня проблема в последней функции, которая должна отсортировывать данные в алфавитном порядке исходя из фамилий. Функцию я написал, но работает она коряво.
void SORT_DATA(FILE* fPtr)
{
struct DATA blankClient, notebook= { 0,"","","",0,0,0,"",0,0 };
int n = 0;
while (fread(¬ebook, sizeof(notebook), 1, fPtr))
{
fseek(fPtr, (n) * sizeof(struct DATA), SEEK_SET);
fread(&blankClient, sizeof(struct DATA), 1, fPtr);
if (blankClient.number != 0)
{
if (strcmp(notebook.surname, blankClient.surname) > 0)
{
blankClient.number--;
notebook.number++;
fseek(fPtr, (n - 1) * sizeof(struct DATA), SEEK_SET);
fwrite(&blankClient, sizeof(struct DATA), 1, fPtr);
fseek(fPtr, (n) * sizeof(struct DATA), SEEK_SET);
fwrite(¬ebook, sizeof(struct DATA), 1, fPtr);
}
}
n++;
fseek(fPtr, (n - 1) * sizeof(struct DATA), SEEK_SET);
}
}
Вот так выглядит БД: https://i.imgur.com/UuVV6W7.png
Подскажите, что не так в моем коде, и что нужно поменять?
Ответы (1 шт):
что не так в моем коде
У Вас есть разные странные вещи в коде. Наприер, второй параметр в вызове
fseek(fPtr, (n - 1) * sizeof(struct DATA), SEEK_SET);
вполне может быть отрицательным числом. Но, самая главная проблема заключается в том, что Вы один и тот же файл (fPtr) пытаетесь просматривать одновременно двумя разными способами.
Первый - это :
while (fread(¬ebook, sizeof(notebook), 1, fPtr))
А второй - это многочисленные чтения и записи после вызовов fseek(). Но ведь после первого же ручного позиционирования, последовательный просмотр в заголовке цикла будет нарушен. И вся Ваша сортировка потеряет всякий смысл.