2

配列を含む構造体を fwrite する方法

#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 にする必要があります (64 ビットの場合)

~$ 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

ありがとう

4

4 に答える 4

2

ポインタ (メモリ アドレス) をファイルに書き込んでいますが、これは必要なものではありません。ポインタ (配列) によって参照されるメモリ ブロックの内容を書き込みたいとします。これは、fwrite を 1 回呼び出すだけでは実行できません。新しい関数を定義することをお勧めします:

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 にも同様の代用品が必要です。

于 2010-02-08T17:56:59.460 に答える
1

構造体には実際には配列が含まれていません。ポインターが含まれています。可変長構造が本当に必要な場合は、サイズ フィールドをそこに保持して、その大きさを把握する必要があります。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);
于 2010-02-08T17:54:28.763 に答える
0

構造体には、10の配列ではなく、ポインターが含まれています。sizeof()がそれを取得します。

fwrite(a.ary、sizeof(double)、10、of);のようなものが必要になります。実際の配列を書き込むために

于 2010-02-08T17:59:34.480 に答える
0

配列のサイズが常に10の場合は、構造体を次のように変更するだけです。

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

次に、サイズにsizeof(refAry)を使用して、fwriteを1回呼び出すだけでこれを書き出すことができます。

于 2010-02-08T18:02:14.057 に答える