Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Leggere da un file binario un array di strutture...
Forum - C/C++ - Leggere da un file binario un array di strutture...

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Ho un array di strutture che contengono due campi:

Codice sorgente - presumibilmente C/C++

  1. struct HighPos {
  2.         char Name[6]; // 5 Chars + '\0'
  3.         int Score;
  4. };
  5.  
  6. HighPos HScore[10];



E un file che contiene i dati in modo seriale, come posso leggerlo?

Ho già provato a leggerlo con le stream facendo un cast dell'array, ma la lettura termina dopo il primo nome in quanto trova un carattere 0.

Qualcuno sa come leggerlo?

Grazie

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:08
Sabato, 22/09/2012
Puoi semplicemente usare

Codice sorgente - presumibilmente C/C++

  1. FILE *fh = fopen("file", "rb");
  2.         fread(HScore, sizeof(struct HighPos), 10, fh);
  3.         fclose(fh);



ma poi controlla il risultato, elemento per elemento, perché potresti avere problemi a seconda dell'allineamento usato (pack)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:20
Lunedì, 24/09/2012
Funziona, Grazie, ma non riesco a salvarlo alla chiusura:

Codice sorgente - presumibilmente C/C++

  1. HighScoreClass::~HighScoreClass() {
  2.         FILE *fh;
  3.         if(!fopen_s(&fh, "HS.dat", "wb")) {
  4.                 fwrite(HScore, sizeof(struct HighPos), NScores, fh);
  5.                 fclose(fh);
  6.         }
  7. }



Metto un breakpoint e non si ferma mai, allora ho pensato di eliminare l'oggetto esplicitemente prima di terminare il programma con: delete HighScore; in debug mi passa per il delete, ma non per il distruttore e in relase dice che non ha compilato l'istruzione delete...

Uso VC++ 2010 se può essere utile... non capisco perchè non va....

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:56
Lunedì, 24/09/2012
Puoi mostrare la parte del main coinvolta e la classe ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:38
Martedì, 25/09/2012
Main:

Codice sorgente - presumibilmente C/C++

  1. void finalize(void) {
  2.         if(cScene) cScene->finalize();
  3.         Global->finalize();
  4.         finalizeScenes(); // Vedi Sotto
  5.         if(timer)               al_destroy_timer(timer);
  6.         if(display)             al_destroy_display(display);
  7.         if(event_queue) al_destroy_event_queue(event_queue);
  8. }
  9.  
  10. int main(int argc, char* argv[]) {
  11.         init();
  12.         game_loop();
  13.         finalize();
  14. }



La classe:

Codice sorgente - presumibilmente C++

  1. extern Scene *HighScore;
  2.  
  3. class HighScoreClass: public Scene {
  4. public:
  5.         HighScoreClass();
  6.         void draw_front();
  7.         void input(ALLEGRO_EVENT event);
  8.         ~HighScoreClass();
  9. };



Inizializza e finalizza Scene:

Codice sorgente - presumibilmente C#

  1. void initScenes() {
  2.         Global = new GlobalClass();
  3.         Menu = new MenuClass();
  4.         HighScore = new HighScoreClass();
  5.         Game = new GameClass();
  6. }
  7.  
  8. void finalizeScenes() { // Finalizza Scene
  9.         delete Global;
  10.         delete Menu;
  11.         delete HighScore; // Questo non viene compilato in modalità Relase, ma in debug viene eseguito
  12.         delete Game;
  13. }



E anche se quello sopra viene eseguito, non entra nel distruttore dell'oggetto:

Codice sorgente - presumibilmente C/C++

  1. HighScoreClass::~HighScoreClass() { // Non compilato e non eseguito in Relase, compilato, MA NON eseguito, in Debug
  2.         FILE *fh;
  3.         if(!fopen_s(&fh, "HS.dat", "wb")) {
  4.                 fwrite(HScore, sizeof(struct HighPos), NScores, fh);
  5.                 fclose(fh);
  6.         }
  7.         if(HSFont)      al_destroy_font(HSFont);
  8.         if(hs)          al_destroy_bitmap(hs);
  9. }


Ultima modifica effettuata da il 25/09/2012 alle 16:40
PM Quote