C - Как читать в связанном списке из двоичного файла? - PullRequest
0 голосов
/ 08 мая 2018

Мне нужна помощь с моим кодом. Я создал функцию для записи связанного списка в двоичный файл. Теперь я пытаюсь прочитать связанный список из двоичного файла, который вывела моя функция записи. Моя попытка чтения в двоичном файле и создание ссылки на ошибки. Это моя попытка ниже.

Что я делаю не так?

void readlist(struct link **headptr) {                                                                                                                      
    FILE *text = fopen("numbers.bin", "rb");                                                                                                                 
    struct link *head = *rootptr;                                                                                                                                                                                                                                                           


   while (head->next != NULL) {                                                                                                                             
       struct link *newlink = (struct link*) malloc(sizeof(struct link));                                                                                    
       fread(&newlink->val, sizeof(int), 1, text);                                                                                                       
       head->next = newlink;                                                                                                                                 
       head = newlink;                                                                                                                                       
    }                                                                                                                                                        
       fclose(text);   
}                                                                                                                                                                                                                                                                              

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Вы не можете сохранить общий связанный список в файл. Чтобы это работало, вам нужно было полностью контролировать распределение памяти, включая адреса, которые вы получаете. Как правило, вы не будете.

Если вы накладываете связанный список на один буфер, то вы можете сохранить его, переведя указатели на индексы и обратно (или просто используя индексы вместо указателей), но, как правило, вы не можете сохранить связанный список на диск, бесплатно памяти (в том числе путем выхода), перезагрузите, а затем ожидайте, что сохраненные указатели будут работать.

0 голосов
/ 08 мая 2018

Надеюсь, этот код будет вам полезен. если вы используете глобальную переменную headptr, это будет проще.

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <fcntl.h>

#define LISTSAVE "numbers.bin"

struct link {
    int val ;
    struct link *next ;
} ;

void print_list(struct link *headptr) {
    struct link *tmp = headptr->next ;
    int cnt=0 ;
    printf("---list start----\n") ;
    while(tmp) {
        printf("%d ", tmp->val) ;
        cnt++ ;
        tmp=tmp->next ;
    }
    printf("\n%d items\n", cnt) ;
    printf("---list end----\n") ;
}


void add_first(struct link *headptr, int val) {
    struct link *tmp = malloc(sizeof(struct link)) ;
    tmp->val = val ;
    tmp->next = headptr->next ;
    headptr->next = tmp ;
}

void add_tail(struct link *headptr, int val) {
    struct link *tmp = headptr;
    struct link *tmp2 = malloc(sizeof(struct link)) ;
    tmp2->val = val ;
    tmp2->next=NULL ;

    while(tmp->next) {
        tmp=tmp->next ;
    }
    tmp->next=tmp2 ;
}

void del_list(struct link *headptr) {
    struct link *tmp = headptr->next ;
    struct link *tmp2 = NULL ;
    while (tmp) {
        tmp2=tmp->next ;
        free(tmp);
        tmp=tmp2 ;
    }
    headptr->next=NULL ;
}

void save_list(struct link *headptr) {
    FILE *text = fopen(LISTSAVE, "wb+") ;
    struct link *tmp=headptr->next ;
    int cnt=0 ;

    if ( text==NULL || headptr==NULL ) {
        printf("filed to save.\n") ;
        return ;
    }
    while (tmp!=NULL ) {
        cnt++ ;
        fwrite(&tmp->val, sizeof(int), 1, text) ;
        tmp = tmp->next ;
    }
    fclose(text) ;
    printf("write %d items ok\n", cnt) ;
}

void read_list(struct link *headptr) {
    FILE *text = fopen(LISTSAVE, "rb") ;
    int val ;
    int cnt=0 ;
    while( fread(&val, sizeof(int), 1, text) > 0 ) {
        add_tail(headptr, val) ;
        cnt++ ;
    }
    fclose(text);
    printf("read %d items ok\n", cnt) ;
}


int main() {
    struct link head ;
    head.val=0 ;
    head.next=NULL ;

    add_first(&head, 40) ;
    add_first(&head, 30) ;
    add_first(&head, 20) ;
    add_first(&head, 10) ;
    add_tail(&head, 50) ;
    add_tail(&head, 60) ;

    print_list(&head) ;
    printf("--save list\n") ;
    save_list(&head) ;
    del_list(&head) ;

    printf("--read list\n") ;
    read_list(&head) ;
    print_list(&head) ;
    del_list(&head) ;

    return 0 ;
}

вывод это

---list start----
10 20 30 40 50 60 
6 items
---list end----
--save list
write 6 items ok
--read list
read 6 items ok
---list start----
10 20 30 40 50 60 
6 items
---list end----
...