2012-06-19 2 views
1

Моя цель - создать список из «menu.bin». Это FUNC:Создание списка из файла «.bin» в C

pitem recupera_menu(pitem p){ 

    pitem novo,aux; 

    FILE *f; 

         f=fopen("menu.bin","rb"); 
           if(f == NULL) 
            printf("Erro ao caregar o ficheiro 'menu.bin' \n"); 

           novo = (struct item*)malloc(sizeof(item)); 
            if(novo == NULL) 
             return p; 

            novo->prox=NULL; 


            while((fread(novo,sizeof(item),1,f))!=NULL){ 

             if(p==NULL){ 
              p=novo; 
              aux=p; 
             } 
             else{ 
              aux->prox=novo; 
              aux=aux->prox; 
             } 

             printf("%s\n OLE\n",aux->id); 

            } 

         fclose(f); 

         system("pause"); 
    return p; 
} 

это моя структура:

typedef struct item item, *pitem; 
struct item{ 
    char id[5]; 
    int ing[10]; 
    float qtd[10]; 
    pitem prox; 
}; 

По какой-то причине результата файла не тот, который должен быть (он не читает документ пролива) Может быть, кто-то может мне помочь.

EDIT: хорошо это работать, и печатает «оле» проблема line.The в том, что файл .bin был завершен со следующим типом структуры:

struct item{ 
    char id[5]; 
    int ing[10]; 
    float qtd[10];} 

и когда я делать таНос, я выделить память на следующие типа структуры:

struct item{ 
     char id[5]; 
     int ing[10]; 
     float qtd[10]; 
     pitem prox; 
    }; 
+0

Я думаю, что это может быть из-за pitem Prox; (указатель на следующий элемент списка) – DmitryK

+2

Вам известно о выравнивании структуры? Ваша структура, как определено, будет иметь неиспользуемые байты пэдов, чтобы каждый член был выровнен с естественными границами. Вам либо нужно сопоставить это в файле bin, либо вы хотите использовать что-то вроде #pragma pack (1) – TJD

+1

Если вызов этой функции выполняется с непустым p, он почти наверняка будет аварийно (aux будет доступен неинициализированный). Если p всегда является нулевым при первом вызове, я не уверен в его передаче. Но помимо этого ли линия печати «OLE» когда-либо печатается? Я пытаюсь понять, является ли это ошибкой чтения или неудачей в создании связанного списка. Кроме того, после выхода из цикла, aux-> prox должен быть установлен в NULL –

ответ

0
struct item{ 
     char id[5]; 
     int ing[10]; 
     float qtd[10]; 
    }; 
struct list{ 
     struct list *next; 
     struct item payload; 
    }; 

выделяют:

struct list *p; 
p = malloc (sizeof *p); 

чтение из файла:

ret = fread(&p->payload, sizeof p->payload, 1, fp); 

Extra: санировать цикл:

int recupera_menu(struct list **pp){ 

    int ret,cnt; 
    FILE *fp; 

    fp = fopen("menu.bin","rb"); 
    if (!fp) { 
     fprintf(stderr, "Erro ao caregar o ficheiro 'menu.bin' \n"); 
     return 0; 
     } 

    for (cnt=0; ;cnt++) { 
     *pp = malloc(sizeof **pp); 
     if(!*pp) break; 
     (*pp)->next = NULL; 

     ret = fread(&(*pp)->payload, sizeof &(*pp)->payload, 1, fp); 
     if (ret < 1) break; 
     pp = &(*pp)->next; 
    }        

    free (*pp); 
    *pp = NULL; 
    fclose(fp); 
    return cnt 
} 
+0

Спасибо большое! Теперь он работает :) – DmitryK

+0

Обратите внимание, что я изменил подпись функции. Ему нужен указатель на указатель на список struct в качестве аргумента и возвращает количество прочитанных записей. – wildplasser

Смежные вопросы