2012-11-11 13 views
5

Ho bisogno di fare un incarico per una classe che sto prendendo. Si tratta di una semplice app di rubrica in C, e ho qualche problema con esso dal momento che ho bisogno di usare alcune cose nuove nel programma e la scadenza è piuttosto stretta.Lettura e scrittura di una lista collegata malloc'd da/a un file binario

Mi sono guardato intorno e ho trovato delle risposte, ma una nuova si è presentata ogni volta. :)

Questo è il mio (semplificato) Programma:

typedef struct record 
{ 
    char fname[31]; 
    char lname[31]; 
    char tel[21]; 
    struct record *next; 
} record; 


record *new_entry(record *first, char *fname, char *lname, char *tel) 
{ 
    record *new; 
    new=(record*) malloc(sizeof(record)); 
    strcpy(new->fname, fname); 
    strcpy(new->lname, lname); 
    strcpy(new->tel, tel); 
    new->next=first; 
} 


void fileopen (char *db_file) 
{ 
    FILE *fp; 

    fp=fopen(db_file, "rb"); 
    if (fp==NULL) 
    { 
     fp=fopen(db_file, "wb"); 
     fclose(fp); 
     fp=fopen(db_file, "r+b"); 
    } 
} 



int main 
{ 
char db[51]; 
record *next = NULL; 

printf("File:   "); scanf("%s, db); 
fileopen(db); 
printf("First name:  "); scanf("%s", fname); 
printf("Last name:  "); scanf("%s", lname); 
printf("Phone number: "); scanf("%s", tel); 
first=new_entry(*first, fname, lname, tel); 
} 

ho lasciato fuori le parti non essenziali. Ora so che non è molto, ma il mio leader di classe ha detto che dovrei usare file binari per archiviare e ripristinare i dati. Ma mi sono davvero confuso se come dovrei usare fread e fwrite.


Grazie mille per la soluzione! Penso di iniziare a capire il concetto. Il programma ora memorizza i dati (Almeno penso che lo faccia, perché il file continua a crescere mentre aggiungo altri dati.) Quando si avvia un nuovo file binario, il programma visualizza correttamente i dati quando richiesto, ma se lo chiudo, e riaprire lo stesso file, non accade nulla quando tenta di elencare i contatti.

Ecco il (semplificato ancora una volta, ho 10 dettagli in un record nella assegnazione effettiva) di funzione aperta:

record *open (char *db_file, record start) 
{ 
    FILE *fp 
    record *temp = start; 
    fp=fopen(db_file, "rb"); 
    while (fread(temp, sizeof(rekord), 1, fp)>0) 
    { 
     fread(temp->fname, sizeof temp->fname, 1, fp); 
     fread(temp->lname, sizeof temp->lname, 1, fp); 
     fread(temp->tel, sizeof temp->tel, 1, fp); 
    temp=temp->next; 
    } 
    fclose(fp); 
    return temp; 
} 

E nel main(), io uso:

start=open(db, start); 

La dichiarazione parte:

record *start=NULL; 

Grazie ancora se qualcuno risponde.

+0

Cosa ti confonde? – alk

+0

Benvenuti in StackOverflow. Devi usare 'fread' e' fwrite'? Ti è permesso usare 'fscanf' /' fprintf'? Inoltre hai dimenticato la tua domanda specifica, attualmente il tuo post è solo una descrizione del problema. – Zeta

+1

aggiungi 'return new;' alla fine di new_entry(). – wildplasser

risposta

4

Per scrivere l'elenco collegato in un file, è possibile scorrere l'elenco e scrivere la struttura.

#include <stdio.h> 

record *it = first; 

while (it != NULL) { 
    fwrite (it->fname, sizeof it->name, 1, stream); 
    fwrite (it->lname, sizeof it->lname, 1, stream); 
    fwrite (it->tel, sizeof it->tel, 1, stream); 
    it = it->next; 
} 

stream è un file che si può aprire con la modalità wb in fopen.

+0

E se fosse una 'struct'? – newbie

1

Quindi, speriamo che questo incarico guiderà a casa perché la serializzazione manualmente/deserializzazione è una pessima idea (nel settore, il vero modo per fare questo genere di cose è di generazione automatica del codice, come protocol buffers), ma ai fini della questo incarico, dovrai scrivere i contenuti dell'elenco collegato senza scrivere i collegamenti, e quindi dovrai ricostruire i link quando deserializzi, poiché sarebbe scorretto scrivere e leggere semplicemente gli indirizzi dei successivi puntatori che erano nella lista.

1

Scrivere tutto tranne il * puntatore successivo nel file e leggerli di nuovo in sequenza.

void write_book(const record *start) { 
    FILE *f; 
    record end; 
    memset(end,0,sizeof(struct record)); 
    f = fopen("foo","wb"); 
    for(;start != NULL; start = start->next) { 
    fwrite(start->fname, 31, 1, F); 
    fwrite(start->lname, 31, 1, F); 
    fwrite(start->tel, 21, 1, F); 
    fwrite(end->next, sizeof(void*), 1, F); 
    } 
    memset(end,0,sizeof(struct record)); 
    fwrite(end, sizeof(struct record),1,F); 
    fclose(f); 
} 

Durante la lettura, leggere i dati fino a quando non si preme il record vuoto. puoi fread() per questo. ricorda di allocare un nuovo record, leggerlo con fread() e aggiornare il prossimo puntatore.

Problemi correlati