Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
void vemData(Kniha * kniha[20]) { FILE *fh; if (( fh = fopen("knizky.txt", "r")) != NULL ) { char *line; line = (char *) malloc(sizeof(char) * 255); while (( line = fgets(line, 255, fh)) != NULL ) { if (line == ';') { strcpy(kniha[i]->autor, ...); if (line == '\n') { ... }; } } }
Takto to mám v souboru (knizky.txt):
Diva Bara; Bozena Nemcova; 1958 Bylo nas pet; Karel Polacek; 1955
Potřebuji prostě toto, nemám myšlenku:
kniha[0]->autor = "Bozena Nemcova"; kniha[0]->kniha = "Diva Bara"; kniha[0]->rok = "1958"; kniha[1]->autor = "Karel Polacek"; kniha[1]->kniha = "Bylo nas pet"; kniha[1]->rok = "1955";
Offline
Lze využít třeba funkcí strchr a strncpy + pointerové aritmetiky. Jinak nezapomeň, že funkce strncpy neukončuje zkopírovaný řetězec znakem '\0' (teda pokud 3. číselný parametr je číslo menší než délka řetězce, ze kterého se kopíruje), takže si to musíš ošetřit sám.
Offline
↑ septolet: Mě jde spíše o tu podmínku jak zrealizovat. ;)
Offline
↑ RePRO: kolega ↑ septolet: jiz napovedel: pomoci funkce strchr najit pozice stredniků v jednotlivych radcich a pomoci funkce strncpy prekopirovat pozadovane udaje do atributu konkretni instance tridy Kniha. ovsem vyzaduje to opet praci s ukazately, se kterymi jsme tady bojovali nedavno
Offline
No -- prostě to co najdu v tom souboru, tak to hodím do pole ukazatelů:
Třeba do:
kniha[i]->autor;
Offline
No tak načteš si řádku ze souboru, kterou uložíš do řetězce line. Trochu nechápu, proč používáš line = fgets(line, 255, fh), funkce fgets v případě úspěchu vrací stejný řetězec, který načetla, čili ty v podstatě dvakrát ukládáš do toho řetězce line. Pak prostě třikrát uložíš do řetězce v té tvé struktuře nějaký podřetězec z toho načteného řetězce (z té načtené řádky) - poprvé začátek řádky až první ';', podruhé první ';' + 2 až druhé ';' a potřetí uložíš podřetězec ohraničení druhým výskytem znaku ';' + 2 až konec řádky. Musíš si hlídat délku, aby ses třeba nedostal za konec toho načteného řádku.
Offline
↑ septolet: Můžeš mi to prosím Tě nějak naznačit (ukázat)? Už asi 5 hodin se s tím štvu a vůbec nemůžu přijít jak na to. ;-(
Offline
char *a; while(fgets(line, 255, fr) != NULL) { a = strchr(line, ';'); strncpy(kniha[0]->autor, line, a - line); kniha[0]->autor[a - line] = '\0'; /* obdobně pro další dva údaje, akorát nezapomeň ošetřit např. to, pokud tam ty * další dva (a vlastně i ten první) údaje nebudou */ }
Ještě bych doporučil tuto stránku: http://cplusplus.com/ jsou tam vysvětleny nejrůznější funkce + je tam vždycky názorný příklad použití dané funkce. Prostě spousta zajímavých informací.
Offline
void vemData(Kniha * kniha[20]) { FILE *fh; if (( fh = fopen("knizky.txt", "r")) != NULL ) { char *line; char *a; int i = 0; line = (char *) malloc(sizeof(char) * 255); while(fgets(line, 255, fh) != NULL) { a = strchr(line, ';'); strncpy(kniha[0]->autor, line, a - line); kniha[0]->autor[a - line] = '\0'; /// tento řádek naprosto nechápu :-) } } }
Jenže: Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Prostě kopíruju data na špatné paměťové místo. ;-(
Offline