質問

私は、配列を含む構造体を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のファイルサイズは、私は(4 + 8)(INT +二重*)で推測16バイトです。ファイルサイズは、4 + 10 * 8(64ビット上のIM)

でなければなりません
~$ 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

感謝

役に立ちましたか?

解決

あなたが望むものではないファイルへのポインタ(メモリアドレス)を書いています。あなたはポインタ(配列)によって参照されるメモリのブロックの内容を書きたいです。これは、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のための同様の代替が必要になります。

他のヒント

あなたの構造は、実際にはポインタを含む、配列が含まれていません。あなたが本当に可変長の構造をしたい場合、あなたはそれがどのように大きな知っているように、そこにサイズフィールドを維持する必要があります。 Cよくある質問のは、それはあなたが何をしようとしているに見えます正確に何の例があります。あなたのケースでは、次のようになります。

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);

あなたの構造はそれを拾う)ポインタ、10はsizeof(のない配列が含まれています。

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

:配列のサイズは常に10である場合は、

、その後、単にあなたの構造体を変更します

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

これで、サイズのためにはsizeof(refAry)を使用して、fwriteのために1回の呼び出しでこれを書くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top