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