繁体   English   中英

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

[英]Can't point to struct being read from file in C

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

这个想法是让head作为指针,这样我就可以将其传递给以后将要使用的其他函数。 tail应该使用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);
}

输出:

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

666

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

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

获得相同的结果,问题出在最后两行。 head->next仍然为NULL。

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

#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!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM