Salve, mi sono appena inscritto e volevo chiedervi come posso scrivere e recupare struct su file in modo tale da poter effetuare modifiche e cancellazioni??
vi ringrazio in anticipo per la risposta
Salve, mi sono appena inscritto e volevo chiedervi come posso scrivere e recupare struct su file in modo tale da poter effetuare modifiche e cancellazioni??
vi ringrazio in anticipo per la risposta
Una struct può contenere dati di tipo eterogeneo, int, double, char, array, puntatori, ecc....Originariamente inviato da Mercurial
Salve, mi sono appena inscritto e volevo chiedervi come posso scrivere e recupare struct su file in modo tale da poter effetuare modifiche e cancellazioni??
In genere la soluzione più semplice è scrivere/leggere il contenuto della struct in modo "binario". Se però la struct contiene dei puntatori, c'è da prestare attenzione, perché non ha senso scrivere sul file un puntatore in quanto una volta riletto dal file non ha più significato.
Quindi innanzitutto bisogna valutare come è fatta la struct. Posso fare un esempio in "C" per scrivere una struttura su file.
La lettura è simile, si usa però "rb" per aprire il file e fread per leggere.codice:#include <stdio.h> typedef struct { char nome[30]; char cognome[30]; short anno_nascita; } PERSONA; int main (void) { PERSONA p = { "Mario", "Rossi", 1964 }; FILE *f; size_t len; if ((f = fopen ("persone.dat", "wb")) != NULL) { len = fwrite (&p, 1, sizeof (PERSONA), f); if (len == sizeof (PERSONA)) printf ("Scrittura OK\n"); fclose (f); } return 0; }
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Si può ottenere lo stesso effetto senza utilizzare un file binario o bisogna necessariamente utilizzare il tipo binario per il file??
Ho un'altra domanda: la fread e fwrite dopo la loro esecuzione si predispongono sul dato successivo o bisogna utilizzare qualke istruzione???
Vi ringrazio in anticipo per la risposta
Beh, sì ma dipende da come vuoi strutturare i dati. Ci sono una marea di modi....Originariamente inviato da Mercurial
Si può ottenere lo stesso effetto senza utilizzare un file binario o bisogna necessariamente utilizzare il tipo binario per il file??
Potresti fare un file di testo dove ogni riga rappresenta un record e i campi sono divisi da un separatore, es.:
Mario;Rossi;1964
Potresti salvare i dati in un qualunque altro formato, es. XML, oppure su un database.
Non so se mi sono spiegato .... è solo questione di studiare il formato più adatto per quello che vuoi fare. Nulla poi ti vieta di creare delle tue funzioni che si occupano di trasformare la struct in un certo formato e viceversa.
Certo, spostano in avanti il puntamento sul file.Originariamente inviato da Mercurial
la fread e fwrite dopo la loro esecuzione si predispongono sul dato successivo o bisogna utilizzare qualke istruzione???
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ho seguito le tue istruzioni e ho scritto questo codice:
# include <stdio.h>
struct record{
char nome[20];
char cognome[30];
};
int main(){
struct record p={"mario","rossi"};
FILE * f;
f=fopen("cr7.dat","wb");
fwrite(&p,sizeof(struct record),1,f);
f=fopen("cr7.dat","rb");
struct record d;
fread(&d ,sizeof(struct record),1,f);
printf(d.nome);
p rintf("\n",d.cognome);
fclose(f);
}
l'output aspettato dovrebbe essere:
mario
rossi
ma io in output ho soltato due righe vuote,xchè???
Codice PHP:
# include <stdio.h>
struct record{
char nome[20];
char cognome[30];
};
int main(){
struct record p={"mario","rossi"};
FILE * f;
f=fopen("cr7.dat","wb");
fwrite(&p,sizeof(struct record),1,f);
fclose(f) // chiudo il file
f=fopen("cr7.dat","rb");
struct record d;
fread(&d ,sizeof(struct record),1,f);
printf("%s\n",d.nome);
printf("%s\n",d.cognome);
fclose(f);
}
prova ora
![]()
adesso funziona dovevo chiudere il file prima di riaprilrlo in lettura,volevo chiedervi altre cose:
per utilizzare delle stringhe come campo di una struct devo dichiararle come array di caratteri però poi quando acquisisco devo acquisirle lettera x lettera????
qual'è l'istruzione in c che permette di muoversi all'interno del file ( tipo la seek del pascal ) ???
No, viene letto tutto in un colpo solo.Originariamente inviato da Mercurial
adesso funziona dovevo chiudere il file prima di riaprilrlo in lettura,volevo chiedervi altre cose:
per utilizzare delle stringhe come campo di una struct devo dichiararle come array di caratteri però poi quando acquisisco devo acquisirle lettera x lettera????
Strano ma vero, fseekqual'è l'istruzione in c che permette di muoversi all'interno del file ( tipo la seek del pascal ) ???
ho modificato il codice in modo che i campi della struct vengano inseriti da tastiera:
# include <stdio.h>
struct record{
char nome[10];
char cognome[20];
};
int main(){
struct record p;
printf(" INSERISCI IL NOME : ");
scanf("%s /n",p.nome);
printf(" INSERISCI IL COGNOME : ");
scanf("%s /n",p.cognome);
FILE * f;
f=fopen("cr7.dat","wb");
fwrite(&p,sizeof(struct record),1,f);
fclose(f); // chiudo il file
f=fopen("cr7.dat","rb");
struct record d;
fread(&d ,sizeof(struct record),1,f);
printf("%s\n",d.nome);
printf("%s\n",d.cognome);
fclose(f);
}
però si verifica un problema xchè quando viene dato in output la stringa "INSERISCI IL NOME :"
inserendo una stringa e premendo invio invece di dare in output la stringa " INSERISCI IL COGNOME : " va a capo e da in output la seconda stringa solo se almeno viene inserito un altro carattere e viene premuto invio, qualkuno può spiegarmi xchè avviene questo??