2012-11-11 4 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를 어떻게 사용해야하는지 정말 혼란 스럽습니다.


솔루션을 제공해 주셔서 감사합니다. 나는이 개념을 이해하기 시작했다고 생각합니다. 새로운 바이너리 파일을 시작할 때 프로그램은 요청시 데이터를 올바르게 표시하지만 프로그램을 닫으면 프로그램이 데이터를 저장합니다 (최소한 파일이 커지면서 계속 증가하기 때문에 데이터가 저장됩니다) 동일한 파일을 다시 열면 연락처를 나열하려고 할 때 아무 일도 일어나지 않습니다.

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

선언 여기

오픈 기능 (내가 실제 할당에서 하나 개의 레코드 10 개 세부 사항을 다시 단순화)에의 부분 :

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()로 읽고 다음 포인터를 업데이트하는 것을 기억하십시오.

관련 문제