Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
如何将包含已分配内存的结构保存到文件? //标题 结构地址{ int-id; 字符*名称; 字符*电子邮件; }; 结构数据库{ 结构地址*行; int max_大小; int max_数据; }; 结构连接{ 文件*文件; 结构数据库*db; }; int main(int argc,char*argv[]){ int i; 结构连接*conn; conn->file=fopen(argv[3],“w+”; conn->db->max_size=atoi(argv[1]); conn->db->max_data=atoi(argv[2]); conn->db->rows=malloc(sizeof(struct Address)*(db->max_size)); 对于(i=0;imax_大小;i++){ 结构地址adr={.id=i}; adr.name=malloc(连接->数据库->最大数据); adr.email=malloc(连接->数据库->最大数据); 连接->数据库->行[i]=addr; } /*此处的其他代码 * * */ }_C_Struct - Fatal编程技术网

如何将包含已分配内存的结构保存到文件? //标题 结构地址{ int-id; 字符*名称; 字符*电子邮件; }; 结构数据库{ 结构地址*行; int max_大小; int max_数据; }; 结构连接{ 文件*文件; 结构数据库*db; }; int main(int argc,char*argv[]){ int i; 结构连接*conn; conn->file=fopen(argv[3],“w+”; conn->db->max_size=atoi(argv[1]); conn->db->max_data=atoi(argv[2]); conn->db->rows=malloc(sizeof(struct Address)*(db->max_size)); 对于(i=0;imax_大小;i++){ 结构地址adr={.id=i}; adr.name=malloc(连接->数据库->最大数据); adr.email=malloc(连接->数据库->最大数据); 连接->数据库->行[i]=addr; } /*此处的其他代码 * * */ }

如何将包含已分配内存的结构保存到文件? //标题 结构地址{ int-id; 字符*名称; 字符*电子邮件; }; 结构数据库{ 结构地址*行; int max_大小; int max_数据; }; 结构连接{ 文件*文件; 结构数据库*db; }; int main(int argc,char*argv[]){ int i; 结构连接*conn; conn->file=fopen(argv[3],“w+”; conn->db->max_size=atoi(argv[1]); conn->db->max_data=atoi(argv[2]); conn->db->rows=malloc(sizeof(struct Address)*(db->max_size)); 对于(i=0;imax_大小;i++){ 结构地址adr={.id=i}; adr.name=malloc(连接->数据库->最大数据); adr.email=malloc(连接->数据库->最大数据); 连接->数据库->行[i]=addr; } /*此处的其他代码 * * */ },c,struct,C,Struct,现在,根据这些截取的代码,如何将conn->db结构和所有内容保存到conn->file? 之后,我必须能够再次从文件中读取它 我不能使用堆栈类型结构,因为“max\u data”和“max\u size”是从用户输入的 您是否考虑过写入二进制文件 写作 // Headers struct Address{ int id; char *name; char *email; }; struct Database{ struct Address *rows; int max_

现在,根据这些截取的代码,如何将conn->db结构和所有内容保存到conn->file? 之后,我必须能够再次从文件中读取它


我不能使用堆栈类型结构,因为“max\u data”和“max\u size”是从用户输入的

您是否考虑过写入二进制文件

写作

// Headers

struct Address{
  int id;
  char *name;
  char *email;
};

struct Database{
  struct Address *rows;
  int max_size;
  int max_data;
};

struct Connection{
  FILE *file;
  struct Database *db; 
};

int main(int argc, char *argv[]){
  int i;
  struct Connection *conn;

  conn->file = fopen(argv[3], "w+");
  conn->db->max_size = atoi(argv[1]);
  conn->db->max_data = atoi(argv[2]);

  conn->db->rows = malloc(sizeof(struct Address) * (db->max_size));

  for(i=0; i<db->max_size; i++){
    struct Address adr = {.id = i};
    adr.name = malloc(conn->db->max_data);
    adr.email = malloc(conn->db->max_data);

    conn->db->rows[i] = addr;
  }

  /* Other CODE(s) here
   *
   *
  */
}
用于读取该文件

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary
fwrite(conn->db,sizeof(conn->db),1,write_ptr); // write number of bytes determined by the structure size into a binary file

请注意,无法在paintext中打开和读取二进制文件

查找序列化。简而言之,一次调用
fwrite()
,是无法做到这一点的——您必须弄清楚如何将数据分块传输,以及如何将数据分块读回。或者你需要重新设计你的结构,这样你就有了数组而不是指针。你是对的,但是当我使用arrray时,我如何初始化db->任意大小的行呢?有什么方法可以做到这一点吗?您需要在实际数据之前序列化和反序列化总大小。通过这种方式,您可以知道大小,然后设置db->rows并填充它。请注意,当重新读取文件时,这将恢复指向在程序上一次运行中分配的数据的指针,该指针可能与为当前运行分配的内存不相似。当数据结构包含指针时,这是不够的。
FILE *read_ptr;

read_ptr = fopen("test.bin","rb");  // r for read, b for binary
fread(conn->db,sizeof(conn-db),1,ptr); // read bytes determined by size of structure form the file into the current conn->db structure