gpt4 book ai didi

c - 在 C 中将某些变量保存到二进制文件时出错

转载 作者:行者123 更新时间:2023-11-30 20:22:36 26 4
gpt4 key购买 nike

我正在尝试将这个医院管理程序应用于学校作业,但我遇到了这个错误,并且真的不知道如何解决它。我很感激有人指导我。预先感谢。

我有这个链接列表:

struct marcacao
{
char nome[50];
int idade;
struct marcacao *next;
};

这是使用此函数创建的

void make_apt(struct marcacao **head_apt)

struct marcacao tmp;
...
while( *head_apt )
head_apt = &(*head_apt)->next;
...
printf("Nome do Paciente > ");
scanf(" %[^\n]", tmp.nome);
printf("Idade do Paciente > ");
scanf("%d", &tmp.idade);

tmp.next = NULL;

if ( !(*head_apt = malloc( sizeof (**head_apt) ) ) )
{
printf("Erro a alocar novo no ");
return;
}
**head_apt = tmp;
...

我必须将信息保存在二进制文件中,以便可以在下次执行时恢复。

void sv_apt(struct marcacao *head_apt)

FILE *f = fopen(APT_FILE, "wb");
...

while(head_apt)
{
fwrite(head_apt->nome, sizeof(head_apt->nome), 1, f);
fwrite(&head_apt->idade, sizeof(head_apt->idade), 1, f);
head_apt = head_apt->next;
}

但是 valgrind 正在展示这个:

==18255== Syscall param write(buf) points to uninitialised byte(s)
==18255== at 0x4F22710: __write_nocancel (syscall-template.S:81)
==18255== by 0x4EAFF02: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1261)
==18255== by 0x4EB13DB: new_do_write (fileops.c:538)
==18255== by 0x4EB13DB: _IO_do_write@@GLIBC_2.2.5 (fileops.c:511)
==18255== by 0x4EB0C5F: _IO_file_close_it@@GLIBC_2.2.5 (fileops.c:165)
==18255== by 0x4EA4A4F: fclose@@GLIBC_2.2.5 (iofclose.c:59)
==18255== by 0x401CD3: sv_apt (apt.c:125)
==18255== by 0x401A11: make_appointment (apt.c:43)
==18255== by 0x400B20: main (main.c:31)
==18255== Address 0x402700c is not stack'd, malloc'd or (recently) free'd
==18255==

使用十六进制编辑器,我可以看到信息保存得不好。

最佳答案

您需要了解“序列化”的概念。这就是将数据存储在文件中(或在线路上)并将其读回。您不能只是将内容转储到文件中(除了极少数简单的情况)。

您需要选择序列化格式。我会推荐基于 ASCII 的东西,因为它易于编辑和调试。使用 json、xml 或 yaml。

关于c - 在 C 中将某些变量保存到二进制文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39213061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com