Tema: C i datoteke
View Single Post
Staro 03.04.2008., 01:00   #5
munst0r
Premium
Moj komp
 
munst0r's Avatar
 
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
Prije nego ti odgovorim na pitanje zasto se ponavlja zadnji string, moram napisati par par primjedbica.

Napisao si for (int i=1; i<=4; i++). S obzirom da se ovdje radi o C-u, a ne C++u, to nije ispravno. U C-u se varijable smiju deklarirati SAMO na pocetku bloka. Dakle, odmah ispod otvorene viticaste zagrade {. I nigdje vise. U tvom slucaju, tu varijablu i je trebalo deklarirati na pocetku maina, zajedno s onim stringovima.
Vecina danasnjih kompajlera, uz C, moze probaviti i C++ koji podrzava ovakvu deklaraciju varijabli. No, to nije prema C standardu i mozes se naci u situaciji da ce neki kompajler baciti error na ovome.


Nadalje, vidim da te muci operator '&'. Necu se sad upustati u neka predetaljna objasnjavanja jer ne znam koliko si uopce upoznat s tim operatorom. Ali, zato upamti ovo: nikada ga nemoj stavljati ispred varijable koja predstavlja polje.
Npr. u svom programu imas polja dat i str. NIKADA neces pisat &dat ili &str. Recimo da zelis dobiti adresu petog clana nekog polja, onda je ispravno napisati &dat[4], ali samo &dat nikako. Opet, ni ovo nije nikakva fatalna greska. Nisam ni siguran sto tocno C standard kaze o tome. Stovise, dok napises dat i &dat, to u vecini slucajeva ima identicno znacenje. Ali ako ces nekada pristupati polju preko pokazivaca, onda moze doci do razlicitih interpretacija.


No dobro, a sada objasnjenje zasto ti se zadnja rijec ispise dva puta.

U datoteku zapisujes pomocu ovog komada koda:
Citiraj:
for (i=1; i<=4; i++){
scanf("%s", str);
fprintf(f, "%s\n", str);
}
Iza svakog stringa zapisujes jos '\n'. Znaci da ce i iza zadnjega ostati jos jedan prazan redak. Datoteka ce ukupno imati 4 puna i 1 prazan redak.

Pogledajmo sada kako ispisujes datoteku:
Citiraj:
while (!(feof(f))) {
fscanf(f, "%s", str);
printf("%s\n", str);
}
Ovo ispisuje stringove dok ne dodje do kraja datoteke. Sve je jasno za prva 4 retka, no sto se desava u petom ponavljanju petlje? Pokazivac koji oznacava trenutni polozaj u datoteci se nalazi u petom redu. Funkcija feof zakljuci da to jos nije kraj datoteke (jer se tu jos ne nalazi EOF nego '\n') i ulazi se u petlju po peti put. Funkcija scanf sada pokusa procitati string, ali ga ne nalazi i ne procita ama bas nista. Zbog toga u varijabli str ostaje zapisana prethodna vrijednost koja se ponovo ispisuje. Nakon toga se petlja pokusa ponoviti sesti put, ali feof sada zakljuci da je dosao do kraja i prekida petlju.


Evo na kraju i program s ispravljenim greskicama koje sam spomenuo i ispisivanjem datoteke slozenim na drugaciji nacin. Nacina naravno ima jako puno.

Citiraj:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) {

FILE* f;
char dat[100];
char str[30];
char znak;
int i;


printf("Unesi ime(putanju) datoteke: ");
scanf("%s", dat);

if ((f = fopen(dat, "w+"))==NULL){
printf("Datoteka se ne može otvoriti za pisanje!");
return -1;
}

for (i=1; i<=4; i++){
scanf("%s", str);
fprintf(f, "%s\n", str);
}
fclose(f);

if ((f = fopen(dat, "r"))==NULL){
printf("Datoteka se ne može otvoriti za citanje!");
return -1;
}

while (1) {
znak = fgetc(f);
if (znak == EOF) break;

printf("%c", znak);
}

//while (!(feof(f))) {
// fscanf(f, "%s", str);
// printf("%s\n", str);
//};

fclose(f);
system("PAUSE");
return 0;
}

Zadnje izmijenjeno od: munst0r. 03.04.2008. u 01:19.
munst0r je offline   Reply With Quote