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

我的分配结构定义如下:

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

可能还有其他问题,但这应该可以帮助您入门。

您可能应该包括分配的结构定义,但我认为您在 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 回答