PDA

Visualizza la versione completa : [C++] Posizionamento all'interno di un file


jocker01
21-02-2007, 18:30
Ciao a tutti, sto programmando con c++ e sono incappato in un problema.

Dovrei salvare degli oggetti dello stesso tipo in un file binario:
- Lo apro normalmente con la fopen(...) in modalità scrittura
- utilizzo la fwrite(...) per scriverne uno
- riutilizzo la fwrite(...) per scriverne un altro
- PROBLEMA:
Quando utilizzo la fread(...) per leggere da file mi ditorna solo l'ultimo elemento scritto nel file anche se prima ho usato una rewind(...) per tornare all'inizio.

Qualche idea?

XWolverineX
21-02-2007, 18:54
Credo che dovresti usare fseek

jocker01
21-02-2007, 19:06
Ho provato ma nulla, ti espongo più chiaramente il problema:

/*considera tamp e tempo cone 2 puntatori ad oggetti*/

FILE *myFile;
myFile = fopen("prova.bin", "w");
fwrite(&temp, sizeof(Persona),1,myFile);
fflush(myFile);
/*aggiorno temp*/
fwrite(&temp, sizeof(Persona),1,myFile);
// ho provato a metterla quì: rewind(myFile);
fclose(myFile);
//ho provato a metterla quì: rewind(myFile);

myFile = fopen("prova.bin", "r");
//ho provato a metterla quì rewind(myFile);
// ho provato anche con questa fseek (myFile, 0L, SEEK_SET);
fread(&tempo, sizeof(Persona),1,myFile);
fclose(myFile);


se chiedo la stampa di "tempo" mi stampa l'ultimo oggetto inserito.
Ho provato di tutto ma non riesco, forse tu che ne sai più di me sai come venirne fuori...

oregon
21-02-2007, 19:36
Puoi inviare tutto il programma, compreso di main, per fare una prova?

jocker01
21-02-2007, 19:52
Non so come si fa; devo copiare tutti fil file ed incollarne il testo quì dentro?
perchè c'è più di un file e non sono molto corti...
Comunque in sostanza viste le indicazioni di prima hai qualche idea?

oregon
21-02-2007, 20:57
Originariamente inviato da jocker01
Comunque in sostanza viste le indicazioni di prima hai qualche idea?

No ... te le avrei scritto prima ...

Comunque, ad esempio, quando scrivi

/*aggiorno temp*/

mi devo fidare ... se nel codice c'e' un errore, non lo posso vedere e non ti posso dare una soluzione .... per questo ti chiedevo *tutto* il codice ...

jocker01
21-02-2007, 21:09
Guarda ti metto tutto il codice della funzione:

void prog::saveOnFile(){
FILE *myFile;
Persona* temp = new Persona(*lista);
Persona* tempo;// = new Persona();
Persona* index = lista;
myFile = fopen("prova.bin", "a+b");
while(index!=0){
*temp = *index;
cout<<"\n*** "<<temp->getNome()<<" ***";
fwrite(&temp, sizeof(Persona),1,myFile);
fflush(myFile);
index=index->getNext();
}
fclose(myFile);
cout<<"\n***********************************************";
myFile = fopen("bprova.bin", "r+b");
rewind(myFile);
while(!feof(myFile)){
fread(&tempo, sizeof(Persona),1,myFile);
cout<<"\n*** "<<tempo->getNome()<<" *** - LETTO";
cout<<"\n*** "<<tempo->getCognome()<<" *** - LETTO";
cout<<"\n*** "<<tempo->getCodFisc()<<" *** - LETTO";
cout<<"\n*** "<<tempo->getUserId()<<" *** - LETTO";
cout<<"\n*** "<<tempo->getPwd()<<" *** - LETTO";
}
fclose(myFile);
}


All'inizio me li stampa giusti, poi quando viene lanciata la lettura da file mi stampa solo i parametri dell'ultimo, ed oltretutto una volta in più rispetto al numero di inserimenti...

oregon
21-02-2007, 21:55
Per questioni di tempo e praticita', non puoi fare uno zip e metterlo a disposizione per il test e debug ?

jocker01
21-02-2007, 22:13
Sinceramente non so come si fa ad allegare quì i files...

oregon
21-02-2007, 22:19
Crea uno zip e pubblicalo su qualche sito da cui posso scaricarlo ...

Loading