PDA

Visualizza la versione completa : [c]errore lettura e scrittura file binario


SpecialOne1992
28-06-2012, 13:57
allora ho dichiarato questa struttura e globalmente queste variabili

typedef struct{
char nome[20];
char cognome[20];
char lnascita[20];
}classe;

classe alunno[30];
classe temp[30];
int i=0;

nella funzione scrivi_file creo un file binario e scrivo la struttura


void scrivi_file(){
FILE*fp=NULL;
fp=fopen("anagrafe.dat","ab");
if(fp==NULL) printf("impossibile creare il file\n");
else{
printf("inserisci informazione su file\n");
printf("inserisci nome\n");
fflush(stdin);
gets(alunno[i].nome);
printf("inserisci cognome\n");
gets(alunno[i].cognome);
printf("inserisci luogo di nascita\n");
gets(alunno[i].lnascita);
fwrite(&alunno[i],sizeof(classe),1,fp);
i++;
fclose(fp);
}
}

e nella funzione carica_file carico il file se esiste(il controllo l'ho fatto nel main quindi entro nella funzione solo se fp è diverso da NULL) quello che leggo lo salvo in una variabile temporanea del tipo struct classe.

void carica_file(FILE*fp){
int j=0;
while(fread(&temp[j],sizeof(classe),1,fp)>0){
j++;
}
}


poi per verificare se ho letto correttamente nella stessa funzione per prova mi sono stampato un campo solo che non lo visualizzo
printf("%s\n",temp[0].nome);
mi stampa una riga vuota infatti se scrivo per es
printf("ciao %s\n",temp[0].nome); ciao lo stampa correttamente ma non visualizzo il resto

oregon
28-06-2012, 14:16
Ma la open del file in lettura dove la fai?

SpecialOne1992
28-06-2012, 14:20
Originariamente inviato da oregon
Ma la open del file in lettura dove la fai?
la faccio nel main

fp=fopen("anagrafe.dat","rb");
if(fp==NULL) printf("il file non esiste\n");
else
carica_file(fp);

oregon
28-06-2012, 14:31
Allora pubblica tutto il codice, compreso il main, perché il problema potrebbe essere ovunque ...

SpecialOne1992
28-06-2012, 14:34
Originariamente inviato da oregon
Allora pubblica tutto il codice, compreso il main, perché il problema potrebbe essere ovunque ...
ok.. il codice si inserisce all'interno di un programma che devo completare.. cmq sia l'ho osto interamente

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char nome[20];
char cognome[20];
char lnascita[20];
}classe;

classe alunno[30];
classe temp[30];
int i=0;

int menu(void);
void carica_file(FILE*);
int ricerca_stampa(FILE*);
void scrivi_file(void);

int main(void){
int scelta;
FILE*fp;

do{
scelta=menu();
switch(scelta){
case 1:
scrivi_file();
break;
case 3:
fp=fopen("anagrafe.dat","rb");
if(fp==NULL) printf("il file non esiste\n");
else
carica_file(fp);
break;
case 4:
break;
default:
printf("operazione non consentita\n");
}
}
while(scelta!=4);
return 0;
}



int menu(){
int scelta;
printf("Benvenuto nel menu'\n");
printf("1.scrivi file anagrafe\n");
printf("2.ricerca e stampa file anagrafe\n");
printf("3.carica file\n");
printf("4.Esci\n");
scanf("%d",&scelta);
return scelta;
}


void scrivi_file(){
FILE*fp=NULL;
fp=fopen("anagrafe.dat","ab");
if(fp==NULL) printf("impossibile creare il file\n");
else{
printf("inserisci informazione su file\n");
printf("inserisci nome\n");
fflush(stdin);
gets(alunno[i].nome);
printf("inserisci cognome\n");
gets(alunno[i].cognome);
printf("inserisci luogo di nascita\n");
gets(alunno[i].lnascita);
fwrite(&alunno[i],sizeof(classe),1,fp);
i++;
fclose(fp);
}
}

void carica_file(FILE*fp){
int j=0;
while(fread(&temp[j],sizeof(classe),1,fp)>0){
j++;
}
printf("ciao %s\n",temp[0].nome);
}

oregon
28-06-2012, 14:53
A me funziona ... non ho i problemi che hai avuto tu ...

Prova ad eliminare il file dati e riprova.

SpecialOne1992
28-06-2012, 14:55
Originariamente inviato da oregon
A me funziona ... non ho i problemi che hai avuto tu ...

Prova ad eliminare il file dati e riprova.
ho già provato uffa

SpecialOne1992
28-06-2012, 14:58
ho fatto un'altra cosa.. copia incolla del codice in una altro file sorgente e funziona. mah io certe cose non le capisco proprio..
Quindi la lettura e scrittura binaria della struttura è fatta correttamente? se invece di voler dichiarare queste variabili globali li avessi dichiarati nel main li avrei dovuti passare come puntatori?

oregon
28-06-2012, 15:12
Sì ... più o meno ...

Se non sono globali li devi passare come puntatori alle funzioni.

SpecialOne1992
28-06-2012, 15:15
Originariamente inviato da oregon
Sì ... più o meno ...

Se non sono globali li devi passare come puntatori alle funzioni.
perdonami se sono scocciante.. più o meno vuol dire che non è corretta al 100% suppongo, come la posso migliorare?

Loading