从指针指向内存的二进制文件读取结构

Vis*_*ngh 1 c c++ pointers structure fread

struct st {
        char *p;
        int len;
};
Run Code Online (Sandbox Code Playgroud)

这是我需要写入二进制文件的结构,以及保存在中的字符串

char *p

我应该用字符数组数据编写一个二进制文件。写入二进制文件后。还应该能够从二进制文件中以相同的结构读取它。

我尝试使用 FSEEK_END 获取二进制大小,并根据文件大小执行 fread,但它没有保存字符串。请建议。任何帮助/建议/指示将不胜感激。

提前致谢。

示例代码:

 struct st {
         char *p;
         int len; 
 };

 struct st varr;
 varr.len = 100;
 varr.p = new char[gen];
 strcpy(varr.p, "Hello World");

 FILE *p;
 p=fopen("address","wb");
 fwrite(&varr,sizeof(struct st),1,p);
 fclose(p); 
Run Code Online (Sandbox Code Playgroud)

这将向我写入指向二进制文件的指针。但我想在这里写整个字符串,但重点是,它应该用一个 fwrite 完成。

Pau*_*vie 5

将其写入二进制文件是没有用的。一个文本文件就足够了。

但是,如果这是您的家庭作业(或类似作业),我建议您按以下步骤操作:

  • 将长度写为整数;

  • 写入len字符串的字节。这不包括终止空值。

回读时:

  • 读取整数长度;

  • 分配该长度加一个字节的内存

  • 将字符串读入该内存并添加终止 null

使用此长度和指向已分配内存的指针填充您的结构。


在您的评论中,您不断重复您想要一步读和写。对于当前的数据结构,这是不可能的,因为字符串始终位于内存中的其他位置,并且fwrite只能写入连续的内存块。

但是,您会将数据结构更改为:

struct st{
    char p[128];
    int len;
};
Run Code Online (Sandbox Code Playgroud)

然后您可以一次性写入和读取,因为现在该结构是一个连续的内存块。但现在字符串限制为 128 字节(或您指定的任何大小)。

  • @VishwadeepSingh 你知道“fwrite()”是如何工作的以及如何优化它吗?您知道文件系统是如何工作的以及如何优化它吗?您是否知道磁盘控制器如何工作以及如何优化 IO 方式以利用其特定的性能特征?您知道您的磁盘本身是如何工作的吗?如果你这样做了,你知道你的“优化”IO 会快多少吗?**编写清晰、易懂的代码。** 在有已知的性能问题需要解决之前,不要担心优化。那么如果是IO问题,就去买更快的磁盘吧。 (2认同)