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 に答える