Oppure

Loading
23/12/10 15:33
Pitagora
Non riesco a capire perchè se gli passo un carattere la funzione fwrite mi scrive un carattere se invece inserisco un numero mi scrive un lettera strana.

Esempio:

int i = 'c';
fwrite(&i, 1, 1, stream); /* sul file mi ritroverò la lettera c */


int i = 5;
fwrite(&i, 1, 1, stream); /* sul file mi ritroverò una lettera strana */ 


Perché succede questo inconveniente?
aaa
23/12/10 15:34
credo che scriva il carattere ascii corrispondente al valore di 'i'.
23/12/10 16:21
arack95
int i = 5; 
fwrite(&i, 1, 1, stream); /* sul file mi ritroverò una lettera strana */


Devi mettere
int i = '1';

...

Accade semplicemente perché passi l'indirizzo di un intero contenente il valore del carattere ascii da salvare, se passi 49(o l'equivalente '1' in char) stampa '1'.
Comunque al posto di passare un int puoi passare un char... è la stessa cosa.
char c = '1';
fwrite(&c, 1, 1, stream);

Qua trovi una tabella con i caratteri ascii: oppo.it/tabelle/…
Ultima modifica effettuata da arack95 23/12/10 16:31
aaa
23/12/10 16:35
Pitagora
quindi, se voglio scrivere un numero devo racchiuderli dentro apici?
aaa
23/12/10 18:26
HeDo
Postato originariamente da Pitagora:

quindi, se voglio scrivere un numero devo racchiuderli dentro apici?


si, perchè non è un numero è un carattere, provare per credere:

(int)'1' != 1


aaa
23/12/10 18:35
Pitagora
grazie ad Hedo, arack95 e calduke
aaa
24/12/10 14:42
Pitagora
però ragazzi ho provato a creare e compilare quindi eseguire questo programma:

#include <stdio.h>

typedef struct {
	int anni;
	char *nome;
} persona;

int main (void) {
	persona uomo;
	uomo.anni = 16;
	uomo.nome = "Francesco";
	FILE *testo;
	testo = fopen("prova", "wb");
	fwrite(&uomo, sizeof(persona), 1, testo);
	/* vediamo se li legge */
	fread(&uomo, sizeof(persona), 1, testo);
	printf("Persona {\n\t anni = %d\n\t nome = %s\n}\n\n", uomo.anni, uomo.nome);
	fclose(testo);
	return 0;
}

Come potete vedere scrivo grazie alla funzione fwrite tutta la struct persona. Come potete vedere dichiaro la variabile int anni (presente nella struct persona) = 16 (senza apici) Successivamente leggo ciò che ho scritto in precedenza è indovinato che esce?

pitagora@pitagora:~$ ./try
Persona {
	 anni = 16
	 nome = Francesco
}


Non dovrebbe uscire l'ascii di 16?

Un altra domanda: se apro il file con un banalissimo editor mi escono scritte senza senso. Se invece faccio eseguire questo programma (simile a precedente), volevo vedere se con altre funzioni tipo fscanf riusciva a leggere.

Risultato:
#include <stdio.h>

typedef struct {
	int anni;
	char *nome;
} persona;

int main (void) {
	persona uomo;
	uomo.anni = 16;
	uomo.nome = "Francesco";
	FILE *testo;
	testo = fopen("prova", "wb");
	fwrite(&uomo, sizeof(persona), 1, testo);
	/* vediamo se li legge */
	fscanf(testo, "%d", &uomo.anni);
	fscanf(testo, "%s", uomo.nome);
	printf("Persona {\n\t anni = %d\n\t nome = %s\n}\n\n", uomo.anni, uomo.nome);
	fclose(testo);
	return 0;
}


Output:
pitagora@pitagora:~$ ./try
Persona {
	 anni = 16
	 nome = Francesco
}

me le legge tranquillamente! Perchè con un editor no? :rotfl:
Ultima modifica effettuata da Pitagora 24/12/10 14:50
aaa
06/01/11 15:09
ramy1989
Puoi benissimo scrivere un intero,solo che la quantità di memoria necessaria ad ospitare un intero non è 1 byte.
int numero=5;
...
fwrite (buffer , 1 , sizeof(numero) , pFile );
...

Il terzo argomento della fwrite è la quantità di byte da scrivere,l' operatore sizeof ritorna la quantità di byte di una variabile.
Puoi benissimo scrivere qualsiasi variabile su un file,basta specificare la quantità di memoria da scrivere.
Un carattere ha un byte,l' alternativa è convertire l' intero in carattere e scriverlo come carattere,se ha una sola cifra:
int numero=5;
char numero_copia = 5+48;
...
fwrite(numero_copia,1,sizeof(char),pFile);
...

Ultima modifica effettuata da ramy1989 06/01/11 15:10
aaa