2012-11-11 8 views
5

私が取っているクラスの割り当てをする必要があります。 Cの簡単な電話帳アプリです。プログラムに新しいものを使用する必要があるため、少し問題があります。期限はかなり厳しいです。mallocされたリンクリストをバイナリファイルから読み書きする

私は周りを見回して答えを見つけましたが、毎回新しいものが出ました。私は本質的でない部分を残し

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をどうやって使うべきなのか、本当に混乱しました。


ありがとうございました!私はその概念を理解し始めると思う。 新しいバイナリファイルを起動すると、プログラムは要求時にデータを正しく表示しますが、閉じると、プログラムはデータを保存します(少なくとも、私はそれがそうだと思います。同じファイルを再度開くと、連絡先を一覧表示しようとしても何も起こりません。

ここでオープン関数(再び簡略化され、私は実際の割り当てに1つのレコード内の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; 
} 

そしてメインで():

start=open(db, start); 

宣言部分:

record *start=NULL; 

誰かが返信する場合はもう一度おねがいします。

+0

何があなたを混乱させるのですか? – alk

+0

ようこそStackOverflowへ。あなたは 'fread'と' fwrite'を使わなければいけませんか?あなたは 'fscanf' /' fprintf'を使うことが許されていますか?またあなたの特定の質問を忘れて、現在あなたの投稿は問題の説明だけです。 – Zeta

+1

new_entry()の最後に 'return new;'を追加します。 – 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あなたはfopenwbモードで開くことができるファイルです。

+0

'struct'の場合はどうでしょうか? – newbie

1

この割り当てによって、手動でシリアライズ/デシリアライズを手動で行うことは恐ろしいアイディアです(この種の処理を行う実際の方法は、protocol buffersなどの自動コード生成によるものです)。この割り当てでは、リンクを書き込まずにリンクリストの内容を書き込む必要があります。逆シリアル化するときにリンクを再構築する必要があります。次のポインタのアドレスを単に書き込んだり読み込んだりするのは間違いですリスト内の

1

* nextポインタ以外のすべてをファイルに書き込み、順番に読み戻します。

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()で読み込み、次のポインタを更新することを忘れないでください。

関連する問題