Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
nemanja065 Forumaš(ica)
Pridružen/a: 05. 01. 2007. (22:48:40) Postovi: (23)16
|
Postano: 15:49 čet, 10. 9. 2009 Naslov: Datoteke |
|
|
Zadatak je sledeci:
U binarnoj datoteci REZULTATI upisani su sledeći podaci: IME, PREZIME, DISCIPLINA (jedna od sledećih disciplina: KLADIVO, DISK, KUGLA i KOPLJE) i REZULTAT (realni broj) koji su pojedini sportasi ostvarili na atletskom natjecanju. Čitanjem podataka iz datoteke REZULTATI treba formirati tekstualnu datoteku REKORDI.txt u koju će biti upisani podaci o onim sportasima koji imaju najbolji rezultat u pojedinim disciplinama. Program treba da sadrži i dio za formiranje binarne datoteke REZULTATI.
Moze li mi neko pomoci odraditi zadatak, jer neznam bas najbolje rad sa vise datoteke jos razlicitih.....Hvala unaprijed
Zadatak je sledeci:
U binarnoj datoteci REZULTATI upisani su sledeći podaci: IME, PREZIME, DISCIPLINA (jedna od sledećih disciplina: KLADIVO, DISK, KUGLA i KOPLJE) i REZULTAT (realni broj) koji su pojedini sportasi ostvarili na atletskom natjecanju. Čitanjem podataka iz datoteke REZULTATI treba formirati tekstualnu datoteku REKORDI.txt u koju će biti upisani podaci o onim sportasima koji imaju najbolji rezultat u pojedinim disciplinama. Program treba da sadrži i dio za formiranje binarne datoteke REZULTATI.
Moze li mi neko pomoci odraditi zadatak, jer neznam bas najbolje rad sa vise datoteke jos razlicitih.....Hvala unaprijed
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
pajopatak Forumaš(ica)
Pridružen/a: 25. 10. 2009. (22:20:04) Postovi: (BE)16
|
Postano: 20:06 pet, 28. 5. 2010 Naslov: |
|
|
Evo par pitanja,vezana uz datoteke..
1. Kada otvorimo recimo datoteku za čitanje,dali smijemo u njoj recimo transponirati matricu,a unda ju u drugu datoteku za pisanje samo upisati takvu?
2. Zašto moramo alocirati memoriju kada recimo gledamo,jeli matrica simetrična,a kada se traži trag matrice ne moramo?
3. Dali je greška,ako se na kraju programa recimo ako imamo i matricu za ćitanje i pisanje, zatvore obje?
Evo par pitanja,vezana uz datoteke..
1. Kada otvorimo recimo datoteku za čitanje,dali smijemo u njoj recimo transponirati matricu,a unda ju u drugu datoteku za pisanje samo upisati takvu?
2. Zašto moramo alocirati memoriju kada recimo gledamo,jeli matrica simetrična,a kada se traži trag matrice ne moramo?
3. Dali je greška,ako se na kraju programa recimo ako imamo i matricu za ćitanje i pisanje, zatvore obje?
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
Postano: 20:22 pet, 28. 5. 2010 Naslov: |
|
|
[quote="pajopatak"]Evo par pitanja,vezana uz datoteke..
1. Kada otvorimo recimo datoteku za čitanje,dali smijemo u njoj recimo transponirati matricu,a unda ju u drugu datoteku za pisanje samo upisati takvu?
2. Zašto moramo alocirati memoriju kada recimo gledamo,jeli matrica simetrična,a kada se traži trag matrice ne moramo?
3. Dali je greška,ako se na kraju programa recimo ako imamo i matricu za ćitanje i pisanje, zatvore obje?[/quote]
odgovori :
1. ne. moras ju prvo snimit u memoriju racunala i tamo transponirat te ju takvu ispisat u file
2. jer nemozes baratati s citanjem elemenata kako bi trebao. nemozes mu reci : procitaj broj na mjestu 3,4 i sl. jer citanje ide po redu i kada mu zadas rewind vrati te na pocetak datoteke pa onda moras matricu prvo snimit u memoriju i tamo s njom radit dok su ti kod traga matrice bitni samo elementi na dijagonali i onda mu samo velis da napravi kaj god treba
3. naravno da da. ako si kod Sege na vjezbama bi cuo da nije bas pametno to radit jer neki manje "kvalitetni" OS-evi mogu napravit "cudo" od toga :)
kao sto si morao osloboditi alociranu memoriju prije koju si zauzeo zbog nekog niza, matrice, cega vec tako sad moras zatvoriti sve sto si otvorio i nema to veze jel pises, citas ili bilo kaj radis :)
Nadam se da sam ti odgovorio na pitanja :) Ako sam nesto fulao vici :)
pajopatak (napisa): | Evo par pitanja,vezana uz datoteke..
1. Kada otvorimo recimo datoteku za čitanje,dali smijemo u njoj recimo transponirati matricu,a unda ju u drugu datoteku za pisanje samo upisati takvu?
2. Zašto moramo alocirati memoriju kada recimo gledamo,jeli matrica simetrična,a kada se traži trag matrice ne moramo?
3. Dali je greška,ako se na kraju programa recimo ako imamo i matricu za ćitanje i pisanje, zatvore obje? |
odgovori :
1. ne. moras ju prvo snimit u memoriju racunala i tamo transponirat te ju takvu ispisat u file
2. jer nemozes baratati s citanjem elemenata kako bi trebao. nemozes mu reci : procitaj broj na mjestu 3,4 i sl. jer citanje ide po redu i kada mu zadas rewind vrati te na pocetak datoteke pa onda moras matricu prvo snimit u memoriju i tamo s njom radit dok su ti kod traga matrice bitni samo elementi na dijagonali i onda mu samo velis da napravi kaj god treba
3. naravno da da. ako si kod Sege na vjezbama bi cuo da nije bas pametno to radit jer neki manje "kvalitetni" OS-evi mogu napravit "cudo" od toga
kao sto si morao osloboditi alociranu memoriju prije koju si zauzeo zbog nekog niza, matrice, cega vec tako sad moras zatvoriti sve sto si otvorio i nema to veze jel pises, citas ili bilo kaj radis
Nadam se da sam ti odgovorio na pitanja Ako sam nesto fulao vici
_________________ Ako ste previše otvorenog uma, ispast će vam mozak
------------------------------------------------------
Racunalo bez Windowsa je kao riba bez bicikla
|
|
[Vrh] |
|
pajopatak Forumaš(ica)
Pridružen/a: 25. 10. 2009. (22:20:04) Postovi: (BE)16
|
|
[Vrh] |
|
pajopatak Forumaš(ica)
Pridružen/a: 25. 10. 2009. (22:20:04) Postovi: (BE)16
|
Postano: 11:09 ned, 30. 5. 2010 Naslov: |
|
|
Još imam par pitanjaca:
1. Dali kada čitam datoteku onda recimo imam napisano u datoteci:
bl bla ,%/( /)) ovcs paij
uj989 e9diw96
Dali sada kada sam ju učitala u program dali kada želim ići pretraživati s[0]=b, s[1]=l, s[3]=b itd. jeli to tako funkcionira?
2.Sada kada ju želim prepisati mou neku drugu datoteku mogu li recimo imati neku for petlju i u njoj raditi neke izmjene na učitanim podatcima i onda u toj for petlji upisivati te podatke znak po znak u drugu npr:
for(i=0....){
....
char c=s[i];
fcanf(nešto.out,"%c",&c)
}
Hvala
Još imam par pitanjaca:
1. Dali kada čitam datoteku onda recimo imam napisano u datoteci:
bl bla ,%/( /)) ovcs paij
uj989 e9diw96
Dali sada kada sam ju učitala u program dali kada želim ići pretraživati s[0]=b, s[1]=l, s[3]=b itd. jeli to tako funkcionira?
2.Sada kada ju želim prepisati mou neku drugu datoteku mogu li recimo imati neku for petlju i u njoj raditi neke izmjene na učitanim podatcima i onda u toj for petlji upisivati te podatke znak po znak u drugu npr:
for(i=0....){
....
char c=s[i];
fcanf(nešto.out,"%c",&c)
}
Hvala
|
|
[Vrh] |
|
Luuka Forumaš(ica)
Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol:
Lokacija: Hakuna Matata
|
Postano: 11:42 ned, 30. 5. 2010 Naslov: |
|
|
Kako sam na onom topicu napiso, nemoj ništa sejvat sa %s ili %[^\n], jer ne znaš koliko memorije zauzet za taj string. Učitavaj znak po znak i sa njima radi šta treba.
Ako recimo trebaš tražit string "bla" u ulaznoj datoteci, i zamijenit ga sa AAAA onda radiš recimo (pišem bez complilera, samo ideja):
[code:1]
fscanf(ulaz,"%c",&prvi);
fscanf(ulaz,"%c",&drugi);
while ( fscanf(ulaz,"%c",&treci) )
{
if (prvi=='b' && drugi=='l' && treci=='a' )
{
fprintf(izlaz,"AAAA");
//i sad tu ucitat novi prvi, drugi, treci, jer smo bla preskocili
}
else
fprintf(izlaz,"%c", prvi);
prvi=drugi; drugi=treci;
}
[/code:1]
to je moja ideja, samo se mora pazit da se ne dođe do kraja datoteke pa da kod preskoka znakova nema kaj učitat. Ili taj dio drugačije riješit.
Kako sam na onom topicu napiso, nemoj ništa sejvat sa %s ili %[^\n], jer ne znaš koliko memorije zauzet za taj string. Učitavaj znak po znak i sa njima radi šta treba.
Ako recimo trebaš tražit string "bla" u ulaznoj datoteci, i zamijenit ga sa AAAA onda radiš recimo (pišem bez complilera, samo ideja):
Kod: |
fscanf(ulaz,"%c",&prvi);
fscanf(ulaz,"%c",&drugi);
while ( fscanf(ulaz,"%c",&treci) )
{
if (prvi=='b' && drugi=='l' && treci=='a' )
{
fprintf(izlaz,"AAAA");
//i sad tu ucitat novi prvi, drugi, treci, jer smo bla preskocili
}
else
fprintf(izlaz,"%c", prvi);
prvi=drugi; drugi=treci;
}
|
to je moja ideja, samo se mora pazit da se ne dođe do kraja datoteke pa da kod preskoka znakova nema kaj učitat. Ili taj dio drugačije riješit.
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy
|
|
[Vrh] |
|
some_dude Forumaš(ica)
Pridružen/a: 08. 11. 2009. (16:23:13) Postovi: (59)16
Spol:
Lokacija: Zd-Zg
|
Postano: 12:07 ned, 30. 5. 2010 Naslov: |
|
|
[quote="pajopatak"]Još imam par pitanjaca:
1. Dali kada čitam datoteku onda recimo imam napisano u datoteci:
bl bla ,%/( /)) ovcs paij
uj989 e9diw96
Dali sada kada sam ju učitala u program dali kada želim ići pretraživati s[0]=b, s[1]=l, s[3]=b itd. jeli to tako funkcionira?
2.Sada kada ju želim prepisati mou neku drugu datoteku mogu li recimo imati neku for petlju i u njoj raditi neke izmjene na učitanim podatcima i onda u toj for petlji upisivati te podatke znak po znak u drugu npr:
for(i=0....){
....
char c=s[i];
fcanf(nešto.out,"%c",&c)
}
Hvala[/quote]
Pa zašto ne ići znak po znak while petljom dok ne dođeš do kraja file-a, ići znak po znak i onda ako nađeš b, pogledaš koji je iduci ako je l, pogledaš još onaj treći, i ako je on a tada staviš taj string koji već treba. Moraš paziti i na slučajeve ako nađeš bl, ali nema a iza njih, pa moraš ispisati bl i taj koji već slijedi. I također na slučaj tipa bbbbla. Ovako to kod mene izgleda:
[size=7]#include <stdio.h>
int main(){
FILE* in=NULL;
FILE* out=NULL;
int c;
in=fopen("bhsdjbg.in","r");
out=fopen("bhsdjbg.out","w");
c = fgetc(in);
while(c != EOF){
if(c == 'q') {
c = fgetc(in);
if(c == 'y') {
c = fgetc(in);
if (c == 'v') {
fputs("tfkbsa", out);
}
else if (c != EOF) {
fputc('q', out);
fputc('y', out);
continue;
}
}
else if(c != EOF) {
fputc('q', out);
continue;
}
}
else {
fputc(c, out);
}
c = fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}[/size]
pajopatak (napisa): | Još imam par pitanjaca:
1. Dali kada čitam datoteku onda recimo imam napisano u datoteci:
bl bla ,%/( /)) ovcs paij
uj989 e9diw96
Dali sada kada sam ju učitala u program dali kada želim ići pretraživati s[0]=b, s[1]=l, s[3]=b itd. jeli to tako funkcionira?
2.Sada kada ju želim prepisati mou neku drugu datoteku mogu li recimo imati neku for petlju i u njoj raditi neke izmjene na učitanim podatcima i onda u toj for petlji upisivati te podatke znak po znak u drugu npr:
for(i=0....){
....
char c=s[i];
fcanf(nešto.out,"%c",&c)
}
Hvala |
Pa zašto ne ići znak po znak while petljom dok ne dođeš do kraja file-a, ići znak po znak i onda ako nađeš b, pogledaš koji je iduci ako je l, pogledaš još onaj treći, i ako je on a tada staviš taj string koji već treba. Moraš paziti i na slučajeve ako nađeš bl, ali nema a iza njih, pa moraš ispisati bl i taj koji već slijedi. I također na slučaj tipa bbbbla. Ovako to kod mene izgleda:
#include <stdio.h>
int main(){
FILE* in=NULL;
FILE* out=NULL;
int c;
in=fopen("bhsdjbg.in","r");
out=fopen("bhsdjbg.out","w");
c = fgetc(in);
while(c != EOF){
if(c == 'q') {
c = fgetc(in);
if(c == 'y') {
c = fgetc(in);
if (c == 'v') {
fputs("tfkbsa", out);
}
else if (c != EOF) {
fputc('q', out);
fputc('y', out);
continue;
}
}
else if(c != EOF) {
fputc('q', out);
continue;
}
}
else {
fputc(c, out);
}
c = fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
|
|
[Vrh] |
|
pajopatak Forumaš(ica)
Pridružen/a: 25. 10. 2009. (22:20:04) Postovi: (BE)16
|
Postano: 12:42 ned, 30. 5. 2010 Naslov: |
|
|
Ok,sad kužim ja mislim, znači on zapravo učitava znak po znak iz ulauzne datoteke i provjerava i onda ako su sva 3 znaka tamo,on upiše čitav string taj koji već treba,i nastavlja dalje učitavati slovo poslovo,jel tako?
Hoće li mi onda upisati i razmak iz izlazne u ulaznu?
Ok,sad kužim ja mislim, znači on zapravo učitava znak po znak iz ulauzne datoteke i provjerava i onda ako su sva 3 znaka tamo,on upiše čitav string taj koji već treba,i nastavlja dalje učitavati slovo poslovo,jel tako?
Hoće li mi onda upisati i razmak iz izlazne u ulaznu?
|
|
[Vrh] |
|
some_dude Forumaš(ica)
Pridružen/a: 08. 11. 2009. (16:23:13) Postovi: (59)16
Spol:
Lokacija: Zd-Zg
|
Postano: 13:17 ned, 30. 5. 2010 Naslov: |
|
|
[quote="pajopatak"]Ok,sad kužim ja mislim, znači on zapravo učitava znak po znak iz ulauzne datoteke i provjerava i onda ako su sva 3 znaka tamo,on upiše čitav string taj koji već treba,i nastavlja dalje učitavati slovo poslovo,jel tako?
Hoće li mi onda upisati i razmak iz izlazne u ulaznu?[/quote]
Naravno, prepisati će čitav tekst iz izlazne u ulaznu jednako osim što će kada naiđe na na taj string qyv zamijeniti sa onim tbrsk (ili čime već) u mom primjeru.
pajopatak (napisa): | Ok,sad kužim ja mislim, znači on zapravo učitava znak po znak iz ulauzne datoteke i provjerava i onda ako su sva 3 znaka tamo,on upiše čitav string taj koji već treba,i nastavlja dalje učitavati slovo poslovo,jel tako?
Hoće li mi onda upisati i razmak iz izlazne u ulaznu? |
Naravno, prepisati će čitav tekst iz izlazne u ulaznu jednako osim što će kada naiđe na na taj string qyv zamijeniti sa onim tbrsk (ili čime već) u mom primjeru.
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 17:21 pon, 31. 5. 2010 Naslov: |
|
|
može netko napisati rješenje zadatka 8.13(Napisite funkciju koja kao argumente prima sljedece file-pointere: in koji pokazuje na datoteku otvorenu za citanje i out koji pokazuje na datoteku otvorenu za pisanje. Funkcija treba procitati datoteku in i njen sadrzaj prepisati u datoteku out na nacin da linije idu obrnutim redoslijedom.)
ili ako može objašnjenje kako da riješim?
uputa koja je u skripti:
Nemojte postavljati ogranicenja na duljine linija, ali mozete pretpostaviti da su sve rijeci u datoteci duge najvise 30 znakova i odvojene tocno jednim razmakom ili skokom u novi red.
Uputa. Linije citajte rijec po rijec (format %s), te ih spremajte u
string koji ce, po potrebi, “rasti” (pomocu realloc()). Takve stringove spremajte u vezanu listu, dodavanjem na pocetak liste. Na kraju je potrebno samo ispisati stringove u izlaznu datoteku i osloboditi alociranu memoriju (i onu za stringove i onu za cvorove liste).
Neznam kako da spremam u listu kada neznam koliko ce mi rečenica biti dugačka..mislila sam da lista treba biti rečenica,tj.oblika
[code:1]typedef struct _recenica{
char rijeci[?];
_recenica *next;
}recenica;[/code:1]
ali neznam što staviti umjesto ?
i još jedno pitanje,ako tako radim,kako da znam da sam na kraju rečenice?budući da učitavam riječi,a ne znakove?
može netko napisati rješenje zadatka 8.13(Napisite funkciju koja kao argumente prima sljedece file-pointere: in koji pokazuje na datoteku otvorenu za citanje i out koji pokazuje na datoteku otvorenu za pisanje. Funkcija treba procitati datoteku in i njen sadrzaj prepisati u datoteku out na nacin da linije idu obrnutim redoslijedom.)
ili ako može objašnjenje kako da riješim?
uputa koja je u skripti:
Nemojte postavljati ogranicenja na duljine linija, ali mozete pretpostaviti da su sve rijeci u datoteci duge najvise 30 znakova i odvojene tocno jednim razmakom ili skokom u novi red.
Uputa. Linije citajte rijec po rijec (format %s), te ih spremajte u
string koji ce, po potrebi, “rasti” (pomocu realloc()). Takve stringove spremajte u vezanu listu, dodavanjem na pocetak liste. Na kraju je potrebno samo ispisati stringove u izlaznu datoteku i osloboditi alociranu memoriju (i onu za stringove i onu za cvorove liste).
Neznam kako da spremam u listu kada neznam koliko ce mi rečenica biti dugačka..mislila sam da lista treba biti rečenica,tj.oblika
Kod: | typedef struct _recenica{
char rijeci[?];
_recenica *next;
}recenica; |
ali neznam što staviti umjesto ?
i još jedno pitanje,ako tako radim,kako da znam da sam na kraju rečenice?budući da učitavam riječi,a ne znakove?
|
|
[Vrh] |
|
pbakic Forumaš(ica)
Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol:
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
|
[Vrh] |
|
spot137 Forumaš(ica)
Pridružen/a: 02. 11. 2009. (13:33:18) Postovi: (55)16
Spol:
|
|
[Vrh] |
|
pbakic Forumaš(ica)
Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol:
|
Postano: 23:14 pon, 31. 5. 2010 Naslov: |
|
|
[quote=".anchy."]a nije li to način kada trebam poredak riječi izokrenuti,a ne linije?
pretpostavljam da linija sama po sebi treba ostati nepromjenjena.
mislila sam u strukturu spremati cijelu liniju,a to se nezna koliko je dugačko,pa me to buni..[/quote]
Ma sori, krivo citam zadatak a i tvoj post, treba stvarno samo linije zamijenit...
Uglavnom, tu je onda uputa korisna: struct bi trebao izgledati kao
[code:1]typedef struct _recenica{
char* linija;
_recenica *next;
}recenica;[/code:1]
Sad recimo udjes u file ne sluteci nista, radis fscanf sa formatom %[^ \n]
i poslije svakog fscanfa jos recimo c=fgetc(file);
ako c nije znak za novi red ( '\n' ), onda samo realloc primijeni na ovaj string koji se zove linija (povecat za 30 je ok) i baci neki strcat
ako je c znak za novi red, znaci da moras dodavati novi element vezane liste (i to je to)
.anchy. (napisa): | a nije li to način kada trebam poredak riječi izokrenuti,a ne linije?
pretpostavljam da linija sama po sebi treba ostati nepromjenjena.
mislila sam u strukturu spremati cijelu liniju,a to se nezna koliko je dugačko,pa me to buni.. |
Ma sori, krivo citam zadatak a i tvoj post, treba stvarno samo linije zamijenit...
Uglavnom, tu je onda uputa korisna: struct bi trebao izgledati kao
Kod: | typedef struct _recenica{
char* linija;
_recenica *next;
}recenica; |
Sad recimo udjes u file ne sluteci nista, radis fscanf sa formatom %[^ \n]
i poslije svakog fscanfa jos recimo c=fgetc(file);
ako c nije znak za novi red ( '\n' ), onda samo realloc primijeni na ovaj string koji se zove linija (povecat za 30 je ok) i baci neki strcat
ako je c znak za novi red, znaci da moras dodavati novi element vezane liste (i to je to)
|
|
[Vrh] |
|
some_dude Forumaš(ica)
Pridružen/a: 08. 11. 2009. (16:23:13) Postovi: (59)16
Spol:
Lokacija: Zd-Zg
|
Postano: 23:34 pon, 31. 5. 2010 Naslov: |
|
|
[quote=".anchy."]može netko napisati rješenje zadatka 8.13(Napisite funkciju koja kao argumente prima sljedece file-pointere: in koji pokazuje na datoteku otvorenu za citanje i out koji pokazuje na datoteku otvorenu za pisanje. Funkcija treba procitati datoteku in i njen sadrzaj prepisati u datoteku out na nacin da linije idu obrnutim redoslijedom.)
ili ako može objašnjenje kako da riješim?
uputa koja je u skripti:
Nemojte postavljati ogranicenja na duljine linija, ali mozete pretpostaviti da su sve rijeci u datoteci duge najvise 30 znakova i odvojene tocno jednim razmakom ili skokom u novi red.
Uputa. Linije citajte rijec po rijec (format %s), te ih spremajte u
string koji ce, po potrebi, “rasti” (pomocu realloc()). Takve stringove spremajte u vezanu listu, dodavanjem na pocetak liste. Na kraju je potrebno samo ispisati stringove u izlaznu datoteku i osloboditi alociranu memoriju (i onu za stringove i onu za cvorove liste).
Neznam kako da spremam u listu kada neznam koliko ce mi rečenica biti dugačka..mislila sam da lista treba biti rečenica,tj.oblika
[code:1]typedef struct _recenica{
char rijeci[?];
_recenica *next;
}recenica;[/code:1]
ali neznam što staviti umjesto ?
i još jedno pitanje,ako tako radim,kako da znam da sam na kraju rečenice?budući da učitavam riječi,a ne znakove?[/quote]
Evo kako je to rješeno kod nas na vježbama:
[code:1]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char *mojString;
void naopako( FILE *fin, FILE *fout ) {
mojString *polje = NULL;
int brojLinija = 0, i;
mojString s = NULL;
int duljina = 0;
s = (char *) malloc( 1 * sizeof( char ) );
s[ 0 ] = '\0';
while( 1 ) {
char znak;
if( fscanf( fin, "%c", &znak ) != 1 )
break;
if( znak != '\n' )
{
// zalijepi znak na kraj stringa s
++duljina;
s = (char *) realloc( s, (duljina+1) * sizeof( char ) );
s[ duljina-1 ] = znak;
s[ duljina ] = '\0';
}
else
{
++brojLinija;
polje = (mojString *) realloc( polje, brojLinija * sizeof( mojString ) );
polje[ brojLinija-1 ] = s;
s = (char *) malloc( 1 * sizeof( char ) );
s[ 0 ] = '\0';
duljina = 0;
}
}
for( i = brojLinija-1; i >= 0; --i )
fprintf( fout, "%s\n", polje[ i ] );
for( i = 0; i < brojLinija; ++i )
free( polje[ i ] );
free( polje );
}
int main( void ) {
FILE *fin, *fout;
if( ( fin = fopen( "8.13.in", "rt" ) ) == NULL ) {
printf( "Ne mogu otvoriti 8.13.in za citanje.\n" );
exit( 0 );
}
if( ( fout = fopen( "8.13.out", "wt" ) ) == NULL ) {
printf( "Ne mogu otvoriti 8.13.out za pisanje.\n" );
exit( 0 );
}
naopako( fin, fout );
fclose( fin ); fclose( fout );
return 0;
} [/code:1]
.anchy. (napisa): | može netko napisati rješenje zadatka 8.13(Napisite funkciju koja kao argumente prima sljedece file-pointere: in koji pokazuje na datoteku otvorenu za citanje i out koji pokazuje na datoteku otvorenu za pisanje. Funkcija treba procitati datoteku in i njen sadrzaj prepisati u datoteku out na nacin da linije idu obrnutim redoslijedom.)
ili ako može objašnjenje kako da riješim?
uputa koja je u skripti:
Nemojte postavljati ogranicenja na duljine linija, ali mozete pretpostaviti da su sve rijeci u datoteci duge najvise 30 znakova i odvojene tocno jednim razmakom ili skokom u novi red.
Uputa. Linije citajte rijec po rijec (format %s), te ih spremajte u
string koji ce, po potrebi, “rasti” (pomocu realloc()). Takve stringove spremajte u vezanu listu, dodavanjem na pocetak liste. Na kraju je potrebno samo ispisati stringove u izlaznu datoteku i osloboditi alociranu memoriju (i onu za stringove i onu za cvorove liste).
Neznam kako da spremam u listu kada neznam koliko ce mi rečenica biti dugačka..mislila sam da lista treba biti rečenica,tj.oblika
Kod: | typedef struct _recenica{
char rijeci[?];
_recenica *next;
}recenica; |
ali neznam što staviti umjesto ?
i još jedno pitanje,ako tako radim,kako da znam da sam na kraju rečenice?budući da učitavam riječi,a ne znakove? |
Evo kako je to rješeno kod nas na vježbama:
Kod: | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char *mojString;
void naopako( FILE *fin, FILE *fout ) {
mojString *polje = NULL;
int brojLinija = 0, i;
mojString s = NULL;
int duljina = 0;
s = (char *) malloc( 1 * sizeof( char ) );
s[ 0 ] = '\0';
while( 1 ) {
char znak;
if( fscanf( fin, "%c", &znak ) != 1 )
break;
if( znak != '\n' )
{
// zalijepi znak na kraj stringa s
++duljina;
s = (char *) realloc( s, (duljina+1) * sizeof( char ) );
s[ duljina-1 ] = znak;
s[ duljina ] = '\0';
}
else
{
++brojLinija;
polje = (mojString *) realloc( polje, brojLinija * sizeof( mojString ) );
polje[ brojLinija-1 ] = s;
s = (char *) malloc( 1 * sizeof( char ) );
s[ 0 ] = '\0';
duljina = 0;
}
}
for( i = brojLinija-1; i >= 0; --i )
fprintf( fout, "%s\n", polje[ i ] );
for( i = 0; i < brojLinija; ++i )
free( polje[ i ] );
free( polje );
}
int main( void ) {
FILE *fin, *fout;
if( ( fin = fopen( "8.13.in", "rt" ) ) == NULL ) {
printf( "Ne mogu otvoriti 8.13.in za citanje.\n" );
exit( 0 );
}
if( ( fout = fopen( "8.13.out", "wt" ) ) == NULL ) {
printf( "Ne mogu otvoriti 8.13.out za pisanje.\n" );
exit( 0 );
}
naopako( fin, fout );
fclose( fin ); fclose( fout );
return 0;
} |
Zadnja promjena: some_dude; 23:38 pon, 31. 5. 2010; ukupno mijenjano 4 put/a.
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 7:13 uto, 1. 6. 2010 Naslov: |
|
|
hvala!!
jedno pitanje, što mi radi taj c=fgetc(file)?
vidjela sam ga već,al neznam čemu služi...
i kada radim sa fscanf %[^\n], u kaj ga spremam,kada neznam kolko je dugačko?
i za koliko onda realociram liniju?
i neće li fscanf %[^\n] sam pročitati sve do skoka u novi red?
uf,kolko pitanja... :D
hvala!!
jedno pitanje, što mi radi taj c=fgetc(file)?
vidjela sam ga već,al neznam čemu služi...
i kada radim sa fscanf %[^\n], u kaj ga spremam,kada neznam kolko je dugačko?
i za koliko onda realociram liniju?
i neće li fscanf %[^\n] sam pročitati sve do skoka u novi red?
uf,kolko pitanja...
|
|
[Vrh] |
|
pajopatak Forumaš(ica)
Pridružen/a: 25. 10. 2009. (22:20:04) Postovi: (BE)16
|
Postano: 9:12 uto, 1. 6. 2010 Naslov: |
|
|
Dali bi ovo bilo dobro rješenje 2.zadatka prošlogodišnjeg kolokvija?
[code:1]char*noviFile(char*ime) {
char*novi;
int i;
for(i=0;ime[i]!='.';i++);
ime[i]='\0';
novi=(char*)sizeof((strlen(ime)+5)*(char));
novi[0]='\0';
strcpy(novi,ime);
strcat(novi,".out");
return novi;
}
void Sara(char*ime){
char dokaz[30];
int *brojac;
int i;
in=fopen("ime","r");
if(in==NULL){
printf("Greska");
exit(1);
}
out=fopen("noviFile(ime","w");
if(out==NULL){
printf("Greska");
exit(1);
}
brojac=(int*)malloc(5*sizeof(int));
while( fscanf(in,"%[^\n] % %d",dokaz,& vaznost)>=3) {
for(i=1;i<=5;i++)
fprintf(out,"%d : %d",i,brojac[i]);
free(brojac);
fclose(in); fclose(out);
}
int main(int argc,char*ime) {
if(argc[1]==NULL) printf("Ne postoji");
in=fopen("ime","r");
if(in==NULL) {
printf("Greska");
exit(1);
}
printf("Unesite ime datoteke:");
scanf("%[^\n],ime);
Sara(ime);
fclose(in);
return 0;
}[/code:1]
[/quote][/code]
Dali bi ovo bilo dobro rješenje 2.zadatka prošlogodišnjeg kolokvija?
Kod: | char*noviFile(char*ime) {
char*novi;
int i;
for(i=0;ime[i]!='.';i++);
ime[i]='\0';
novi=(char*)sizeof((strlen(ime)+5)*(char));
novi[0]='\0';
strcpy(novi,ime);
strcat(novi,".out");
return novi;
}
void Sara(char*ime){
char dokaz[30];
int *brojac;
int i;
in=fopen("ime","r");
if(in==NULL){
printf("Greska");
exit(1);
}
out=fopen("noviFile(ime","w");
if(out==NULL){
printf("Greska");
exit(1);
}
brojac=(int*)malloc(5*sizeof(int));
while( fscanf(in,"%[^\n] % %d",dokaz,& vaznost)>=3) {
for(i=1;i<=5;i++)
fprintf(out,"%d : %d",i,brojac[i]);
free(brojac);
fclose(in); fclose(out);
}
int main(int argc,char*ime) {
if(argc[1]==NULL) printf("Ne postoji");
in=fopen("ime","r");
if(in==NULL) {
printf("Greska");
exit(1);
}
printf("Unesite ime datoteke:");
scanf("%[^\n],ime);
Sara(ime);
fclose(in);
return 0;
} |
[/quote][/code]
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 12:34 uto, 1. 6. 2010 Naslov: |
|
|
zašto mi se program ruši? :(
[code:1]#include <stdio.h>
#include <stdlib.h>
typedef struct _recenica{
char* linija;
_recenica *next;
}recenica;
int main(){
FILE *in,*out;
int i=0;
in=fopen("zad8.13in.txt", "r");
out=fopen("zad8.13out.txt", "w");
char x, *lin;
recenica *first=NULL,*pom2, *zadnji,*pom;
while(fscanf(in, "%c", &x)==1){
lin=NULL;
while(x!='\n' && fscanf(in, "%c", &x)==1 ){
lin=(char*)realloc(lin, sizeof(char));
lin[i++]=x;
}
recenica *novi;
novi=(recenica*)malloc(sizeof(recenica));
novi->linija=lin;
if(!first) first=zadnji=novi;
else{
zadnji->next=novi;
zadnji=novi;
}
}
for(pom=first;pom;pom=pom->next)
fprintf(out, "%s\n", pom->linija);
for(pom=first;pom;pom=pom2){
pom2=pom->next;
free(pom->linija);
free(pom);
}
return 0;
}
[/code:1]
i bi li to bilo dobro rješenje?
zašto mi se program ruši?
Kod: | #include <stdio.h>
#include <stdlib.h>
typedef struct _recenica{
char* linija;
_recenica *next;
}recenica;
int main(){
FILE *in,*out;
int i=0;
in=fopen("zad8.13in.txt", "r");
out=fopen("zad8.13out.txt", "w");
char x, *lin;
recenica *first=NULL,*pom2, *zadnji,*pom;
while(fscanf(in, "%c", &x)==1){
lin=NULL;
while(x!='\n' && fscanf(in, "%c", &x)==1 ){
lin=(char*)realloc(lin, sizeof(char));
lin[i++]=x;
}
recenica *novi;
novi=(recenica*)malloc(sizeof(recenica));
novi->linija=lin;
if(!first) first=zadnji=novi;
else{
zadnji->next=novi;
zadnji=novi;
}
}
for(pom=first;pom;pom=pom->next)
fprintf(out, "%s\n", pom->linija);
for(pom=first;pom;pom=pom2){
pom2=pom->next;
free(pom->linija);
free(pom);
}
return 0;
}
|
i bi li to bilo dobro rješenje?
|
|
[Vrh] |
|
|