Matematické Fórum

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

#1 12. 04. 2010 16:09 — Editoval RePRO (12. 04. 2010 16:54)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

načítání ze souboru

Code:

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):

Code:

Diva Bara; Bozena Nemcova; 1958
Bylo nas pet; Karel Polacek; 1955

Potřebuji prostě toto, nemám myšlenku:

Code:

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";

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 12. 04. 2010 18:36 — Editoval septolet (12. 04. 2010 18:46)

septolet
Příspěvky: 334
Reputace:   
 

Re: načítání ze souboru

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

 

#3 12. 04. 2010 18:48

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: načítání ze souboru

↑ septolet: Mě jde spíše o tu podmínku jak zrealizovat. ;)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#4 12. 04. 2010 19:00

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: načítání ze souboru

↑ 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

 

#5 12. 04. 2010 19:09 — Editoval RePRO (12. 04. 2010 19:09)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: načítání ze souboru

No -- prostě to co najdu v tom souboru, tak to hodím do pole ukazatelů:

Třeba do:

Code:

kniha[i]->autor;

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#6 12. 04. 2010 19:21

septolet
Příspěvky: 334
Reputace:   
 

Re: načítání ze souboru

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

 

#7 12. 04. 2010 23:00

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: načítání ze souboru

↑ 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. ;-(


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#8 12. 04. 2010 23:25 — Editoval septolet (12. 04. 2010 23:29)

septolet
Příspěvky: 334
Reputace:   
 

Re: načítání ze souboru

Code:

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

 

#9 12. 04. 2010 23:47 — Editoval RePRO (12. 04. 2010 23:50)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: načítání ze souboru

↑ septolet:

Code:

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. ;-(


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#10 12. 04. 2010 23:56

septolet
Příspěvky: 334
Reputace:   
 

Re: načítání ze souboru

Ten posledni radek je tam kvuli tomu, ze funkce strncpy neukoncuje zkopirovany retezec (v pripade, ze a - line je mensi nez strlen(line)) znakem '\0', takze to musime zajistit sami.

Offline

 

#11 12. 04. 2010 23:59

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: načítání ze souboru

↑ RePRO: mas alokovanou pamet pro kniha[0]->autor?

Offline

 

#12 13. 04. 2010 00:06 — Editoval RePRO (13. 04. 2010 00:06)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: načítání ze souboru

↑ plisna: Podívám se na to až zítra. Mám toho plné zuby. :-)

Díky moc ;)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson