【问题标题】:Writing a structure pointer into the file using fwrite使用 fwrite 将结构指针写入文件
【发布时间】:2011-02-25 13:41:10
【问题描述】:

我正在尝试将结构指针写入文件。我想要做的是将结构指针写入字符缓冲区,然后从缓冲区中检索指针,最后将整个结构写入文件。

我没有编写整个结构,而是在文件中获取垃圾数据。

我是在代码中遗漏了什么还是犯了一些错误。

完整粘贴我的测试代码。

#include <stdio.h>
# include<stdlib.h>
#include <string.h>
typedef struct dummy_s {

  int a;
} dummy_t;

void main(int argc, char* argv)
{


   char *s1;
   s1 = malloc(sizeof(dummy_t)*1000);
   dummy_t * tmp1;
   tmp1 = (dummy_t *)s1;
   tmp1 -> a = 100;
   FILE *f;
   f = fopen("dummyfile.txt","w");
   dummy_t * tmp = NULL;
   tmp = malloc(sizeof(dummy_t));
   memcpy(tmp, s1, sizeof(dummy_t));
   fwrite(tmp,sizeof(struct dummy_s),1,f);
   fclose(f);
}

[因编译错误而编辑 - 抱歉] 干杯! 娜仁

【问题讨论】:

  • 那个 fwrite() 调用甚至编译...? (我手边没有 C 编译器。)
  • 一堆疯狂的操作...
  • memcpy(tmp, d, sizeof(dummy_t)); 中的“d”是什么?
  • 我也在想同样的事情。也许他的意思是s1?

标签: c pointers data-structures file-io


【解决方案1】:

对不起,我会有点粗鲁。如果您发布代码 sn-p,请确保它正确编译。您的代码使用了一个未定义的变量“d”,它需要“sizeof dummy”(我在这里看不到虚拟对象,至少在代码中没有),并且缺少一堆#include:秒。

修复编译错误后(使用 tmp1 而不是 d),它似乎可以正常工作。请注意,您正在生成的“文本文件”包含结构的二进制表示,而不是文本表示。 (假设一台 32 位 little-endian 机器,您将净出一个值为 100 的字节,然后是四个值为 0 的字节)。

另外,我看不出需要最后一个malloc和memcpy,fwrite应该可以直接写出原数组的内容。

【讨论】:

  • @Partick 和@Lindydancer 您好,对于编译问题,我们深表歉意。我的错。它的工作原理是,首先将结构写入缓冲区,然后从缓冲区中提取并写入文件。因此,缓冲区“s1”。我提到的场景与只编写一次结构有关。但是,我打算多次编写结构。我想,这应该可以解释“tmp1”、“malloc”和“memcpy”的需要
【解决方案2】:

您要将结构体作为文本还是二进制文件写入文件中?

如果你想把它写成文本,首先使用 sprintf 将你的数字转换成它的文本表示,例如

char buf[100];
sprintf (s, "%d", tmp->a);

然后使用 fputs 将 buf 写入文件。

如果要制作二进制文件,请务必不要用“w”打开文件,而是用“wb”打开文件。 否则运行时可能会将某些字符转换为其他字符(例如,换行符变为回车符+换行符)。 "wb" 中的 'b' 告诉 fopen 你想以二进制方式写入文件,根本不执行任何字符转换。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多