Witam, mam zadanie napisać program, który sortuje plik metodą sortowania polifazowego z czterema plikami. Wsztstko działało dopóki nie zacząłem pisać funkcji sort(), pozostałe funkcje działają. Idea jest taka, że funkcja sort() powinna wczytywać rekordy do bufora sortować je i na zmianę zapisywać do pliku f0 i f1 (to dopiero początek ale nie działa więc nie mogę kontynuować). Za każdym razem gdy uruchamiam mój program system zrzuca core (kompiluję w gcc pod fedorą). Poniżej zamieszczam kod:
#include <stdio.h>
#include <string.h>
#define MAX_BUF 100
#define MAXL 200
typedef struct {char nr[11], name[101], date[11], amount[15];} faktura;
faktura getrec(FILE * f) //wczytuje wiersz
{
faktura temp = {};
char s[MAXL] = "", s1[MAXL] = "";
fgets(s, MAXL, f); //pobranie wiersza zpliku
if (s[0] == 0) temp.nr[0] = 0; else //rozbicie wiersza i umieszczenie w rekordzie
{
strcpy(s1, strchr(s, ';') + 1);
strncpy(temp.nr, s, strlen(s) - strlen(s1) - 1);
strcpy(s, strchr(s1, ';') + 1);
strncpy(temp.name, s1, strlen(s1) - strlen(s) - 1);
strcpy(s1, strchr(s, ';') + 1);
strncpy(temp.date, s, strlen(s) - strlen(s1) - 1);
strcpy(temp.amount, s1);
}
return temp;
}
void sortbuf(faktura t[], int n) //sortuje bufor metoda przez selekcje (dane sa przenoszone tylko n - 1 razy)
{
faktura temp;
int min, i, j;
for (i = 0; i < n; i++)
{
min = i;
for (j = i + 1; j <= n; j++)
if (strcmp(t[j].name, t[min].name) < 0 || (!strcmp(t[j].name, t[min].name) && strcmp(t[j].date, t[min].date) < 0)) min = j;
temp = t[i];
t[i] = t[min];
t[min] = temp;
}
}
void sort(FILE * f)
{
faktura buffer[MAX_BUF]; //bufor
FILE * f0 = fopen("f0", "r+");
FILE * f1 = fopen("f1", "r+");
FILE * f2 = fopen("f2", "r+");
FILE * f3 = fopen("f3", "r+");
FILE * ft;
int i, j, eof = 0, licznik = 0; //eof - wartownik konca pliku
ft = f0;
while(!eof)
{
for(i = 0; i < MAX_BUF; i++)
{
buffer[i] = getrec(f);
if (buffer[i].nr[0] == -1) { i--; eof = 1; break; }
}
sortbuf(buffer, i);
j = i;
i = 0;
while(i <= j)
{
fprintf(ft, "%s;%s;%s;%s", buffer[i].nr, buffer[i].name, buffer[i].date, buffer[i].amount);
i++;
}
if (ft == f0) ft = f1; else ft = f0;
}
fclose(f0);
fclose(f1);
fclose(f2);
fclose(f3);
}
int main()
{
FILE * f = fopen("plik", "r");
sort(f);
fclose(f);
return 0;
}
Z góry dziękuję za wszelkie sugestie