Mam do napisania, jako część większego prgramu, funkcję sortującą rekordy w pliku .dat. Mój program (który po części był pisany na zajęciach) nie wyrzuca w obecnym stanie błędów, ale też nic nie sortuje. Trzeba go jednak też przeobić, żeby sortował względem dowolnej wartości (imię, nazwisko, wiek, zarobki), która ma być wybrana w menu programu. Próbowałem wpisywać dane do tablicy, ale nic z tego nie wychodziło. Będę wdzięczny za każdą pomoc!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct osoba {
char imie[15];
char nazwisko[25];
int wiek;
int zarobki;
};
int compar(const void *p1, const void *p2)
{
struct osoba *os1 = (struct osoba *)p1;
struct osoba *os2 = (struct osoba *)p2;
int n = strcmp(os1->nazwisko, os2->imie);
if(n) return n;
else return strcmp(os1->imie, os2->nazwisko);
}
void sortuj(void *base, size_t n, size_t size,
int (*compar)(const void *, const void *))
{
int i, j;
for(i=n-1; i>0; i--)
for(j=0; j<i; j++)
if(compar(base + j*size, base + (j+1)*size)>0)
{
char temp[size];
memcpy(temp, base + j*size, size);
memcpy(base + j*size, base + (j+1)*size, size);
memcpy(base + (j+1)*size, temp, size);
}
return;
}
int main()
{
struct osoba os[100];
FILE *fin = fopen("osoby.dat","r+");
if(!fin)
{
printf("Blad otwarcia pliku!");
exit(-1);
}
int n=0;
while(fscanf(fin,"%s %s %d %d",os[n].imie, os[n].nazwisko, &os[n].wiek, &os[n].zarobki) == 4) n++;
sortuj(os, n, sizeof(char), compar);
int i;
for(i=0; i<n; i++)
printf("%s %s %d %d\n",os[i].nazwisko, os[i].imie, os[i].wiek, os[i].zarobki);
fclose(fin);
return 0;
}
Wyciąłem tą część do osobnego pliku, bo łatwiej testować tylko to co mnie interesuje.