Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - fwrite e fread
Forum - C/C++ - fwrite e fread

Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 16:33
Giovedì, 23/12/2010
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:

Codice sorgente - presumibilmente C/C++

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



Codice sorgente - presumibilmente C/C++

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



Perché succede questo inconveniente?  

PM
Avatar
arack95 (Member)
Pro


Messaggi: 144
Iscritto: 15/11/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 17:21
Giovedì, 23/12/2010
Codice sorgente - presumibilmente C/C++

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



Devi mettere
Codice sorgente - presumibilmente C/C++

  1. 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.
Codice sorgente - presumibilmente C/C++

  1. char c = '1';
  2. fwrite(&c, 1, 1, stream);


Qua trovi una tabella con i caratteri ascii: http://www.oppo.it/tabelle/tabella_ascii.htm

Ultima modifica effettuata da arack95 il 23/12/2010 alle 17:31
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
1
Down
V
Segnala al moderatore
Postato alle 19:26
Giovedì, 23/12/2010
Testo quotato

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



PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 19:35
Giovedì, 23/12/2010
grazie ad Hedo, arack95 e calduke

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 15:42
Venerdì, 24/12/2010
però ragazzi ho provato a creare e compilare quindi eseguire questo programma:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.         int anni;
  5.         char *nome;
  6. } persona;
  7.  
  8. int main (void) {
  9.         persona uomo;
  10.         uomo.anni = 16;
  11.         uomo.nome = "Francesco";
  12.         FILE *testo;
  13.         testo = fopen("prova", "wb");
  14.         fwrite(&uomo, sizeof(persona), 1, testo);
  15.         /* vediamo se li legge */
  16.         fread(&uomo, sizeof(persona), 1, testo);
  17.         printf("Persona {\n\t anni = %d\n\t nome = %s\n}\n\n", uomo.anni, uomo.nome);
  18.         fclose(testo);
  19.         return 0;
  20. }


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?

Codice sorgente - presumibilmente Plain Text

  1. pitagora@pitagora:~$ ./try
  2. Persona {
  3.          anni = 16
  4.          nome = Francesco
  5. }


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:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.         int anni;
  5.         char *nome;
  6. } persona;
  7.  
  8. int main (void) {
  9.         persona uomo;
  10.         uomo.anni = 16;
  11.         uomo.nome = "Francesco";
  12.         FILE *testo;
  13.         testo = fopen("prova", "wb");
  14.         fwrite(&uomo, sizeof(persona), 1, testo);
  15.         /* vediamo se li legge */
  16.         fscanf(testo, "%d", &uomo.anni);
  17.         fscanf(testo, "%s", uomo.nome);
  18.         printf("Persona {\n\t anni = %d\n\t nome = %s\n}\n\n", uomo.anni, uomo.nome);
  19.         fclose(testo);
  20.         return 0;
  21. }



Output:
Codice sorgente - presumibilmente Plain Text

  1. pitagora@pitagora:~$ ./try
  2. Persona {
  3.          anni = 16
  4.          nome = Francesco
  5. }


me le legge tranquillamente! Perchè con un editor no?  :rotfl:

Ultima modifica effettuata da Pitagora il 24/12/2010 alle 15:50
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 16:34
Giovedì, 23/12/2010
credo che scriva il carattere ascii corrispondente al valore di 'i'.

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:35
Giovedì, 23/12/2010
quindi, se voglio scrivere un numero devo racchiuderli dentro apici?

già... - arack95 - 23/12/10 20:08
PM
Avatar
ramy1989 (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 16:09
Giovedì, 06/01/2011
Puoi benissimo scrivere un intero,solo che la quantità di memoria necessaria ad ospitare un intero non è 1 byte.
Codice sorgente - presumibilmente C/C++

  1. int numero=5;
  2. ...
  3. fwrite (buffer , 1 , sizeof(numero) , pFile );
  4. ...


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:
Codice sorgente - presumibilmente C/C++

  1. int numero=5;
  2. char numero_copia = 5+48;
  3. ...
  4. fwrite(numero_copia,1,sizeof(char),pFile);
  5. ...



Ultima modifica effettuata da ramy1989 il 06/01/2011 alle 16:10
PM