2010-06-27 6 views
1

Je suis en train de réaliser un projet d'école sur le maintien d'une base de données personnelle. mais mes tuteurs n'ont pas expliqué la pratique, ils ont expliqué la théorie (structures de données et autres) pas comment coder en c.Écrire une structure en même temps dans un fichier

Nous avons reçu une certaine quantité de tables, d'index et de consultations qu'ils voulaient résoudre et nous devons programmer les structures de données qui s'exécutent derrière. J'ai choisi une table de hachage pour conserver les arbres de données et b + pour les index secondaires.


Eh bien, le b + arbres, je peux les garder dans la mémoire vive, mais la table de hachage, je dois être en mesure de le maintenir dans le disque dur. Donc j'utilise la fonction fwrite() pour le garder sur le disque. Mais j'ai trouvé un problème. Je ne sais pas comment écrire le seau entier sur le disque avec une seule instruction fwrite (Ceci est l'une des rares conditions qui m'ont été données).


le code que j'ai pour initialiser la structure

FILE * file; 
file = fopen ("HistoriasClinicas.bin" , "wb"); 
for(i=0;i<amountOfBuckets;i++) 
    fwrite (Bucket , getpagesize() ,1 , file); 
fclose (file); 

Et ce sont mes structures

typedef struct Hist_clin_s{ 
struct 
{ 
    char codPaciente[7]; 
} X; 
struct 
{ 
    char codMedico[7]; 
    int fecha; 
    char Observacion[151]; 
} Y; 
int ptro; 
}Hist_Clin; 



typedef struct balde_s{ 
Hist_Clin *hcs; 
char *waste; //Waste to make the bucket reach the page size. 
}Bucket; 

Le problème que je fais l'expérience est que lorsque je tente de écrire un seau. la taille du seau est seulement de 8 (cos des 2 pointeurs) mais je ne peux pas faire ces deux vecteurs de pointeur [] parce que je dois calculer ces valeurs une fois que le programme a déjà commencé. Et pour ce que je lis, il n'y a pas moyen de redimensionner les vecteurs, car ils changent de place dans la mémoire.

La seule solution à laquelle je peux penser est de charger le compartiment entier dans un tableau char (sorte de tampon) et de l'écrire ensuite en mémoire.

Des idées?

Répondre

3

Ce que vous faites est généralement appelé sérialisation, si cela vous aide plus d'infos sur Google.

Maintenant, dans ce cas, votre première struct:

typedef struct balde_s{ 
    Hist_Clin *hcs; 
    char *waste; //Waste to make the bucket reach the page size. 
}Bucket; 

est composé de 2 pointeurs. Les pointeurs ne seront pas forcément valides pendant un cycle de sauvegarde (vous pouvez généralement compter sur eux pour ne pas l'être), vous n'avez donc pas besoin de les sauvegarder. Au lieu de cela, vous voudrez écrire le contenu de ces deux structures dans le fichier. Heureusement, vous avez presque rendu cela facile pour vous. Vous connaissez l'adresse (du pointeur), donc il suffit d'utiliser:

fwrite((void*)something.hcs, sizeof(Hist_Clin), 1, file); 

qui va écrire n octets (la taille d'un enregistrement), en commençant par le pointeur donné. Et

+0

et que puis-je faire à propos des déchets? Parce que l'idée entière est d'écrire une page entière (un seau dans ce cas) sur le disque. –

+0

Je ne suis pas sûr de ce que vous voulez dire. L'exemple de code que j'ai donné écrira une structure Hist_Clin et toutes les données qu'il contient dans un fichier. Aucune donnée avant ou après ne sera écrite, c'est donc une méthode relativement propre et sans déchets. Vous devrez peut-être recourir à la pagination du fichier ou utiliser une sorte de fonction de fichier en tant que mémoire pour accéder aux données. Sans voir un exemple plus complet, je ne suis pas sûr de ce qu'il faudrait faire. – ssube

+0

Est-ce que struct n'est pas réservé? ;) – Nyan

Questions connexes