Z pliku do struktury separacja po srednikach

0

Dobry chciałbym się dowiedzieć jak czytać do struktury jeżeli plik.txt ma postac:
Jan;Kowalski;18
Jan;Targarien;65
Jaś;Snieg;22
Danuta;Podolska;22
Fragment kodu który działa jeżeli dane są odzielone spacjami.

#include <stdio.h>
#include <stdlib.h>
#define max 19

    typedef struct{
    char imie[max];
    char nazwisko[max];
    int wiek;
    }Osoba;

Osoba tab[3];

void odczyt(char *path, Osoba tab[])
{
    FILE *fp;
    fp = fopen(path, "r");
    int n=0;

    while(!feof(fp))
    {
        fscanf(fp,"%s %s %d", &tab[n].imie, &tab[n].nazwisko, &tab[n].wiek);
        n++;
    }
    for(int i=0; i<n;i++)
        printf("%s %s %d\n",tab[i].imie, tab[i].nazwisko, tab[i].wiek);
}

int main()
{

    odczyt("plik.txt", tab);

    return 0;
}

0

Używaj wielkich liter dla stałych i kiedy używasz preprocessora.

#define MAX 19

Nie używaj zmiennych globalnych. (Osoba tab[3])

Co do czytania pliku, zalecałbym używanie czegoś takiego:

int main(int argc, char *argv[]) {
    FILE *plik=fopen("test.txt","r");
    Osoba osoby[20];
 
    int size = 20; // W przypadku kiedy plik jest większy niż tablica
    for(int i = 0; i < 20; i++)
    {
        /*
         * 3 to oczekiwana ilość pomyślnych konwersji
         * Dlatego sprawdzamy czy wartość jest inna niż 3
         * jeżeli tak - to nastąpił jakiś problem
         * i wychodzimy z pętli
         * */
        if(fscanf(plik,"%[^;];%[^;];%d", osoby[i].imie, osoby[i].nazwisko, &(osoby[i].rok)) != 3)
        {
            size = i;
            break;
        }
    }
    fclose(plik); // EDIT - Zamknięcie pliku
}

Dlaczego? Przede wszystkim dzięki pętli for zabezpieczamy się przed naruszeniem pamięci i wyjściem poza tablicę.
Po drugie, dzięki linii

size = i;

po zakończeniu pętli for wiemy ile elementów udało się pomyślnie wczytać do tablicy.

I na sam koniec - w kodzie który podałeś nie zamykasz pliku.

Dodatkowo:

while(!feof(fp))

jest złe. Tutaj dlaczego nie powinno się tego używać w takiej konstrukcji.

0

Czyli jak dodam sredniki między %s;%s;%d to powinno działać ? bo nie działa..

0

Wybacz, źle napisałem. Prawidłowa wersja if'a:

if(fscanf(plik,"%[^;];%[^;];%d", osoby[i].imie, osoby[i].nazwisko, &(osoby[i].rok)) != 3)

%[^;] to jakikolwiek znak oprócz ;.

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