1

我的目标是从“menu.bin”创建一个列表。这是函数:

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

出于某种原因,文件的结果不是应该的(它不读取文件海峡)。也许有人可以帮助我。

编辑:它确实运行了,并打印了“ole”行。问题是文件 .bin 已使用以下结构类型完成:

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

当我做 malloc 时,我将内存分配给以下结构类型:

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

1 回答 1

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

额外:清理循环:

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
}
于 2012-06-20T10:17:44.333 回答