PDA

Visualizza la versione completa : [C] Leggere record da file binario


Ippo343
21-06-2010, 20:23
Ciao a tutti, sto avendo un problema che non capisco molto bene...

Io ho una struttura definita così:



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:



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? :confused:

oregon
21-06-2010, 20:35
Puoi postare tutto il codice (compreso il main) compilabile senza errori per provarlo?

Ippo343
21-06-2010, 20:44
Eccolo:




#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;
}

oregon
21-06-2010, 20:47
Ho provato e funziona regolarmente ... almeno, non sono riuscito a replicare il problema ... :bhò:

Ippo343
21-06-2010, 20:54
Oregon, non sai quanta gioia mi porti xD

Ippo343
21-06-2010, 21:05
Comunque pare che non ci siano errori sintattici o logici... no? Almeno, a me sembra giusto...

oregon
21-06-2010, 21:07
A prima vista, sembra a posto ... (a parte che dovresti indicare di scegliere 0 per uscire ... un dettaglio).

Ippo343
21-06-2010, 21:10
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. :confused:

oregon
21-06-2010, 21:11
Io ho provato su XP ...

Ippo343
21-06-2010, 21:16
Ok, allora è colpa di 7. Beh, mi consolo, sui pc dell'uni c'è XP, sono salvo ^^

Grazie mille :)

Loading