Tablica struktur

0

Witam, potrzebuję pomocy przy tablicy struktur. Program się kompiluje aczkolwiek podczas działania wysypuje.
W założeniu potrzebuję, aby dane z pliku w formie:
Adam Nowak [email protected]
Jan Kowalski [email protected]
były przepisane do tablicy struktur.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
char imie[50];
char nazwisko [50];
char email[50];
}osoba;

osoba** odczyt_pliku(char nazwa_pliku[50]) {
    int i,j=0,k=0;
    osoba* tab = (osoba*)malloc(sizeof(osoba)*1000);
    char* x = (char*)malloc(sizeof(char)*500);
    FILE *plik;
    if ((plik=fopen(nazwa_pliku,"r"))==NULL) {
        printf("Nie udalo sie otworzyc pliku");
        exit(1);
    }
    else {
        while (feof(plik)==0){
            fscanf(plik,"%c",&x[i]);
            while (x[i]!=' ') {
                tab[j].imie[k]=x[i];
                k++;
            }
            tab[j].imie[k]='\0';
            k=0;
            while (x[i]!=' ') {
                tab[j].nazwisko[k]=x[i];
            }
            tab[j].nazwisko[k]='\0';
            k=0;
            while (x[i]!='\n') {
                tab[j].email[k]=x[i];
            }
            tab[j].email[k]='\0' ;
            k=0;
            j++;
            i++;
        }
    }
    return tab;
}

int main()
{
    printf(odczyt_pliku("adresy.txt"));

    return 0;
}

2

1.Przestrzegaj zasady DRY - wydziel powtarzający się kod do wspólnych funkcji.

2.Nazywaj zmienne sensownie.

3.Nie, identyfikator x nie jest sensowny wbrew pozorom ;-)

4.Dlaczego, na boga, robisz printf na tym, co zwraca odczyt_pliku?

5.Pisz kod powoli, a nie ciurkiem - wtedy zauważyłbyś od razu o co chodzi i nie musiałbyś całego kodu przepisywać od nowa.

0

do tego co powyżej zwalniaj pamięć, jeśli ją alokujesz.

0

Tak, wiem. Na razie chcę tylko rozwiązać problem wysypywania się programu.

0

Weźmy na przykład tę pętlę:

while (x[i]!=' ') {
    tab[j].nazwisko[k]=x[i];
}

Jak Ci się wydaje, jeśli sterowanie raz do niej wejdzie, kiedy ją opuści?
Ani i tu nie modyfikujesz, ani nic.

Co zresztą zauważyłbyś, gdybyś pobawił się co nieco z debuggerem, co zalecam Ci teraz uczynić :)

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
char imie[50];
char nazwisko [50];
char email[50];
}osoba;

osoba* odczyt_pliku(char nazwa_pliku[50]) {
    int i,j=0,k=0,p=0,licznik_spacji=0;
    osoba* tab = (osoba*)malloc(sizeof(osoba)*10);
    for (i=0;i<10;i++) {
        tab[i].imie[0]='0';
    }
    char* x = (char*)malloc(sizeof(char)*5);
    FILE *plik;
    if ((plik=fopen(nazwa_pliku,"r"))==NULL) {
        printf("Nie udalo sie otworzyc pliku");
    }
    else {
        while (feof(plik)==0){
            x=fgetc(plik);
            if (x=='\n') {
                j++;
                licznik_spacji=0;
            }
            else {
            if (x!=' ') {
                if (licznik_spacji==0) {
                    tab[j].imie[k]=x;
                    k++;
                }
                if (licznik_spacji==1) {
                    tab[j].nazwisko[k]=x;
                    k++;
                }
                if (licznik_spacji==2) {
                    tab[j].email[k]=x;
                    k++;
                }
            }
            else {
            licznik_spacji++;
            k=0;
            }
        }
    }
    }
    free(x);
    fclose(plik);
    return tab;
}

void wyswietl_tablice (osoba* tab) {
    int i=0 ;
    while (tab[i].imie[0]!='0') {
        printf("%i. ",i);
        printf("%s %s %s",tab[i].imie,tab[i].nazwisko,tab[i].email);
        printf("\n");
        i++;
    }
}

void wyczysc_pamiec (osoba* tab) {
    free(tab);
}

int main()
{

    wyswietl_tablice(odczyt_pliku("adresy.txt"));

    return 0;
}

Działa, dziękuję za poprawki.

0
for (i=0;i<10;i++) {
    tab[i].imie[0]='0';
}

1.Po co Ci ten fragment kodu?
2.Czy aby na pewno nie mylisz '0' z 0?

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