gpt4 book ai didi

c - 当文件未按预期 100% 填充时,无法使用 C 从二进制文件读取结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:58 25 4
gpt4 key购买 nike

我有这个文件,我尝试使用结构从中读取联系人以获得一个简单的通讯录。

typedef struct contact{
char name[80];
char surname[80];
char cellnumber[20];
float length;
int contactid;
}contact;

我使用这个函数,我这样调用它,所以它读取了 200 次(const int MAXCONTACT = 200;)。

for(i2=0;i2<MAXCONTACT;i2++)
person[i2]=load(i2);

这个函数给定一个特定的 ID(变量 i),返回具有相同 I 的联系人:

contact load(int i){
struct contact person;
FILE *data;
data=fopen("data.bin","rb");
do{
fread(&person,sizeof(contact),1,data);
}while(person.contactid!=i);
fclose(data);
return person;
}

这种代码的唯一问题是,当没有 200 个联系人时,该函数将不会返回联系人,因为找不到联系人 ID。

我有一些解决方案,但它们相当复杂,我想知道它们是否可以做得更好。

  1. 创建一个像真正的安装程序一样创建文件的安装程序,然后创建 200 个变量为空的未声明联系人。

  2. 检查程序是否是第一次运行,并仅在程序本身中执行与上述相同的操作。

  3. 如果找不到联系人 ID,则同样退出搜索循环,并返回一个所有变量都设置为 null 的未清除联系人。

写到这里,想到三个问题:

其中哪一个是最好的或最容易使用的?

返回未声明的联系人是否安全? (我必须记住,我必须使用联系人:修改、打印、打印所有联系人)

我是否应该有一个结构和文件来记录一些未在联系人结构/文件中使用的变量统计信息?

最佳答案

尝试下面的方法,线性复杂度,如果一个contact不存在,则初始化为0。

/* initialize memory */
memset(person, 0, MAXCONTACT * sizeof(contact0);

/* open the file */
data=fopen("data.bin","rb");

/* get the file size */
fseek(data, 0L, SEEK_END);

/* don't read more than your allocated array can contain */
int size = max(ftell(data), MAXCONTACT * sizeof(contact));

/* seek to the beginning of the file */
fseek(fp, 0L, SEEK_SET);

/* populate the array */
fread(&person,size,1,data);

/* close the file */
fclose(data);

关于c - 当文件未按预期 100% 填充时,无法使用 C 从二进制文件读取结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29546794/

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