当前位置 : 主页 > 编程语言 > c++ >

使用指针编写和读取(fwrite – fread)结构

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在研究一个邮箱项目,我有这两个结构: struct mmbox_mail struct mmbox_mail { char *sender, *recipient; char *obj, *date; char flags; size_t size; }; 和 mail_t typedef struct{ struct mmbox_mail info; void *body; void *ne
我正在研究一个邮箱项目,我有这两个结构:

struct mmbox_mail

struct mmbox_mail {
  char *sender, *recipient; 
  char *obj, *date;
  char flags; 
  size_t size; 
};

mail_t

typedef struct{
  struct mmbox_mail info;
  void *body;
  void *next;
} mail_t;

我无法修改结构的字段,因为我需要可变数据(为此我使用char *而不是char []).

每个mail_t结构都是一封邮件.我需要将用户的每个邮件保存在一个文件中,可以是二进制文件或文本文件(但我认为使用二进制文件更好,因为我有一个很难用纯文本保存的void *体.

我试图这样做,但似乎它不起作用:

while(mailtmp != NULL){
  fwrite(mailtmp, sizeof(mail_t), 1, fp);

  /* next mail */
  mailtmp=mailtmp->next;
}

06003

你可以帮帮我吗?我试图到处寻找,但我从未找到过要求保存两个结构的人,一个在另一个内部.

当然,这将不会像字符串那样复制指针的大小(通常是4个字节).我在这里看到3个选项:

>序列化数据,二进制文件(http://en.wikipedia.org/wiki/Serialization).
>创建一种格式以在文本文件中存储数据.
>使用XML / JSON等标记语言

在任何情况下,您都需要遍历结构的每个字段才能将其写入数据文件.至于阅读,在前两种情况下,您必须完全按照编写数据的顺序进行阅读,在第三种情况下,您可以按任何顺序独立阅读字段.

如果您选择第一个方法,对于每个字符串(char *)字段,还要写入零终止字节,以便在读取它时始终知道它的结束位置.

网友评论