无法指向从C中的文件读取结构

时间:2019-08-01 13:47:23

标签: c

我正在尝试加载一些保存到member二进制文件中的Memberships.txt结构。我可以毫无问题地将内容读入tmp中,因为印刷品会为我提供正确的信息。问题似乎出在tail.next = &tmp;行上。

这个想法是保留head作为指针,以便我可以将其传递给以后将要使用的其他函数。 tail应该以{{1​​}} member指向的位置进行初始化,并且将仅用于修改其上的head字段,因此我将被读取的成员添加到列表。

有人可以帮助我吗?

.next

输出:

FILE* f = fopen("Memberships.txt", "rb");
member* head = malloc(sizeof(member));
member tail = *head;
member tmp;
while(fread(&tmp, sizeof(struct member), 1, f) == 1){
  printf("Read member %d from file.\n", tmp.number);
  printf("Name: %s\n", tmp.first_name);
  printf("Surname: %s\n", tmp.second_name);
  tail.next = &tmp;
  tail = tmp;
}
tail.next = NULL;
printf("Loaded %d members into list!\n\n",tail.number);
if(head->next == NULL){
  printf("%d",666);
}

我已经实现了@anonmess建议的更改:

Read member 1 from file.
Name: Lucas
Surname: Azeve
Read member 2 from file.
Name: Mark
Surname: Lala
Loaded 2 members into list!

666

获得相同的结果,问题出在最后两行。 member* head = malloc(sizeof(member)); member tail = *head; member tmp; while(fread(&tmp, sizeof(struct member), 1, f) == 1){ member* read = malloc(sizeof(member)); strcpy(read->first_name,tmp.first_name); strcpy(read->second_name,tmp.second_name); strcpy(read->address,tmp.address); strcpy(read->email,tmp.email); read->number = tmp.number; read->annual_fee = tmp.annual_fee; read->status = tmp.status; read->handicap = tmp.handicap; read->bracket = tmp.bracket; read->freq = tmp.freq; read->rest = tmp.rest; read->rate = tmp.rate; printf("Read member %s from file.\n", read->first_name); printf("Name: %s\n", read->first_name); printf("Surname: %s\n", read->second_name); tail.next = read; tail = *read; } 仍然为NULL。

1 个答案:

答案 0 :(得分:1)

这是一个独立的示例,您可以修改以解决您的问题:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define NAME_LENGTH 20

typedef struct _member {
    struct _member *next;
    int number;
    char first_name[NAME_LENGTH];
    char second_name[NAME_LENGTH];
} member;

member member_list[] = {
        { NULL, 1, "Lucas", "Azeve" },
        { NULL, 2, "Mark",  "Lala"  }
};

void create_file(void) {
    FILE *f = fopen("Memberships.txt", "wb");
    fwrite(member_list, sizeof(member_list), 1, f);
    fclose(f);
}

int main(void)
{
    create_file();
    FILE* f = fopen("Memberships.txt", "rb");
    if (f == NULL) {
        perror("Could not open file");
        exit(errno);
    }
    member *head = malloc(sizeof(member));
    member *tail = head;
    while (1) {
        int result;
        member *new = malloc(sizeof(member));
        result = fread(new, sizeof(*new), 1, f);
        if (1 != result) {
            if (feof(f)) {
                break;
            }
            errno = ferror(f);
            perror("Could not read from file");
            exit(errno);
        }
        printf("Read member %d from file.\n", new->number);
        printf("Name: %s\n", new->first_name);
        printf("Surname: %s\n", new->second_name);
        tail->next = new;
        tail = new;
    }
    fclose(f);
    tail->next = NULL;
    printf("Loaded %d members into list!\n\n", tail->number);
    if (head->next == NULL) {
        printf("%d",666);
    }
    return 0;
}

输出

Read member 1 from file.
Name: Lucas
Surname: Azeve
Read member 2 from file.
Name: Mark
Surname: Lala
Loaded 2 members into list!

希望这将为您展示一种为每个成员分配内存并从文件中读取数据而无需执行任何不必要复制的方法。您可以放心地忽略我用于创建文件的代码。我需要一些数据,而且我总是尝试让计算机尽可能多地工作。