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

标签 c file struct

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

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/

相关文章:

c - 在 C 中动态重新分配结构数组

c - 如何使用结构体接收用户输入以传递给另一个方法?

c - 我使用 restrict 限定符时出错

c++ - 当文件指针在别处声明时,fprintf 不打印到文件

c++ - 为非英语窗口用户获取应用程序数据文件夹路径的可靠方法

javascript - 如何(完全)复制文件但更改文件名?

c - linux/list.h 中 container_of 宏背后的基本原理

C 数组结构声明

c - 在 C 中实现构造函数的正确方法

c - UNIX TCP/IP :read: Transport endpoint is not connected read: Transport endpoint is not connected