【问题标题】:fwrite with structs containing an arrayfwrite 使用包含数组的结构
【发布时间】:2011-01-14 11:38:45
【问题描述】:

如何编写包含数组的结构

#include <iostream>
#include <cstdio>

typedef struct {
  int ref; 
  double* ary;
} refAry;

void fillit(double *a,int len){
  for (int i=0;i<len;i++) a[i]=i;
}

int main(){
  refAry a;
  a.ref =10;
  a.ary = new double[10];
  fillit(a.ary,10);
  FILE *of;
  if(NULL==(of=fopen("test.bin","w")))
     perror("Error opening file");
  fwrite(&a,sizeof(refAry),1,of);

  fclose(of);
  return 0;
}

test.bin 的文件大小是 16 字节,我猜是 (4+8) (int + double*)。文件大小应为 4+10*8 (im on 64bit)

~$ cat test.bin |wc -c
16
~$ od -I test.bin 
0000000                   10             29425680
0000020
~$ od -fD test.bin -j4
0000004   0,000000e+00   7,089709e-38   0,000000e+00
                     0       29425680              0
0000020

谢谢

【问题讨论】:

  • 您似乎在编写纯 C,但是包含 是什么意思?
  • new 不在我来自的 C 语言中......
  • new 没有匹配的delete
  • 那仍然是 C++。糟糕的 C++,但仍然是 C++。
  • 实际上文件大小应该是 (8 + 10 * 8) 而不是 (4 + 10 * 8),假设您更正代码以写入内存中表示的数组。由于您在 64 位平台上,因此指针的大小为 64 位。您的结构成员将在 8 字节边界上对齐,因为您的指针大小大于 int 的大小。这意味着您的 int 成员和指针之间将有 4 个字节的填充,这就是为什么您的结构的大小是 16,而不是 12。

标签: c++ struct fwrite fread


【解决方案1】:

您正在将指针(内存地址)写入文件,这不是您想要的。您要写入指针(数组)引用的内存块的内容。这不能通过单次调用 fwrite 来完成。我建议你定义一个新函数:

void write_my_struct(FILE * pf, refAry * x)
{
    fwrite(&x->ref, sizeof(x->ref), 1, pf);
    fwrite(x->ary, sizeof(x->ary[0]), x->ref, pf);
}

你需要一个类似的 fread 替代品。

【讨论】:

    【解决方案2】:

    你的结构实际上并不包含一个数组,它包含一个指针。如果您真的想要可变长度结构,则需要在其中保留一个 size 字段,以便您知道它有多大。 C FAQ 有一个示例,说明您正在尝试执行的操作。在您的情况下,它可能看起来像这样:

    typedef struct {
        int ref; 
        double ary[1];
    } refAry;
    
    #define SIZE_OF_REFARY (sizeof(refAry) - sizeof(double))
    

    分配:

    size_t alloc_size = SIZE_OF_REFARY + 10*sizeof(double);
    refAry *a = malloc(alloc_size);
    a->ref = 10;
    

    写作:

    fwrite(a, SIZEP_OF-REFARY + a->ref * sizeof(double), 1, file);
    

    【讨论】:

    • 查看他的代码,ref 充当大小字段。顺便说一句,这段代码完全是 hack,我认为不应该推荐它。
    • 哦,是的,好的。我去清理那个。我会同意不推荐的,但它绝对很受欢迎;有 很多 代码以这种方式运行。
    【解决方案3】:

    你的结构包含一个指针,而不是一个 10 的数组。sizeof() 会选择它。

    你需要类似 fwrite(a.ary, sizeof(double), 10, of);为了写出实际的数组

    【讨论】:

      【解决方案4】:

      如果数组的大小始终为 10,则只需将结构更改为:

      typedef struct {
        int ref; 
        double ary[10];
      } refAry;
      

      然后,您可以使用 sizeof(refAry) 作为大小,通过一次调用 fwrite 将其写出来。

      【讨论】:

      • 我猜他想要一个动态数组,否则他不需要存储大小(ref)。
      猜你喜欢
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多