와 C

2011-08-05 5 views
2
에있는 파일에서 구조를 읽고 쓰기 FREAD /에 fwrite를 사용

나는 다음과 같은 구조체가 :와 C

int file_read(record_list *list, record* rec) 
{ 
    /* irrelevant code eliminated */ 

    while(fread(&records, sizeof(record), 1, fp)) 
    { 
    *rec = records; 
    valid_list_insert = list_insert(list, rec); 
    if(!valid_list_insert) 
    { 
     return 0; 
    } 
    } 
} 
:

typedef struct { 
    char last[NAMESIZE]; 
    char first[NAMESIZE]; 
} name; 

typedef struct { 
    int id; 
    name name; 
    float score; 
} record; 

typedef struct { 
    record *data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 

나는이 기능을 사용하여 파일에서 레코드를 읽으려고하고있다

과 내가이 기능을 사용하여 파일에 record_list을 쓰기 위해 노력하고 있어요 그러나

int file_write(record_list* list) 
{ 
    /* irrelevant code eliminated */ 

    if(fwrite(&list, sizeof(record_list), 1, fp) == 0) 
    { 
    return 0; 
    } 
} 

을, 그들 중 어느 쪽 correctl 작업 와이. fread는 내 프로그램에 record_list를 표시하려고 할 때 무작위로 데이터를 읽습니다. 그리고 fwrite는 임의의 문자를 파일에 씁니다. 왜 이것이 작동하지 않는지에 대한 도움은 크게 감사 할 것입니다. (1)이 (일부 지점의 즉, 숫자 값을 포인터의 값을 쓰기 때문에 : 하지 작업합니다 (record_listdata 멤버로) 포인터를 쓰는 것

+2

'fread' /'fwrite'와 관련하여 문제가 있다고 생각되는 경우 가장 먼저 할 일은 관련성이없는 모든 코드를 제거하고 삶을 편하게하고 다른 사람이 쉽게 대답하도록하는 것입니다. 따라서 사용자 입력을 구문 분석하는 모든 작업을 제거하십시오! –

+3

'gdb'를 친구로 만듭니다. 일생 동안 계속해서 얻을 수있는 일회성 투자 (학습 곡선)! – hari

답변

6

음, 한 가지 (b) 다시 읽었을 때 같은 장소에 물건을 할당하지 않을 것입니다. 대신 구조를 신중하게 파싱하고 다시 가져올 수있는 방식으로 데이터를 기록해야합니다.

이 프로세스를 "직렬화"라고하며 역순으로 "직렬화 해제"라고합니다. Serialize Data Structures in C을 참조하십시오.

+0

저는 fread와 fwrite의 예를 살펴 보았습니다. 그리고 그들은 모두 같은 방식으로 함수를 사용하고있는 것처럼 보입니다. 나는 여전히 C에서 매우 익숙하다. 내가하고 싶은 일의 맥락에서 직렬화를 사용하는 예를 나에게 줄 수 있다고 생각하니? – LoveThatPink

+1

'fread' /'fwrite' 같은 것을'typedef struct {int i; char s [8]} dumbstruct;'. 그게 어떻게 작동하는지 생각해 보면'dumbstruct'의 연결리스트를 어떻게 직렬화 할 수 있을지 생각해 보겠습니다 : typedef struct node_t {node_t * next; dumbstruct 페이로드; } 노드;'. 여기서 중요한 질문은 "** 구조 ** (포인터로 인코딩 된 목록)와 ** 데이터 **를 어떻게 표현합니까?"입니다. "* – dmckee

관련 문제