2010-10-28 4 views
1

J'ai une structure complexe dans un programme C qui a de nombreux membres auxquels de la mémoire est allouée dynamiquement. Comment écrire cette structure dans un fichier texte/binaire? Comment vais-je être en mesure de recréer la structure entière à partir des données lues dans le fichier.Comment écrire une structure allouée dynamiquement au fichier

struct parseinfo{ 
int varcount; 
int termcount; 
char **variables; 
char **terminals; 
char ***actions; 
}; 

Les variables membres, les terminaux et les actions sont toutes allouées dynamiquement et je dois écrire cette structure dans un fichier afin que je puisse reconstruire la structure plus tard.

+1

Bonjour @ utilisateur490648 Bienvenue dans Stackoverflow. Je vous encourage à lire http://stackoverflow.com/questions/how-to-ask et à voir comment nous pouvons vous aider! – jcolebrand

Répondre

1

Voici quelques suggestions pour sérialisation binaire:

Vous pouvez sérialiser une chaîne soit à la C (écrire la terminaison « \ 0 ») ou en écrivant la taille (par exemple, un entier) suivi par le contenu .

Vous pouvez sérialiser un tableau de chaînes en écrivant la longueur du tableau suivi des chaînes.

S'il est possible que vous désérialiser le fichier sur un autre (taille différente int, différent boutisme ...) Architecture , puis prendre soin de préciser soigneusement le format binaire du fichier. Dans un tel cas , vous pouvez jeter un oeil à la norme XDR serialiaztion.

Pour la sérialisation ASCII, j'aime le format JSON.

+0

Un grand merci Edgar. J'ai découvert que JSON (ou XML) correspond à mes besoins car je ne stocke que des données ASCII. Merci encore. – farhanhubble

4

Vous devez écrire à cette structure sérialisation et deserialize fonctions, vous ne pouvez pas écrire cette structure pour fichier en tant que données brutes parce que vous avez attribué des pointeurs sur un tas et ce pas de sens pour sauvegarder ces valeurs sur le fichier .

+1

+1. Une sorte de logique de sérialisation/désérialisation est requise. [Google Protocol Buffers] (http://code.google.com/p/protobuf/) est une bibliothèque à cet effet qui fonctionne en C++. Je suis sûr qu'il y en a beaucoup d'autres aussi. –

+0

Je comprends qu'il y a un besoin de sérialiser ma structure. Pour l'instant je me suis contenté d'un format simple dans lequel je stocke 'varcount' puis chaque ligne de 'variables' est stockée sur une nouvelle ligne. De même pour les autres domaines. J'ai beaucoup googlé et j'ai compris que XML et JSON sont ce que je cherchais. Je vais modifier ma source pour en utiliser une dans le futur. Merci pour la réponse. – farhanhubble

0

La façon dont je suggérerais de le faire est de penser à ce qu'il faut pour créer les éléments en premier lieu?

En ce qui concerne le char **variables; char **terminals; char **actions, vous devrez évidemment comprendre comment les déclarer et les lire mais je ne pense pas que vous pouvez injecter un/0 dans un fichier (caractère EOF ??)

Comment voulez-vous le voir écrire dans le fichier? Pouvez-vous fournir un exemple de sortie comment vous pensez qu'il devrait être stocké? Peut-être un élément par ligne dans un fichier? Est-ce que ce doit être un fichier binaire?

+0

Vous pouvez en fait écrire des octets ''\ 0'', ou n'importe quelle autre valeur' char' que vous voulez, dans un fichier. Si vous le faites, il peut ne pas être utile d'essayer d'afficher le fichier dans un visualiseur destiné aux fichiers texte. Sinon, ce post pose quelques bonnes questions pour commencer votre réflexion. – aschepler

+0

Salut @aschepler, est-ce pour moi ou pour lui? Je n'étais pas sûr de ce '\ 0', alors merci pour cela. – jcolebrand

+0

Merci drachenstern.Il y a deux choix-- Utiliser mon propre format en stockant des largeurs de champ suivies de données OU utiliser un format universel pour les structures de données arbitraires comme XML ou JSON. Comme je n'ai pas beaucoup de temps à portée de main, j'utilise mon propre format et j'ai hâte d'utiliser XML ou JSON à l'avenir. – farhanhubble

2

Courte: Pas de manière automatisée.

En substance, cela dépend fortement de la sémantique de votre structure. Si les champs de données à l'intérieur spécifient la longueur de certaines arrays à l'intérieur, vous pouvez reconstruire la structure. Mais vous devez faire attention à "croire" les valeurs. (cause possible du débordement de pile (mot gentil)) si vous croyez qu'il y a 2^34 entrées dans un tableau. Mais sinon, ça va juste à tous les membres (douleur)

Vous pourriez chercher un peu sur les structures ASN.1 et TLV.

+0

Évitez ASN.1 si vous le pouvez! ce n'est pas amusant à utiliser. –

+0

Merci beaucoup RobKop pour l'instant je fais ce que vous avez suggéré. – farhanhubble

Questions connexes