2012-11-11 138 views
5

我需要爲正在學習的課程做一個任務。 這是一個簡單的電話簿應用程序在C中,我有一點麻煩,因爲我需要在程序中使用一些新的東西,並且截止日期非常緊。從二進制文件讀取和寫入malloc'd鏈接列表

我環顧四周,找到了一些答案,但每次都有新的答案出現。 :)

這是我(簡化)程序:

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); 
} 

我離開了不重要的部分。 現在我知道它不多,但是我的班長說我應該使用二進制文件來存儲和恢復數據。但是我真的很困惑,我該如何使用fread和fwrite。


非常感謝解決方案!我想我開始理解這個概念。 該程序現在存儲數據(至少我認爲它的確如此,因爲隨着我添加更多數據,文件不斷增長)。 啓動新的二進制文件時,程序在請求時正確顯示數據,但如果關閉它,並重新打開相同的文件,當它嘗試列出聯繫人時沒有任何反應。

這裏是(簡化再次,我有10個細節中的一個記錄在實際分配)開功能:

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; 
} 

而且在main(),我用:

start=open(db, start); 

聲明部分:

record *start=NULL; 

如果有人回覆,再次感謝。

+0

什麼讓你感到困惑? – alk

+0

歡迎來到StackOverflow。你必須使用'fread'和'fwrite'?你允許使用'fscanf' /'fprintf'嗎?你也忘了你的具體問題,目前你的文章只是一個問題描述。 – Zeta

+1

將'return new;'添加到new_entry()的末尾。 – wildplasser

回答

4

要將鏈接列表寫入文件,您可以遍歷列表並編寫結構。

#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是你可以用wb模式fopen打開一個文件。

+0

如果它是'struct'呢? – newbie

1

因此,希望這個任務能夠推動爲什麼手動序列化/反序列化是一個可怕的想法(在業界,做這類事情的真正方法是通過自動代碼生成,例如protocol buffers),但爲了這個任務,你需要在不寫鏈接的情況下編寫鏈表的內容,然後在反序列化時需要重建鏈接,因爲簡單地寫和讀下一個指針的地址是不正確的在列表中。

1

將除*下一個指針之外的所有內容寫入文件,然後依次讀出它們。

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); 
} 

閱讀時,讀出數據,直到您點擊空記錄。你可以fread()這個。只記得分配新記錄,用fread()讀取並更新下一個指針。

相關問題