Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [C] Leggere record da file binario

    Ciao a tutti, sto avendo un problema che non capisco molto bene...

    Io ho una struttura definita così:

    codice:
    typedef struct _esame
    {
        char nome[20];
        int voto;
        int crediti;
    } Esame;
    Il programma le fa inserire all'utente e le salva su un file, che poi visualizza, con le due funzioni:

    codice:
    void aggiungi(FILE* fp)
    {
        fseek(fp, 0, SEEK_END);
        Esame tmp = leggi_esame();
    
        fwrite(&tmp, sizeof(Esame), 1, fp);
    }
    
    void visualizza(FILE* fp)
    {
        fseek(fp, 0, SEEK_SET);
        Esame tmp;
    
        printf("\nEsami:\n");
    
        while (fread(&tmp, sizeof(Esame), 1, fp) == 1)
            stampa_esame(tmp);
    
        printf("\n");
    }
    Eppure, per motivi a me del tutto sconosciuti, stampa sempre e solo il PRIMO record del file.
    Se io ne aggiungo altri, questi vengono effettivamente salvati sul file (le dimensioni del file aumentano ogni volta di 28 byte, ovvero la dimensione della struttura), e infatti se apro la struttura con notepad riesco a vedere che sono stati aggiunti anche gli altri...

    Come mai?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Puoi postare tutto il codice (compreso il main) compilabile senza errori per provarlo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Eccolo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _esame
    {
        char nome[20];
        int voto;
        int crediti;
    } Esame;
    
    Esame leggi_esame()
    {
        Esame result;
        fflush(stdin);
    
        printf("Nome: ");
        gets(result.nome);
    
        printf("Voto: ");
        scanf("%d", &result.voto);
    
        printf("Crediti: ");
        scanf("%d", &result.crediti);
    
        return result;
    }
    
    void stampa_esame(Esame ex)
    {
        printf("%-20s\t%d\t(%d crediti)\n", ex.nome, ex.voto, ex.crediti);
    }
    
    void visualizza(FILE* fp)
    {
        fseek(fp, 0, SEEK_SET);
        Esame tmp;
    
        printf("\nEsami:\n");
    
        while (fread(&tmp, sizeof(Esame), 1, fp) == 1)
            stampa_esame(tmp);
    
        printf("\n");
    }
    
    void aggiungi(FILE* fp)
    {
        fseek(fp, 0, SEEK_END);
        Esame tmp = leggi_esame();
    
        fwrite(&tmp, sizeof(Esame), 1, fp);
    }
    
    int main()
    {
        FILE* fp = fopen("C:\\Users\\Michele\\Desktop\\libretto.dat", "r+");
        if (fp == NULL)
            fp = fopen("C:\\Users\\Michele\\Desktop\\libretto.dat", "w+");
    
        int main_menu_opt = 0;
    
        do
        {
            printf("1 - Visualizza.\n");
            printf("2 - Aggiungi.\n");
            printf("--> ");
            scanf("%d", &main_menu_opt);
    
            switch (main_menu_opt)
            {
                case 0: break;
                case 1: visualizza(fp);
                        break;
                case 2: aggiungi(fp);
                        break;
                default: printf("Unknown command.\n");
                        break;
            }
    
            printf("\n");
    
        } while (main_menu_opt);
    
        return 0;
    }
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Ho provato e funziona regolarmente ... almeno, non sono riuscito a replicare il problema ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Oregon, non sai quanta gioia mi porti xD
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Comunque pare che non ci siano errori sintattici o logici... no? Almeno, a me sembra giusto...
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    A prima vista, sembra a posto ... (a parte che dovresti indicare di scegliere 0 per uscire ... un dettaglio).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Si, hai ragione, ma tanto è per mio puro uso personale, non è nemmeno un esercizio. Dopodomani ho un esame e mi sto inventando domande che può farmi.

    Per inciso, il problema è "risolto". Nel senso, non ho la più pallida idea del perchè non funzionasse. Però prima ero su windows 7. Nella disperazione sono passato su Ubuntu, e ora funziona. Avrà a che fare con fflush? Su ubuntu l'ho dovuta cambiare, dato che non funziona... per il resto i due listati sono identici.

    Bah.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Io ho provato su XP ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Ok, allora è colpa di 7. Beh, mi consolo, sui pc dell'uni c'è XP, sono salvo ^^

    Grazie mille
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.