1

これが私のコードです:

 #include <stdio.h>
    #include <stdlib.h>
    #define STR_LEN 255
    #define TRUE 1

    typedef struct
    {
        int id;
        char text[STR_LEN];
        char answer[4][STR_LEN];
        int correct_answer;
        char date[STR_LEN];
        char author[STR_LEN];
        int difficulty;
    } Question;

    typedef struct
    {
        Question* new_question;
        struct List* next;
    } List;

    List* listFromFile(List* root, FILE* file)
    {
        List* current_item;
        Question* q;
        root = (List* ) malloc(sizeof(List));
        q = (Question* ) malloc(sizeof(Question));
        if(!fread(q, sizeof(Question), 1, file))
        {
            printf("No data in the file");
            exit(1);
        }
        root->new_question = q;
        root->next = NULL;

        do
        {

            current_item = (List* ) malloc(sizeof(List));
            current_item->next = NULL;
            if (!fread(q, sizeof(Question), 1 , file))
            {
                free(current_item);
                break;
            }
            current_item->new_question = q;
            current_item->next = root;
            root = current_item;

        }
        while(TRUE);

        free(q);
        return root;
}
int main()
{
    List* root = NULL;
    List* item;
    int count_id = 1;
    int choice;
    system("CLS");
    FILE* file;
    if ((file = fopen ("questions.bin", "rb")) != NULL)
    {
        root = listFromFile(root, file);
        count_id = root->new_question->id;
        printf("Questions loaded!\n\n\n\n");
        if ((fclose(file)) != 0)
            printf("ERROR - cannot close file!\n");
    }
    else printf("No questions found! Please add questions.\n\n\n");

問題は、リストを印刷しようとすると、各リスト要素に同じ情報があり、その理由がわからないことです。幸いなことに、リスト要素はファイルと同じ数ですが、情報をそれらに入れる方法に問題があります。それがなぜなのか誰にも分かりますか?

4

2 に答える 2

1

ノードに質問を割り当てるために が指す同じ割り当て済みメモリ ブロックを使用してqいますが、新しい質問を読み取るたびにそれを上書きしています。malloc質問ごとに、一意のバッファーを割り当てる必要があります。

do {

   current_item = (List* ) malloc(sizeof(List));
   q = (Question* ) malloc(sizeof(Question));
   /* ... */
} while (1);
于 2013-05-23T23:53:23.597 に答える