Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    Scrivere e recuperare struct su file in C

    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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Scrivere e recuperare struct su file in C

    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??
    Una struct può contenere dati di tipo eterogeneo, int, double, char, array, puntatori, ecc....
    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.

    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;
    }
    La lettura è simile, si usa però "rb" per aprire il file e fread per leggere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    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

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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??
    Beh, sì ma dipende da come vuoi strutturare i dati. Ci sono una marea di modi....

    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.

    Originariamente inviato da Mercurial
    la fread e fwrite dopo la loro esecuzione si predispongono sul dato successivo o bisogna utilizzare qualke istruzione???
    Certo, spostano in avanti il puntamento sul file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    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è???

  6. #6
    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(&,sizeof(struct record),1,f);
    printf("%s\n",d.nome);
    printf("%s\n",d.cognome);
    fclose(f);
    }

    prova ora 

  7. #7
    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 ) ???

  8. #8
    qualkuno può rispondermi???

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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????
    No, viene letto tutto in un colpo solo.
    qual'è l'istruzione in c che permette di muoversi all'interno del file ( tipo la seek del pascal ) ???
    Strano ma vero, fseek

  10. #10
    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??

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 © 2025 vBulletin Solutions, Inc. All rights reserved.