簡體   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