Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
使用fread/fwrite在C中读写文件的结构_C_Struct_Fwrite_Structure_Fread - Fatal编程技术网

使用fread/fwrite在C中读写文件的结构

使用fread/fwrite在C中读写文件的结构,c,struct,fwrite,structure,fread,C,Struct,Fwrite,Structure,Fread,我有以下结构: typedef struct { char last[NAMESIZE]; char first[NAMESIZE]; } name; typedef struct { int id; name name; float score; } record; typedef struct { record *data; size_t nalloc; size_t nused; } record_list; 我正在尝试使用此函数从文件中读取记录: i

我有以下结构:

typedef struct {
  char last[NAMESIZE];
  char first[NAMESIZE];
} name;

typedef struct {
  int id;
  name name;
  float score;
} record;

typedef struct {
  record *data;
  size_t nalloc;
  size_t nused;
} record_list;
我正在尝试使用此函数从文件中读取记录:

int file_read(record_list *list, record* rec)
{
  /* irrelevant code eliminated */

  while(fread(&records, sizeof(record), 1, fp))
  {
    *rec = records;
    valid_list_insert = list_insert(list, rec);
    if(!valid_list_insert)
    {
      return 0;
    }
  }
}
我正在尝试使用以下函数将记录列表写入文件:

int file_write(record_list* list)
{
  /* irrelevant code eliminated */

  if(fwrite(&list, sizeof(record_list), 1, fp) == 0)
  {
    return 0;
  }
}

但是,这两种方法都不能正常工作。当我试图在程序中显示记录列表时,fread以随机的方式读取数据。而fwrite只是将随机字符写入文件。如果您能帮我解释一下为什么这不起作用,我们将不胜感激

好的,不起作用的一件事是写入指针(如
记录列表的
数据
成员中的指针):因为(1)它将写入指针的值(即内存中某个点的数值)和(b)当您再次读取时,您不会将您的内容分配到相同的位置。相反,您必须仔细解析结构,并以能够再次获取数据的方式记录数据


此过程称为“序列化”(反之称为“反序列化”)。另请参见。

好吧,不起作用的一件事是写入指针(如
记录列表的
数据
成员):因为(1)它将写入指针的值(即内存中某个点的数值)和(b)当您再次读回指针时,您不会在同一位置分配您的内容。相反,您必须仔细解析结构,并以能够再次获取数据的方式记录数据


此过程称为“序列化”(反之称为“反序列化”)。另请参见。

如果您认为问题出在
fread
/
fwrite
,那么首先要做的就是消除所有不相关的代码,让您的生活更轻松,让您的问题更容易被人回答。因此,摆脱所有与解析用户输入有关的东西!让gdb成为你的朋友。一次性投资(学习曲线),你将在一生中不断收获!如果你认为问题出在fread
/
fwrite
上,那么首先要做的就是消除所有不相关的代码,让你的生活更轻松,让别人更容易回答你的问题。因此,摆脱所有与解析用户输入有关的东西!让gdb成为你的朋友。一次性投资(学习曲线),你将在一生中不断收获!我一直在看fread和fwrite的示例,它们似乎都以与我相同的方式使用函数。我对C还是很陌生,你能给我一个在我尝试做的事情中使用序列化的例子吗?首先看看你是否可以简单地在
typedef struct{int I;char s[8]}dumbstruct。如果这样做有效,请考虑如何序列化
dumbstruct
s:
typedef struct node\u t{node\u t*next;dumbstruct payload;}node。这里的关键问题是“如何表示结构(指针中编码的列表)以及数据?”我一直在查看fread和fwrite的示例,它们似乎都以与我相同的方式使用函数。我对C还是很陌生,你能给我一个在我尝试做的事情中使用序列化的例子吗?首先看看你是否可以简单地在
typedef struct{int I;char s[8]}dumbstruct。如果这样做有效,请考虑如何序列化
dumbstruct
s:
typedef struct node\u t{node\u t*next;dumbstruct payload;}node。这里的关键问题是“如何表示结构(指针中编码的列表)以及数据?”