Ciągle zrzuca core :/

0

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

0

Czy do czegoś takiego:

int eof = 0;                         //eof - wartownik konca pliku
while(!eof)

nie lepiej użyć tej funkcji: http://www.cppreference.com/stdio/feof.html
Sprawdzaj w tej funkcji czy udało sie poprawnie otworzyć pliki.

0

Dzięki za tą funkcję, myślałem, że tylko w C++ jest dostępna (piszę w czystym ANSI C). Już wiem w czym tkwił problem - te pliki pomocnicze f0, f1, f2 i f3 powinienem inicjować z argumentem "w+" a nie "r+" ponieważ "r+" otwiera istniejący plik do zapisu i odczytu (te pliki nie istniały więc nie można ich było otworzyć), natomiast "w+" tworzy plik do zapisu i odczytu :) Pozdrawiam

0
michal86 napisał(a)

Dzięki za tą funkcję, myślałem, że tylko w C++ jest dostępna (piszę w czystym ANSI C).

faktura getrec(FILE * f)

Ta funkcja zwraca strukturę przez wartość - to przejdzie jedynie w c++, w c nigdy.

faktura buffer[MAX_BUF];
Tak wielkich zmiennych nie należy deklarować (lokalnie czy globalnie),
do tego jest malloc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1