Frage

Wie fwrite ich eine Struktur ein Array mit

#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;
}

Die Größe von test.bin beträgt 16 Bytes, was ich denke, (4 + 8) (int + double *). Die Dateigröße sollte 4 + 10 * 8 (im auf 64-Bit) sein

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

Dank

War es hilfreich?

Lösung

Sie schreiben die Zeiger (eine Speicheradresse) in die Datei, die nicht das, was Sie wollen. Sie möchten den Inhalt des Speicherblocks durch den Zeiger (das Array) verwiesen schreiben. Dies kann nicht mit einem einzigen Aufruf von fwrite erfolgen. Ich schlage vor, Sie eine neue Funktion definieren:

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

Sie werden einen ähnlichen Ersatz für fread benötigen.

Andere Tipps

Ihre Struktur nicht tatsächlich ein Array enthält, einen Zeiger enthält. Wenn Sie wirklich mit variabler Länge Strukturen wollen, müssen Sie in ein Größenfeld zu halten, damit Sie wissen, wie groß es ist. Die C FAQ hat ein Beispiel für genau das, was es sieht Sie zu tun versuchen. In Ihrem Fall könnte es etwa so aussehen:

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

#define SIZE_OF_REFARY (sizeof(refAry) - sizeof(double))

Zur Zuweisung:

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

schreiben:

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

Ihre Struktur enthält einen Zeiger, nicht ein Array von 10. Die sizeof () nimmt das auf.

Sie werden so etwas wie fwrite (a.ary, sizeof (double), 10,) müssen; um die tatsächliche Array

zu schreiben

Wenn die Größe des Arrays immer 10 ist, dann einfach Ihre Struktur ändern:

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

Sie können dies dann schreiben mit einem einzigen Aufruf an fwrite, mit sizeof (refAry) für die Größe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top