PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   C i datoteke (https://forum.pcekspert.com/showthread.php?t=103334)

Bilobrkster 02.04.2008. 19:47

C i datoteke
 
trebaju mi zaista osnove, kako nešto upisati u datoteku te kako poslije to pročitati. Nešto sam sklepao za unos međutim čim unesem putanju datoteke, uopće ne dođe do unosa već se samo stvori prazna datoteka. to da je prazna sam provjerio tako što sam je otvorio u notepadu.

Citiraj:

#include
#include

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

FILE* f;
char c, dat[100];

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

f=fopen(dat, "w");


fprintf(f, "%c", &c);


fclose(f);
return 0;
}

munst0r 02.04.2008. 20:39

Ovo je uglavnom ok. No, u datoteku zelis upisati vrijednost varijable c, a tu vrijednost nigdje ne postavljas. Nadalje, funkciji fprintf si predao adresu te varijable, a trebao si njezinu vrijednost.


Umjesto linije:
fprintf(f, "%c", &c);

napisi:
c = 'c';
fprintf(f, "%c", c);

ejSid 02.04.2008. 21:21

Citiraj:

#include
#include

int main(){
char tmp;
FILE *ulazna;
FILE *izlazna;
ulazna=fopen("ulazna.txt","r");
izlazna=fopen("izlazna.txt","w+");
if(ulazna==NULL){
printf("Greska kod otvaranja.");
}
while ( (tmp=fgetc(ulazna)) != EOF ){
switch ( tmp ){
case 0xB9:
tmp=0x161;
fputc(tmp, izlazna);
break;
case 0xA9:
tmp=0xA3;
fputc(tmp, izlazna);
break;
case 0xE6:
tmp=0x184;
fputc(tmp, izlazna);
break;
case 0xC6:
tmp=0x186;
fputc(tmp, izlazna);
break;
case 0xE8:
tmp=0x10D;
fputc(tmp, izlazna);
break;
case 0xC8:
tmp=0x10C;
fputc(tmp, izlazna);
break;
case 0xF0:
tmp=0xC6;
fputc(tmp, izlazna);
break;
case 0xD0:
tmp=0xD0;
fputc(tmp, izlazna);
break;
case 0xBF:
tmp=0x9E;
fputc(tmp, izlazna);
break;
case 0xAF:
tmp=0xA7;
fputc(tmp, izlazna);
break;
default:
fputc(tmp, izlazna);
break;
}

}
fclose(ulazna);
fclose(izlazna);
return 0;
}
Evo ovo ti je program koji čita neki tekst iz datoteke i pretvara sva hrvatska slova iz UTF-8 standarda u ISO-8859-2 i zapisuje u drugu datoteku po imenu izlazna, ako izlazna datoteka ne postoji on ju kreira.

Bilobrkster 03.04.2008. 00:04

Evo sam se malo zaigrao i došao do ovoga, samo me još pere jedna stvar. Ako unesem 4 stringa u datoteku, pri ispisu mi ponavlja posljednji string. Zašto i kako to popravit?

Citiraj:

#include
#include

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

FILE* f;
char dat[100], str[30];


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 (int 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 (!(feof(f))) {
fscanf(f, "%s", &str);
printf("%s\n", str);
}

fclose(f);
system("PAUSE");
return 0;
}
hvala na odgovorima

munst0r 03.04.2008. 01:00

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
#include

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

Bilobrkster 03.04.2008. 10:02

puno ti hvala! spasio si me! još sam početnik u C-u pa napišem ovako koji put pizdariju :-)


Sva vremena su GMT +2. Sada je 03:16.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger