PDA

View Full Version : [C] System call write... info sugli interi


xsatellitex
08-12-2007, 13:26
Ma perche quando voglio stampare un intero ad esempio a video con:

int i=5;
write(1,&i,sizeof(int));

mi stampa caratteri strani... perche??
con le stringhe e i caratteri non ho problemi.. qualcuno lo sa?

ilsensine
08-12-2007, 13:35
Perché stai stampando la sequenza di caratteri 0x05 0x00 0x00 0x00, che lo schermo visualizza...come caratteri :D
Prova così:
dprintf(fileno(stdout), "%d", i);

andbin
08-12-2007, 13:36
Ma perche quando voglio stampare un intero ad esempio a video con:

int i=5;
write(1,&i,sizeof(int));

mi stampa caratteri strani... perche??Perché non è il modo corretto per stampare a video un valore numerico. Stai semplicemente inviando sullo standard output i 4 byte che compongono il valore intero.

Usa printf o se proprio vuoi usare write, almeno converti prima il numero in stringa e mandala in output con write.

xsatellitex
08-12-2007, 14:35
uh è vero :muro:
ho provato a utilizzare itoa per la conversione

int i=5;
char c[10];

itoa(i,c,10);

ma compilando sotto linux mi dice ld returned 1 exit status.
Pensavo bisognava inserire la libreria stdlib.h e stdio.h ma me lo fa lo stesso :muro:
ovviamente il pacchetto build-essential gia installato

ilsensine
08-12-2007, 14:46
Perché itoa non è una funzione standard, le libc non la implementano. Puoi usare la sprintf (oppure direttamente la dprintf come ti ho suggerito).

xsatellitex
08-12-2007, 16:48
si la fprintf va bene il problema è che devo utilizzare le system call anche perche poi devo scrivere anche su file con la write

ilsensine
08-12-2007, 16:49
si la fprintf va bene il problema è che devo utilizzare le system call anche perche poi devo scrivere anche su file con la write
La dprintf effettua da sola la sprintf + write, cosa ha che non va?

xsatellitex
08-12-2007, 16:52
ah non lo sapevo... grazie :D

xsatellitex
09-12-2007, 12:51
Scusate un ultima domanda al riguardo:

Perche con write e read riesco a scrivere e leggere correttamente gli interi nella pipe . Ad esempio:

int piped[2];
pipe(piped);
int a=2;
int b;
write(piped[1],&a,sizeof(int));
read(piped[0],&b,sizeof(int));

e invece nei casi di file e outputvideo (come precedentemente ho detto) non funge e devo utilizzare dprintf?
non dovrebbe essere la stessa identica cosa?
Ho sempre saputo che le pipe sono trattate come file.

ilsensine
09-12-2007, 20:46
Sì è la stessa cosa, i dati che transitano sono gli stessi. Quando li stampi a video però li devi convertire da numeri a stringhe!

xsatellitex
09-12-2007, 21:44
pero' con la write non riesco a stampare ne a video ne su file gli interi... come mai con la pipe questo non succede?? non capisco :muro: :muro:

xsatellitex
09-12-2007, 22:07
scusa ho risolto mi ero dimenticato che il printf converte direttamente in stringa. Ho provato questo programma:

main(){
int n=88,f;

int fd1=open("/home/xxxxx/Scrivania/a",O_RDWR);

write(fd,&n,sizeof(int));

read(fd1,&f,sizeof(int));

printf("%d\n",f);
}

funziona correttamente e mi stampa il numero 88 a video.Pero' se provo ad aprire il file leggo nei caratteri ASCII.
Il problema è che se volessi trattare i dati salvati sul file come interi e non come stringa... come dovrei fare?
con la dprintf li salvo sul file convertiti in stringa.