Forumi
Home Pravila i pomoć Članovi Kalendar Današnji postovi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 02.04.2008., 19:47   #1
Bilobrkster
Premium
Moj komp
 
Bilobrkster's Avatar
 
Datum registracije: May 2007
Lokacija: Croatia
Postovi: 270
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 <stdio.h>
#include <stdlib.h>

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;
}
Bilobrkster je offline   Reply With Quote
Staro 02.04.2008., 20:39   #2
munst0r
Premium
Moj komp
 
munst0r's Avatar
 
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
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);
munst0r je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 02.04.2008., 21:21   #3
ejSid
Lunatic
Moj komp
 
ejSid's Avatar
 
Datum registracije: Feb 2006
Lokacija: Varaždin
Postovi: 213
Citiraj:
#include<stdio.h>
#include<stdlib.h>

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.
ejSid je offline   Reply With Quote
Staro 03.04.2008., 00:04   #4
Bilobrkster
Premium
Moj komp
 
Bilobrkster's Avatar
 
Datum registracije: May 2007
Lokacija: Croatia
Postovi: 270
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 <stdio.h>
#include <stdlib.h>

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
Bilobrkster je offline   Reply With Quote
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
Staro 03.04.2008., 10:02   #6
Bilobrkster
Premium
Moj komp
 
Bilobrkster's Avatar
 
Datum registracije: May 2007
Lokacija: Croatia
Postovi: 270
puno ti hvala! spasio si me! još sam početnik u C-u pa napišem ovako koji put pizdariju :-)
Bilobrkster je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na