[ Mikky @ 13.06.2001. 23:59 ] @
kako da otvorim stream ka fajlu koji dam u argumentu
npr.
./blah file.txt
e sad da imam stream ka file.txt

onda me zanima sledece da li postoji funkcija
koja ce da mi int pretvori u string
znam da ima ono char(int) ali to ce da mi
broj 123 pretvori u ascii kod 123 a meni treba
da bude strig od 3 karaktera + null karakter na kraju

ili funkcija koja ce da mi na kraj stringa doda int
(znam da postoji za dodavanje stringa i chara ali ne i inta)
[ Vojislav Milunovic @ 14.06.2001. 11:23 ] @
1.
Code:

int main(int argc,char **argv){
  FILE *stream=fopen(argv[1],"r");
/* ... */
 fclose(stream);
}


2.
Koristi sprintf() funkciju

Code:

int main(){
 char buf[24];   // ne znam zasto ali uvek stavim vise prostora nego sto treba ;o)
 int gg=123;
 sprintf(buf,"%d",gg);
 printf("%s\n",buf);


[ Mikky @ 14.06.2001. 17:58 ] @
ql radi...je*ote ti to sve drzis u malom prstu

e sad posto sam to resio javilo se jos problema
prvo zasto ovo zajebava?

int main(int argc, char *argv[])
{
char str[20];
....
str=argv[1]
....
}

kaze: incompatible types in assignment
zar nije sve jedno da li ce da stoji
**argv
*argv[]
argv[][]
kao paramtetri main funkcije

drugo
kad imam neku funkciju i sad ako dodje do neke greske
onda ce da ona uradi perror() i da izbaci gresku
na ekran
ono sto ja hocu je da funkcija vrati tu gresku
znaci nesto tipa return perror();
ali to je nemoguce jer perror vraca void.
errno globalna promenljiva definisana u errno.h je tipa
int tako da otpada i mogucnost return errno; jer to
vraca int a meni treba string na koji taj int ukazuje

dakle kako da mi funkcija vrati tu gresku u obliku stringa
a ne da je ispise na ekran

[ Vojislav Milunovic @ 14.06.2001. 19:21 ] @
Citat:
Mikky je napisao:
e sad posto sam to resio javilo se jos problema
prvo zasto ovo zajebava?

Code:

int main(int argc, char *argv[])
{
  char str[20];
....
str=argv[1]
....
}


kaze: incompatible types in assignment


Pa pazi nemozes tako da radis da u niz ubacujes pointer ;o) ovo bi se resilo sa strcpy().
Jednostavno str ti je niz ali je argv[1] pointer na neki string niz pa se tu koristi strcpy().
[str ]
argv[0] -> neki_string

Citat:

zar nije sve jedno da li ce da stoji
**argv
*argv[]
argv[][]
kao paramtetri main funkcije


Aposlutno je sve jedno

Citat:

drugo
kad imam neku funkciju i sad ako dodje do neke greske
onda ce da ona uradi perror() i da izbaci gresku
na ekran
ono sto ja hocu je da funkcija vrati tu gresku
znaci nesto tipa return perror();
ali to je nemoguce jer perror vraca void.
errno globalna promenljiva definisana u errno.h je tipa
int tako da otpada i mogucnost return errno; jer to
vraca int a meni treba string na koji taj int ukazuje

dakle kako da mi funkcija vrati tu gresku u obliku stringa
a ne da je ispise na ekran


Nemozes to da uradis iz prostog razloga sto su ti stringovi definisani negde u libovima.
perror() samo stampa te stringove u zavisnosti od greske.Najbolje resenje ti je da koristis ovako nesto kad naletis na gresku :

Code:

void die(const char *str){
  perror(str);
  exit(1);
}
[ Mikky @ 15.06.2001. 00:11 ] @
za ovo prvo
jel bi onda moglo ovako

int main(int argc, char argv[][])
{
char aaa[] = argv[1];
.......

evo tu je argv dupli niz :)
ako ne moze i ovako onda kako da smestim argument u char niz ali bez tih funkcija ako je moguce ?
mozda da stavim argv*[] i *string
pa onda string = argv[1] ??

a za ovo drugo
ok pazi ono sto ja hocu je da mi gresku pise u fajl a ne na stderror tj ekran
ovo sam hteo da resim ovako

fprintf( phile, funkcija() )

e sad ova funkcija treba nesto da sljaka i ako je sve ok ona ce da vrati neki string koji ce da upise u stream "phile" ali ako dodje do greske hocu da mi onda vrati tu gresku u text obliku koja ce da se loguje u taj fajl
e sad takodje ja necu da mi kad dodje do greske bude exit(1) i da mi se prekine izvrsavanje celog programa vec samo da mi izadje iz te funkcije
sto se radi sa return a program da nastavi dalje da radi
sad ono valjda si razumeo :)

btw da li je moguce da mi return vrati nesto tipa

funkcija()
{
.......
return "Error " neki_string[] " lol"
}

znaci da vrati npr. "Error user is too stupid for this program lol"
znaci vise parametara, nemora bas ova kombinacija
literal string, string, literal string vec moze i bilo sta umesto neki_string[]
npr int ili long






[ Vojislav Milunovic @ 15.06.2001. 10:36 ] @
Citat:
Mikky je napisao:
za ovo prvo
jel bi onda moglo ovako

int main(int argc, char argv[][])
{
char aaa[] = argv[1];
.......

evo tu je argv dupli niz :)
ako ne moze i ovako onda kako da smestim argument u char niz ali bez tih funkcija ako je moguce ?
mozda da stavim argv*[] i *string
pa onda string = argv[1] ??

Styo se tice definisanja argv sve je jedno kako ces da stavis jel argv pokazuje na niz pointera prema tome ispravno bi bilo napraviti pointer char i njemu dodeliti adresu od argv[x]
znaci
Code:

char *tmp = argv[1];


moras da pravis razliku izmedju ovoga ->
Code:

 char *buf="predator";
 char buf1[]="predator";


buf -----> [predator]
buf1 [predator]

Znaci buf pokazuje na taj string u data segmentu a u buf1 je smesten taj string

Citat:

a za ovo drugo
ok pazi ono sto ja hocu je da mi gresku pise u fajl a ne na stderror tj ekran
ovo sam hteo da resim ovako

fprintf( phile, funkcija() )

e sad ova funkcija treba nesto da sljaka i ako je sve ok ona ce da vrati neki string koji ce da upise u stream "phile" ali ako dodje do greske hocu da mi onda vrati tu gresku u text obliku koja ce da se loguje u taj fajl
e sad takodje ja necu da mi kad dodje do greske bude exit(1) i da mi se prekine izvrsavanje celog programa vec samo da mi izadje iz te funkcije
sto se radi sa return a program da nastavi dalje da radi
sad ono valjda si razumeo :)


Mozes da koristis freopen() . Naime ta funkcija sluzi da se vec postojeci stream zatvori i otvori na drugi.
Primer :
Code:

#include<stdio.h>
int main(){
  FILE * str;
  FILE * stream=freopen("/tmp/gg","w",stderr);
  str=fopen("/tmp/aaaaaaaaaaa","r");
  perror("");
}            


U ovom slucaju je /tmp/aaaaaaaaa neki nepostojeci file i perror() treba da stampa gresku u stderr ali kako smo zatvorili stderr i preusmerili ga na /tmp/gg tada ce greska da te ceka u /tmp/gg

Citat:

btw da li je moguce da mi return vrati nesto tipa

funkcija()
{
.......
return "Error " neki_string[] " lol"
}

znaci da vrati npr. "Error user is too stupid for this program lol"
znaci vise parametara, nemora bas ova kombinacija
literal string, string, literal string vec moze i bilo sta umesto neki_string[]
npr int ili long


Nemoze tako da vrati ;o)
Moze da vrati adresu od stringa ->
Code:

char *gg(){
 return "predator";
}

int main(){
 char *pr=gg();
 printf("%s\n",pr);
}                 


Mozes da koristis recimo staticki buffer pa da u njega potrpas sve zivo sa sprintf() i onda nema potrebe da vrces sa return.

[Ovu poruku je menjao predator dana 06-15-2001 u 09:41 AM GMT]