Struktura v C
Struktura v C
cawte kamosi potrebujem radu.
mam nejaky subor pokus.txt
mam strukturu
typedef struct zoznam {
int vek;
char meno[10];
struct zoznam *dalsi;
} ZOZNAM;
potrebujem funkcie na zapis udajov do suboru a na zobrazenie(teda aj nacitanie) udajov zo suboru.
Myslim ze je to nieco ako zretazeny zoznam.
Mozno tam treba aj ukazovatele
zoznam *p_akt, *p_prv, *p_prech;
mozete niekto hodit kod resp. inak pomoct dik.
Keby dakto chcel moze aj mazanie resp pridavanie. DIK
mam nejaky subor pokus.txt
mam strukturu
typedef struct zoznam {
int vek;
char meno[10];
struct zoznam *dalsi;
} ZOZNAM;
potrebujem funkcie na zapis udajov do suboru a na zobrazenie(teda aj nacitanie) udajov zo suboru.
Myslim ze je to nieco ako zretazeny zoznam.
Mozno tam treba aj ukazovatele
zoznam *p_akt, *p_prv, *p_prech;
mozete niekto hodit kod resp. inak pomoct dik.
Keby dakto chcel moze aj mazanie resp pridavanie. DIK
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
Mohol by si to riesit napr. takto
Pointer p_prv by si nastav na uplne prvu strukturu zoznamu, takym sposobom to potom budes aj vypisovat. 
Kód: Vybrať všetko
while (p_akt->dalsi!=NULL) {
scanf("%d %s", &p_akt->vek, p_akt->meno);
p_akt=p_akt->dalsi;
}dik,neutronmind napísal:Mohol by si to riesit napr. taktoPointer p_prv by si nastav na uplne prvu strukturu zoznamu, takym sposobom to potom budes aj vypisovat.Kód: Vybrať všetko
while (p_akt->dalsi!=NULL) { scanf("%d %s", &p_akt->vek, p_akt->meno); p_akt=p_akt->dalsi; }
ako nastavim na uplne prvu strukturu.
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
Tu mas vzorovy program, ako na to.
//na ukoncenie vstupu zadaj 0 ako vek
Kód: Vybrať všetko
#include <stdio.h>
#include <stdlib.h>
typedef struct zoznam {
int vek;
char meno[10];
struct zoznam *dalsi;
} ZOZNAM;
int main(void)
{
ZOZNAM *p_zac, *p_akt;
p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_zac->vek=0;
p_akt=p_zac;
printf("Zadaj vek a meno: ");
scanf("%d %s", &p_akt->vek, p_akt->meno);
while (p_akt->vek!=0) {
p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_akt->dalsi;
printf("Zadaj vek a meno: ");
scanf("%d %s", &p_akt->vek, p_akt->meno);
}
p_akt->dalsi=NULL;
p_akt=p_zac;
while (p_akt!=NULL) {
printf("Zadal si vek a meno: ");
printf("%d %s\n", p_akt->vek, p_akt->meno);
p_akt=p_akt->dalsi;
}
return 0;
}
Dakujem si borec,,,,toto ale pracuje len s pamatou pocitaca, upravil som to na zapis do suboru,,len to akosi neviem nacitat z toho suboru naspat.neutronmind napísal:Tu mas vzorovy program, ako na to.
//na ukoncenie vstupu zadaj 0 ako vekKód: Vybrať všetko
#include <stdio.h> #include <stdlib.h> typedef struct zoznam { int vek; char meno[10]; struct zoznam *dalsi; } ZOZNAM; int main(void) { ZOZNAM *p_zac, *p_akt; p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM)); p_zac->vek=0; p_akt=p_zac; printf("Zadaj vek a meno: "); scanf("%d %s", &p_akt->vek, p_akt->meno); while (p_akt->vek!=0) { p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM)); p_akt=p_akt->dalsi; printf("Zadaj vek a meno: "); scanf("%d %s", &p_akt->vek, p_akt->meno); } p_akt->dalsi=NULL; p_akt=p_zac; while (p_akt!=NULL) { printf("Zadal si vek a meno: "); printf("%d %s\n", p_akt->vek, p_akt->meno); p_akt=p_akt->dalsi; } return 0; }
tak isto ako nacitavas zo vstupu, akurat ja by som to robil tak ze si najprv zistim pocet prvkov v subore a potom pre tento pocet po jednom nacitavam do zoznamu., napr :
kde prva je prazdny zoznam do ktoreho nacitavas a z je pocet prvkom zoznamu v subore, to hadam zvladnes 
a mazanie no....tam ide o to ze prechadzas zoznam, kym nenajdes prvok ktory hladas, potom spravit tah ze :
edit : nj zabudol som to fscanf
Kód: Vybrať všetko
void nacitaj(zoznam *prva,FILE *fa,int z)
{
int i;
zoznam *akt;
for(i=1; i<=z; i++)
{
(akt->dalsia=(zoznam *)malloc(sizeof(zoznam)));
akt=akt->dalsia;
fscanf(fa,"%d %s", &akt->vek, akt->meno);//len som si nie isty ci za tym %s ma byt aj \n, sak skus
}
akt->dalsia=NULL;
}
a mazanie no....tam ide o to ze prechadzas zoznam, kym nenajdes prvok ktory hladas, potom spravit tah ze :
Kód: Vybrať všetko
pred->dalsia=aktualne->dalsia; //preskoci prvok a zmaze ho
free((void *)aktualne);
aktualne=pred;
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
njoko: znak '\n' tam nemusi byt, znamena to len odriadkovanie. Inak parametrom funkcie fscanf je aj pointer na strukturu FILE, napr.
A ako by si chcel zistit pocet prvkov v subore? Podla mna by bolo dost neefektivne ho prechadzat len na to, aby si to zistil, staci ti, ze funkcia fscanf vracia pocet uspesne nacitanych parametrov, takze ja by som to riesil nasledovnym sposobom:
Kód: Vybrať všetko
fscanf(stdin, "%d", &cislo);
Kód: Vybrať všetko
#include <stdio.h>
#include <stdlib.h>
#define MENO_SUBORU "subor.txt"
typedef struct zoznam {
int vek;
char meno[10];
struct zoznam *dalsi;
} ZOZNAM;
int main(void)
{
ZOZNAM *p_zac, *p_akt;
FILE *fr;
if ((fr=fopen(MENO_SUBORU, "r"))==NULL) {
printf("Subor sa nepodarilo otvorit.\n");
return 1;
}
p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_zac;
while (fscanf(fr, "%d %s", &p_akt->vek, p_akt->meno)==2) {
p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_akt->dalsi;
}
p_akt->dalsi=NULL;
p_akt=p_zac;
while (p_akt->dalsi!=NULL) {
printf("Bolo nacitane vek a meno: ");
printf("%d %s\n", p_akt->vek, p_akt->meno);
p_akt=p_akt->dalsi;
}
p_akt=p_zac;
while (p_akt!=NULL) {
free((void *)p_akt);
p_akt=p_akt->dalsi;
}
p_zac=NULL;
fclose(fr);
return 0;
}
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
normalne nad vami jasam
ide o to ze ucitel si svoju robotu odflakol, resp preskocil zretazeny zoznam co ja pokladam za dolezite a teraz mam v tom deficit, som rad, ze aspon tu su ludia ochotny pomoct, resp vysvetlit. To uvolnenie asi myslite z pamate pocitaca,nie z dokumentu(ako na dokument?)... Chlapy naozaj mi moc pomahate.
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
Tak potom trebars

Kód: Vybrať všetko
p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_akt->dalsi;-
neutronmind
Expert
- Príspevky: 189
- Registrovaný: 05 aug 2008, 14:17
Mohol by si to napr. takto (do toho zdrojaku to potom pridaj medzi p_akt=p_zac; a while (p_akt!=NULL) )
Ak by si to chcel nacitat z klavesnice, tak si tam len pridas fscanf()... Takto si to myslel? 
Kód: Vybrať všetko
p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_akt->dalsi;
p_akt->vek=4;
strcpy(p_akt->meno, "dana");
p_akt->dalsi=NULL;jj dik
//autoeditácia príspevku ( 09 Jan 2009, 17:19 )
teda znova nacitam vsetky struktury
-> vymazem TXT
-> vytvorim ho spat za pomoci fopen("nieco.txt", "w")
-> a dam fprintf(fw,"%d %s
",p_akt->vek, p_akt->meno);
lebo ked som na zaciatku dal iba fopen("nieco.txt", "r+") , tak mi na koniec suboru znova zapisalo cely zoznam len bez tej osoby co som chcel vymazat.
Takze som tam mal povodny zoznam a ten novy
//autoeditácia príspevku ( 09 Jan 2009, 17:19 )
To si myslel ze vymazem povodny TXT, znova ho vytvorim a nahram to tam znova len akurat bez tej osoby co som chcel vymazat?njoko napísal:ano z pamate pocitaca .....nerozumiem pojmu dokument, asi myslis z txt...ak ano tak ty nemazes priamo z neho, ty si ten dokument nacitas do zoznamu, tam pomazes co ti treba a potom zoznam ulozis upraveny do dokumentu
teda znova nacitam vsetky struktury
-> vymazem TXT
-> vytvorim ho spat za pomoci fopen("nieco.txt", "w")
-> a dam fprintf(fw,"%d %s
",p_akt->vek, p_akt->meno);
lebo ked som na zaciatku dal iba fopen("nieco.txt", "r+") , tak mi na koniec suboru znova zapisalo cely zoznam len bez tej osoby co som chcel vymazat.
Takze som tam mal povodny zoznam a ten novy