|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
[C] System call write... info sugli interi
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? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Perché stai stampando la sequenza di caratteri 0x05 0x00 0x00 0x00, che lo schermo visualizza...come caratteri
![]() Prova così: dprintf(fileno(stdout), "%d", i);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Usa printf o se proprio vuoi usare write, almeno converti prima il numero in stringa e mandala in output con write.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
uh è vero
![]() 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 ![]() ovviamente il pacchetto build-essential gia installato Ultima modifica di xsatellitex : 08-12-2007 alle 14:45. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Perché itoa non è una funzione standard, le libc non la implementano. Puoi usare la sprintf (oppure direttamente la dprintf come ti ho suggerito).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
si la fprintf va bene il problema è che devo utilizzare le system call anche perche poi devo scrivere anche su file con la write
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
La dprintf effettua da sola la sprintf + write, cosa ha che non va?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
ah non lo sapevo... grazie
![]() |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
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. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì è la stessa cosa, i dati che transitano sono gli stessi. Quando li stampi a video però li devi convertire da numeri a stringhe!
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
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
![]() ![]() |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Dec 2007
Messaggi: 190
|
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. Ultima modifica di xsatellitex : 09-12-2007 alle 22:20. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:01.