gpt4 book ai didi

c - 如何在 C 中从二进制文件(使用 ab+)读取后打印结构成员

转载 作者:行者123 更新时间:2023-11-30 19:39:58 25 4
gpt4 key购买 nike

您好,我正在尝试编写代码将 struct 保存到二进制文件,然后在从文件读取后打印它。当我运行代码时,出现段错误 (11)。这是我的代码(对所有 printf 感到抱歉,我试图找到代码出错的地方)

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

int main() {
struct contact {
int unqID;
char *name;
char *relationship;
char *phone_number;
char *email;
};

FILE *file;

file = fopen("test.bin", "ab+");

struct contact conwrite;
conwrite.unqID = 0;
conwrite.name = "president";
conwrite.relationship = "";
conwrite.phone_number = "";
conwrite.email = "";

struct contact conwrite2;
conwrite2.unqID = 1;
conwrite2.name = "vice president";
conwrite2.relationship = "";
conwrite2.phone_number = "";
conwrite2.email = "";

printf("%s\n", conwrite.name);
printf("%s\n", conwrite2.name);

fwrite(&conwrite, sizeof(conwrite), 1, file);
fwrite(&conwrite2, sizeof(conwrite2), 1, file);
fclose(file);

struct contact phonebook[100];

file = fopen("test.bin", "rb");

printf("size of file: %lu\n", sizeof(file));
printf("size of contact: %lu\n", sizeof(struct contact));
int size = (sizeof(file)) / (sizeof(struct contact));
printf("size of file: %d\n", size);

int read = fread(phonebook, sizeof(conwrite), 2, file);
printf("read: %d\n", read);

if (phonebook[0].name == NULL)
printf("phonebook is empty\n");
else
printf("phonebook is filled\n");

printf("%s\n", phonebook[0].name);

fclose(file);
return 0;
}

最佳答案

您无法使用 sizeof 运算符计算文件的长度:

printf("size of file: %lu\n", sizeof(file));

将打印FILE *的大小,即指针本身的字节数。请注意,sizeof 的计算结果为 size_t 类型的值,其正确的 printf 格式为 %zu。如果由于某种原因您无法使用 z 选项,请将 sizeof 转换为 (unsigned long) 以使用 %lu 但请注意,在某些平台(例如 Windows 64 位)上,size_t 实际上大于 unsigned long

要计算磁盘上文件的长度,您可以在查找流的末尾后使用系统调用,例如 stat 或可能的 ftell() fseek(文件, 0L, SEEK_END);.请注意,此方法仅适用于以二进制模式打开的图 block 。在您的程序中,您确实以二进制模式打开它,但也在更新(+)中打开它,这似乎没有必要。

最后,您无法用您的方法存储这些结构体指向的信息:struct成员指向的字符串位于内存中,您只是写入指针的值,这将当由不同的程序甚至同一程序的不同实例读回时没有意义。您需要将这些字符串设为 char 数组,例如:

struct contact {
int unqID;
char name[64];
char relationship[32];
char phone_number[16];
char email[64];
};

您将需要更新代码以考虑类型的差异。请注意,此方法引入了对所有文本成员的大小的限制。通常不会以这种方式将信息存储在磁盘文件中。要么使用实现数据库的专用库,要么使用交换格式,例如 csvjsonxml...,通过增加复杂性和顺序多功能性,或基于自定义文本的格式。

关于c - 如何在 C 中从二进制文件(使用 ab+)读取后打印结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957662/

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