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.
Cosa ti confonde? – alk
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
aggiungi 'return new;' alla fine di new_entry(). – wildplasser