Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fread&x27;ing和fwrite';正在初始化包含指针的结构_C_Fwrite_Fread - Fatal编程技术网

C fread&x27;ing和fwrite';正在初始化包含指针的结构

C fread&x27;ing和fwrite';正在初始化包含指针的结构,c,fwrite,fread,C,Fwrite,Fread,你好, 我有下面的结构,我正试图写和写 但是,因为我的设备和资源是指针。fwrite将读取指针值,而不是数据。我无法将阵列用于设备或资源。只需动态分配指针 我在写之前为结构元素分配所有内存。这里没有显示,因为我想保持代码段的简短。自由也不是 在我的fread函数中,我为设备和资源分配内存,以便fread能够读入这些内存位置。然而,这是行不通的 最好的方法是什么 非常感谢你的建议 gcc (GCC) 4.7.0 c89 struct数据{ int-id; 整数集; 字符*设备; 字符*资源; }

你好,

我有下面的结构,我正试图写和写

但是,因为我的设备和资源是指针。fwrite将读取指针值,而不是数据。我无法将阵列用于设备或资源。只需动态分配指针

我在写之前为结构元素分配所有内存。这里没有显示,因为我想保持代码段的简短。自由也不是

在我的fread函数中,我为设备和资源分配内存,以便fread能够读入这些内存位置。然而,这是行不通的

最好的方法是什么

非常感谢你的建议

gcc (GCC) 4.7.0
c89
struct数据{
int-id;
整数集;
字符*设备;
字符*资源;
};
结构数据库{
结构数据**db_数据;
数据库行的大小;
大小\u t数据库\u数据\u大小;
};
int database_write(文件*fp,常量结构数据库*db)
{
倒带(fp);
if(fwrite(*db->db_data,sizeof(struct data),1,fp)=-1){
返回数据库错误;
}
返回0;
}
结构数据库*数据库读取(文件*fp,大小数据库行,大小数据库数据大小)
{
结构数据库*db=NULL;
尺寸i=0;
db=malloc(sizeof(struct-database));
db->database\u rows=db\u rows;
db->database\u data\u size=db\u data\u size;
db->db_data=malloc(sizeof(struct data)*db_行);
对于(i=0;idb_data[i]=malloc(sizeof(struct data));
db->db\u data[i]->device=malloc(db\u data\u大小);
db->db\u data[i]->resource=malloc(db\u data\u大小);
}
倒带(fp);
if(fread(*db->db_data,sizeof(struct data),1,fp)=-1){
返回NULL;
}
返回分贝;
}

您似乎已经回答了自己的问题,fread和fwrite只需查看内存中的内容并将其放入文件中即可。如果您正在编写没有指针的东西(例如,大的数字数组),这将非常有用。它不是用来写带指针的结构的


如果此文件具有格式,则需要按照格式所述执行操作。如果您正在编写一种格式,那么您应该将每个成员逐个写入该文件。您将需要某种类型的缓冲区来读取(如果没有最大长度规范,则可能需要调整其大小)。此外,您的数据库写入功能也需要做一些更改。

您似乎已经回答了自己的问题,fread和fwrite只需查看内存中的内容并将其放入文件中即可。如果您正在编写没有指针的东西(例如,大的数字数组),这将非常有用。它不是用来写带指针的结构的


如果此文件具有格式,则需要按照格式所述执行操作。如果您正在编写一种格式,那么您应该将每个成员逐个写入该文件。您将需要某种类型的缓冲区来读取(如果没有最大长度规范,则可能需要调整其大小)。此外,您的数据库写入功能也需要进行大量更改。

如果
设备
资源
可以具有可变长度,则您应该记录
设备
的大小,然后记录数据。对
资源执行相同的操作。

当您读回它们时,您可以读取大小,然后分配内存,最后读取值。

如果
设备
资源
可以具有可变长度,您应该写下
设备
的大小,然后写下数据。对
资源执行相同的操作。

当你读回它们时,你可以读取大小,然后分配内存,最后读取值。

你已经描述了你的问题。fwrite将写入地址而不是值

可能您可以在结构“struct data”中使用一个字段作为设备和资源的长度。 为读取/写入此长度的fread()和fwrite()创建包装器。 在这个包装器中,您可以将设备、资源存储在临时缓冲区中,并在其上使用fwrite()

这是一个简单且非常基本的解决方案

在网络中发送数据包时,您通常会看到一个包含字符指针的结构。前4/8字节存储数据长度,其余字节包含实际数据。 用户读取数据包时,首先读取开始的4/8字节。根据这一点,将发出read()调用来读取剩余的数据

你可以参考

您自己已经描述了您的问题。fwrite将写入地址而不是值

可能您可以在结构“struct data”中使用一个字段作为设备和资源的长度。 为读取/写入此长度的fread()和fwrite()创建包装器。 在这个包装器中,您可以将设备、资源存储在临时缓冲区中,并在其上使用fwrite()

这是一个简单且非常基本的解决方案

在网络中发送数据包时,您通常会看到一个包含字符指针的结构。前4/8字节存储数据长度,其余字节包含实际数据。 用户读取数据包时,首先读取开始的4/8字节。根据这一点,将发出read()调用来读取剩余的数据

你可以参考

“这行不通”——为什么不?“这行不通”——为什么不?
struct data {
    int id;
    int set;
    char *device;
    char *resource;
};

struct database {
    struct data **db_data;
    size_t database_rows;
    size_t database_data_size;
};

int database_write(FILE *fp, const struct database *db)
{
    rewind(fp);

    if(fwrite(*db->db_data, sizeof(struct data), 1, fp) == -1) {
        return DATABASE_ERROR;
    }

    return 0;
}

struct database* database_read(FILE *fp, size_t db_rows, size_t db_data_size)
{
    struct database *db = NULL;
    size_t i = 0;

    db = malloc(sizeof(struct database));

    db->database_rows = db_rows;
    db->database_data_size = db_data_size;
    db->db_data = malloc(sizeof(struct data) * db_rows);

    for(i = 0; i < db_rows; i++) {
        db->db_data[i] = malloc(sizeof(struct data));
        db->db_data[i]->device = malloc(db_data_size);
        db->db_data[i]->resource = malloc(db_data_size);
    }

    rewind(fp);

    if(fread(*db->db_data, sizeof(struct data), 1, fp) == -1) {
        return NULL;
    }

    return db;
}