matematykaszkolna.pl
Programowanie w C Kamil: Witam, zna się ktoś trochę na programowaniu w C? mam mały problem. Pomółgby ktoś rozwiązać. Problem opisany jest pod tym linkiem.(tam jest ładne formatowanie kodu) https://forum.pasja-informatyki.pl/310519/pobieranie-do-struktury-w-c
11 gru 21:55
Dziadek Mróz: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char imie[20]; char nazwisko[20]; int rok; } Osoba; int main(int argc, char *argv[]) { FILE *plik = fopen("plik.txt","r"); Osoba pocz; Osoba tab[20]; int i = 0,x; for (fscanf(plik, "%s", pocz.imie); !strcmp(pocz.imie, "\n"); i++) { for (x=0; pocz.imie[x]!='\0'; x++) { tab[i].imie[x]=pocz.imie[x];} fscanf(plik,"%s", tab[i].nazwisko); fscanf(plik,"%d",&tab[i].rok); fscanf(plik,"%s", pocz.imie); } } Format %s odnosi się do tablicy char'ów czy wskaźnika char *, innymi słowy do napisu, obiektu, który zwiera się w cudzysłowach "" a nie apostrofach ''. Na zielono miałeś dobrze, a w błędnych miejscach miałeś identyczną sytuację, ale dla innej zmiennej tego samego typu :D
11 gru 22:42
Kamil: a dlaczego !strcmp(pocz.imie, "\n")? dlaczego napis pocz.imie porównujemy ze znakiem końca linii? przecież musimy znaleźć koniec pliku a nie znak końca linii
11 gru 22:50
Dziadek Mróz: Sorry, zamiast \n powinien być \0
11 gru 23:01
Kamil: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char imie[50]; char nazwisko[50]; int rok; }Osoba; int main(int argc, char *argv[]) { FILE *plik=fopen("plik.txt","r"); Osoba pocz; Osoba tab[20]; int licznik=0; int i=0,x; for(fscanf(plik,"%s",(pocz.imie));!strcmp(pocz.imie,"\0");i++){ for(x=0ocz.imie[x]!='\0';x++){ tab[i].imie[x]=pocz.imie[x];} fscanf(plik,"%s",tab[i].nazwisko); fscanf(plik,"%d",&tab[i].rok); fscanf(plik,"%s",(pocz.imie)); licznik++; } printf("%d",licznik); } wstawiłem licznik do pętli i okazuje się że pętla nie wykonuje się ani razu z takim warunkiem z "/n" też licznik=0 a z '/0' program się wysypuje
11 gru 23:04
Dziadek Mróz: pocz.imie nie jest plikiem, tylko napisem. "Ala ma kota" jest traktowane jako tablica nie 11 elementów ale 12, bo na końcu zawiera znak końca linii '\0'
11 gru 23:05
Kamil: tylko fscanf pobiera napis do pierwszego białego znaku, czyli weźmie tylko "Ala"
11 gru 23:06
Dziadek Mróz: Poczekaj, tak się skupiłęm na Twoim kodzie, że zapomniałem co chcesz osiągnąć. Chcesz wczytać z pliku do tablicy struktur, najprościej: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char imie[20]; char nazwisko[20]; int rok; } Osoba; int main(int argc, char *argv[]) { FILE *plik = fopen("plik.txt", "r"); Osoba tab[20]; int i = 0; while (!feof(plik)) { fscanf(plik, "%s %s %d\n", tab[i].imie, tab[i].nazwisko, &tab[i].rok); printf("%d: %s %s %d\n", i, tab[i].imie, tab[i].nazwisko, tab[i].rok); i++; } plik.close(); }
11 gru 23:17
Dziadek Mróz: while (!feof(plik)) { fscanf(plik, "%s %s %d\n", tab[i].imie, tab[i].nazwisko, &tab[i].rok); printf("%d: %s %s %d\n", i, tab[i].imie, tab[i].nazwisko, tab[i].rok); i++; } dopóki nie napotkasz końca pliku Wczytaj to co w linii znajdziesz do struktury tab[i] Wyświetl zawartość struktury tab[i] Inkrementuj licznik i
11 gru 23:20
Dziadek Mróz: Tylko teraz mi wyjaśnij co Ty chciałeś osiągnąć tym kodem, co się ma dziać w pierwszej pętli?
11 gru 23:20
Dziadek Mróz: chciałeś wczytać napotkany napis do zmiennej pocz.imie, sprawdzić czy napis jest końcem pliku (sic!) itd...
11 gru 23:22
Dziadek Mróz: Druga pętla, ok, iterujesz po pocz.imie, aż do napotkania '\0', mimo, że wystarczyło dać: for (x=0; x<strlen(pocz.imie); i++)
11 gru 23:24
Kamil: dzięki. próbowałem jakoś na około to zrobić. chciałem aby pod zmienną pocz.imie był zawsze pierwszy napis linii, i jeśli nie udało się pobrać napisu bo np ta linia już nie istnieje, to chciałem aby pętla się skończyła
11 gru 23:26
Dziadek Mróz: Znasz metodę gumowej kaczki? Masz sobie kod i masz sobie gumową kaczkę i mówisz tej kaczce co każda linia kodu robi. Jak uznasz że bełkotasz, to coś z tym robisz
11 gru 23:26