2010-02-08 4 views
2

Comment fwrite une structure contenant un tableaufwrite avec structs contenant une matrice

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

La taille du fichier de test.bin est de 16 octets, qui je pense est (4 + 8) (int + double *) . La taille du fichier doit être 4 + 10 * 8 (im sur 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 

grâce

+0

Vous semblez écrire du C pur mais alors qu'est-ce qui est avec l'inclusion de ? – Manuel

+0

'new' n'est pas en C d'où je viens ... –

+0

Et' new' sans un 'delete' correspondant? – Manuel

Répondre

2

Vous écrivez le pointeur (une adresse mémoire) dans le fichier , ce qui n'est pas ce que tu veux. Vous voulez écrire le contenu du bloc de mémoire référencé par le pointeur (le tableau). Cela ne peut pas être fait avec un seul appel à fwrite. Je vous suggère de définir une nouvelle fonction:

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

Vous aurez besoin d'un substitut similaire pour fread.

1

votre structure ne contient pas réellement un tableau, il contient un pointeur. Si vous voulez vraiment des structures de longueur variable, vous devez garder un champ de taille pour que vous sachiez quelle est la taille. Le C FAQ a un exemple de ce que vous essayez de faire exactement. Dans votre cas, il pourrait ressembler à ceci:

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

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

Allouer:

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

Pour écrire:

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

Vérifiez son code, 'ref' agit comme champ de taille. BTW, ce code est un hack total, je ne pense pas qu'il devrait être recommandé. – Manuel

+0

Oh ouais, d'accord. Je vais aller nettoyer ça. Je vais aller avec non recommandé, mais c'est définitivement populaire; il y a un * lot * de code qui se comporte de cette façon. –

0

Votre structure contient un pointeur, pas un tableau de 10. Le sizeof() le récupère.

Vous aurez besoin de quelque chose comme fwrite (a.ary, sizeof (double), 10, of); afin d'écrire le tableau réel

0

Si la taille du tableau est toujours 10, puis changez simplement votre struct:

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

Vous pouvez alors écrire ce avec un seul appel à fwrite, en utilisant sizeof (refAry) pour la taille.

+0

Je suppose qu'il veut avoir un tableau dynamique, sinon il n'a pas besoin de stocker la taille ('ref'). – Manuel