使用指针写入和读取(fwrite - fread)结构

2023-12-07

我正在开发一个邮箱项目,我有以下两种结构:

结构mmbox_mail

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

and

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;
}
while(mailtmp != NULL){  /* i have a list of mails and i use a mailtmp pointer to save each mail */

你可以帮帮我吗?我试图到处搜索,但从未发现有人要求保存两个结构,一个在另一个内。


当然,这对于字符串来说是行不通的,因为它会复制指针的大小(通常是 4 个字节)。我在这里看到 3 个选项:

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

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

如果您选择第一种方法,则为每个字符串 (char *) 字段写入零终止字节,以便您在读回时始终知道它的结束位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用指针写入和读取(fwrite - fread)结构 的相关文章

随机推荐