fwrite mit structs ein Array mit
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
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 schreibenWenn 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.