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
Stránky: 1
Už fakt nevím, jak tento problém vyřešit. Snad mi někdo ochotný pomůže a celou problematiku vyřešíme. Nemyslím si, že je to (extrémně) složité. Fakt jen opravdu zájemci, kteří budou psát - zdrojový kód. Nechci nějaké (chytré) řečičky o tom...
Mám tedy soubor knizky.txt:
Bozena Nemcova;Bara;1961; Karel Capek;Bila Nemoc;1966; Shakespeare;Romeo a Julie;1658;
Mám strukturu:
typedef struct Kniha { char jmeno[20]; char autor[20]; int rokVydani; } tKniha;
A mám nějaké pole ukazatelů, ukazující právě na tuto strukturu:
Kniha * knihy[20];
Potřeboval bych metodu (funkci), která mi vrátí (nebo vypíše) následující:
knihy[0]->autor = "Bozena Nemcova"; knihy[0]->jmeno = "Bara"; knihy[0]->rokVydani = 1961; knihy[1]->autor = "Karel Capek"; knihy[1]->jmeno = "Bila Nemoc"; knihy[1]->rokVydani = 1966; knihy[2]->autor = "Shakespeare"; knihy[2]->jmeno = "Romeo a Julie"; knihy[2]->rokVydani = 1658;
Prostě (vůbec) netuším, jak to dostat do toho pole. Jak vytvořit tu funkci. Mockrát děkuju za cenné rady.
Offline
Tady http://forum.matweb.cz/viewtopic.php?id=16778 si dostal poměrně konkrétní odpověď + odkazy, kde si můžeš najít funkce pro práci s řetězci, které se ti při této úloze budou hodit. Kde je tedy problém? Co konkrétně není jasné? Pořád totiž píšeš, že něco nechápeš, ale já nevím co - co která funkce dělá jsem už zmiňoval v minulém vlákně + si dostal odkaz, kde se případně dozvíš víc, slovní řešení problému si už také dostal, malý náznak v podobě kódu si už také dostal. Takže tedy čekáš, že to někdo celé napíše za tebe? Proč nepokračuješ v původním vlákně a zakládáš nové na stejné téma?
Offline
↑ septolet: Nepotřebuji to napsat celé. Potřebuji napsat jenom tu funkci. ;)
Offline
Tak jsem sesmolil něco takového, ale mám pár drobností:
void vemData(Kniha * kniha[20]) { FILE *fh; int c; int pozice = 1; // kolikátý znak int knihaS = 0; // kolikátá kniha (řádek) int polozka = 0; // jaká položka (autor, jméno knihy nebo rok) int znaky[50]; // pomocné pole pro ukládání if (( fh = fopen("knizky.txt", "r")) != NULL ) { do { c = fgetc(fh); // znaky[pozice] = c; printf("%c", c); if (c == ';') { if (polozka == 0) { /* strcpy(kniha[knihaS]->autor, znaky); printf("1"); */ }; if (polozka == 1) { /* strcpy(kniha[knihaS]->jmeno, znaky); printf("2"); */ }; if (polozka == 2) { /* kniha[knihaS]->rokVydani = znaky; printf("3"); */ }; polozka++; } pozice++; if (c == '\n') { printf("počet řádků: %d", knihaS); knihaS++; polozka = 0; }; } while (c != EOF); fclose (fh); } }
1. Když tu proměnnou c hodím do toho pomocného pole znaky, tak když to sputím, tak mi to vyhodí vyjímku, že skáču někam do nesprávné (nepovolené) paměti.
2. Chtěl bych pomoci s tím doděláním, co mám v komentářích (viz. 3 if s položkama).
3. Pokaždé, když to projede podmínkou, tak bych potřeboval pole znaky nějak vyprázdnit, aby mi to tam neházelo věci, které nechci.
4. No a poslední věc je na tu podmínku s těma řádkama. Hodí mi to vždycky jenom (0, 1). V souboru mám ale 3 řádky, ne 2.
Offline
1) Nikde nevidím, že nuluješ proměnnou pozice.
2) Chce to změnit string na int, existuje na to funkce.
3) Tak to pole projdi (nemusíš celé) na na jednotlivé pozice ulož znak '\0' + samozřejmě vynulovat proměnnou pozice (viz. bod 1)
4) Poslední řádek není ukončen znakem '\n'.
Offline
Tak konečně hotovo, ještě doladit pár změn a ošetření, a bude to ready.
void vemData(Kniha * kniha[20]) { FILE *fh; int c; int pozice = 0; // kolikátý znak int knihaS = 0; // kolikátá kniha (řádek) int polozka = 0; // jaká položka (autor, jméno knihy nebo rok) char znaky[50]; // pomocné pole pro ukládání int rokVyroby; if (( fh = fopen("knizky.txt", "r")) != NULL ) { kniha[knihaS] = iniKnih("", "", 0); memset(znaky, '\0', 50*sizeof(char)); do { znaky[pozice++] = fgetc(fh); if (znaky[pozice-1] == ';') { znaky[pozice-1] = '\0'; if (polozka == 0) { strcpy(kniha[knihaS]->autor, znaky); }; if (polozka == 1) { strcpy(kniha[knihaS]->jmeno, znaky); }; if (polozka == 2) { rokVyroby = atoi(znaky); kniha[knihaS]->rokVydani = rokVyroby; }; polozka++; pozice = 0; memset(znaky, '\0', 50*sizeof(char)); } if (polozka == 3) { polozka = 0; kniha[++knihaS] = iniKnih("", "", 0); } //if (znaky[pozice-1] == '\n') } while (znaky[pozice-1] != EOF); fclose (fh); } }
Offline
Stránky: 1