Newsgroup: it.comp.lang.c++
Titolo: Errore file binari

Salve, 
ho iniziato a studiare le funzioni per leggere e scrivere da/su file,
ma ottengo uno strano errore: ho scritto due funzioni (vedi il codice
in coda al messaggio), salva() e carica() che rispettivamente salvano
e caricano una struttura su/da file.
Il problema si presenta quando lancio il programma:
------------------- ES1 --------------------
//se ho nel main una chiamata del tipo
int main()
{
int res;
  // SALVO
 if ( (res = salva("prova.dat")) != 0)
  {
   cout << "Errore durante il salvataggio: errore numero " << res <<
endl;
  }
  // CARICO
 if ( (res = carica("prova.dat")) != 0 )
  {
   cout << "Errore durante il salvataggio: errore numero " << res <<
endl;
  }
 return 0;
}
----------------------------------------
allora non ottengo errori!
se invece faccio:
--------------------- ES 2 ---------------------
int main()
{
int res;
  // CARICO: il file prova.dat esiste gia' e c'è la struttura salvata
 if ( (res = carica("prova.dat")) != 0 )
  {
   cout << "Errore durante il salvataggio: errore numero " << res <<
endl;
  }
 return 0;
}
---------------------------------------------------
ottengo un errore: su schermo ho dei caratteri casuali! (eppure sul
file prova.dat c'è la struttura salvata!!!) 
Ho sicuramente commesso un errore, ma non riesco a trovarlo.... grrr
:)
qui c'è l'intero codice!
ah dimenticavo: programmo sotto DOS con il DJPGG.
Grazie a tutti! :)
--------------------- CODICE --------------------
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <string>
struct prova
{
 int     A;
 char    B;
 string  C;
 double  D;
};
/* ------- */
int salva( char *filename )
{
 FILE *fd = 0;
 int res = 0;
 prova struttura;
 struttura.A = 999;
 struttura.B = 'Z';
 struttura.C = "mia stringa";
 struttura.D = 1.99;
 fd = fopen(filename, "wb");
   if ( fd == 0 )
    return 1;
 res = fwrite( &struttura, sizeof(prova), 1, fd );
  if( res != 1 )
     return 2;
  fclose(fd);
  return 0;
}
/* ------- */
int carica( char *filename )
{
  FILE *fd = 0;
  int res = 0;
  prova tmp;
 // Ora leggo il file e memorizzo il risultato in una variabile
      fd = fopen(filename, "rb");
        if ( fd ==  0 )
          return 1;
    res = fread( &tmp, sizeof(prova), 1, fd );
        if( res != 1 )
         return 2;
   cout << "A = " << tmp.A << endl;
   cout << "B = " << tmp.B << endl;
   cout << "C = " << tmp.C << endl;
   cout << "D = " << tmp.D << endl;
}
/* ----- MAIN ----- */
int main()
{
int res;
  // SALVO
 if ( (res = salva("prova.dat")) != 0)
  {
   cout << "Errore durante il salvataggio: errore numero " << res <<
endl;
  }
  // CARICO
 if ( (res = carica("prova.dat")) != 0 )
  {
   cout << "Errore durante il salvataggio: errore numero " << res <<
endl;
  }
 return 0;
}

 ho iniziato a studiare le funzioni per leggere e scrivere da/su file,
Se elimini dalla struttura la stringa la cosa funziona.
La stringa e' quasi certamente implementata con uno o piu' puntatori. Ovviemente
non puoi salvare su file un puntatore dato che non puoi avere la certezza che la
memoria puntata contenga lo stesso valore quando lo rileggi.
Prova ad aprire il file che hai creato in un editor e vedrai che non contiene la
tua stringa ma solo l'indirizzo in cui questa e' stata allocata dinamicamente.
Prova a pensarci.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

Se elimini dalla struttura la stringa la cosa funziona.
hai ragione! il problema č lě! :)
non mi resta che modificare il programma!  :((
Grazie per l'aiuto!!
a presto :)