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=0
ocz.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