我有这个文件,我尝试使用结构从中读取联系人以获得一个简单的通讯录。
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。
我有一些解决方案,但它们相当复杂,我想知道它们是否可以做得更好。
创建一个像真正的安装程序一样创建文件的安装程序,然后创建 200 个变量为空的未声明联系人。
检查程序是否是第一次运行,并仅在程序本身中执行与上述相同的操作。
如果找不到联系人 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/