2

次のような構造体をファイルに書き込むコードがあります。

void write_assignments_to_file(list* assignments, FILE* file)
{
    while (assignments != NULL) {
       fwrite(assignments->a, sizeof(assignments->a), 1, file);
       assignments = assignments->next;
    }
    fclose(file);
}

これはファイルへの書き込みですが、ファイルを再度読み取ろうとすると、読み取り用のコードが次のようにハングします。

list* read_assignments_from_file(FILE* file)
{
    Assignment* assignment;

    list* item; 
    item = NULL;

    while ( fread(assignment, sizeof(assignment), 1, file) ) {
        printf("Reading an assignment in");
        insert(item, assignment);
    }

    fclose(file);

    return item;
}

私の挿入方法は次のようになります。

list* insert(list* assignment_pointer, Assignment* new_assignment)
{
    list* ap = assignment_pointer;
    if(assignment_pointer != NULL){
        while (assignment_pointer->next != NULL) {
           assignment_pointer = assignment_pointer -> next;
        }
        assignment_pointer -> next = (struct list*)malloc(sizeof(list));
        assignment_pointer = assignment_pointer -> next;
        assignment_pointer -> next = NULL;
        assignment_pointer -> a = new_assignment;
        return ap;
    } else {
        assignment_pointer = (list*) malloc (sizeof(list));
        assignment_pointer -> next = NULL;
        assignment_pointer -> a = new_assignment;
        return assignment_pointer;
    }
}

Assignment の構造体定義は次のようになります。

typedef struct Assignment {
    char* moduleTitle;
    char* moduleId;
    char* title;
    char* author;
    time_t date_set;
    time_t date_due;
    int weighting;
} Assignment;

では、私のプログラムがハングする原因は何ですか?

4

2 に答える 2

3

構造体とポインターの復習が必要です。

Assignment *assignment;
fread(assignment /*which is not set*/, sizeof(assignment) /*probably 4*/, 1, file);

/* Should look more like */
Assignment ass;
fread(&ass, sizeof(ass), 1, file);

他の問題があるかもしれませんが、これで始められるはずです。

おそらく割り当てのためにstuct定義を含める必要がありますが、write()にも同じ問題があると思います。

sizeof(assignments->a); /*size of a pointer not an object*/
于 2012-05-17T00:08:07.167 に答える
3

問題は、初期化されていないポインタへの読み込みにあると推測します。に割り当てられたメモリがありませんassignment。あなたはおそらくこのようなものが欲しいでしょう:

list* read_assignments_from_file(FILE* file)
{
    Assignment assignment;

    list* item; 
    item = NULL;

    while ( fread(&assignment, sizeof(assignment), 1, file) ) {
        printf("Reading an assignment in");
        insert(item, &assignment);
    }

また、元のコードはを取ります。sizeof(assignment)これは、として宣言されたときに期待したことを実行しませんAssignment* assignment;。のサイズが表示されますAssignment*。これは、他のポインタのサイズです。32ビットシステムでは4バイト、64ビットシステムでは8バイトです。

于 2012-05-17T00:09:24.753 に答える