Comment écrire un object de liste liée dans un fichier

void writeFile(){ Employer *temp = head; while (temp != NULL) { temp->tryWrite();//Employee's display method called here temp = temp->getNext(); } } void main(){ EmployerList em; em.AddNode("[email protected]", "LIME", "Manager", "ming", "ding", "Newston", "43", "873"); em.AddNode("[email protected]", "NOKIA", "CEO", "rew", "nbv", "Europe", "0411-789-6548", "985-257-1111"); //em.writeFile(); } 

J’essaie d’écrire la liste liée dans le fichier sous forme d’object plutôt que de façon singulière, comme dans la fonction tryWrite. de l’aide?

La réponse courte est “Non, vous ne pouvez pas faire ça.”

Une liste chaînée, presque par définition, contient des pointeurs. Au moins pour le stockage à long terme (c’est-à-dire tout ce qui survit en dehors d’une exécution unique du programme), vous ne pouvez rien obtenir de significatif en stockant un pointeur sur le disque, puis en le relisant.

La sérialisation des structures de données contenant des pointeurs nécessite généralement de “chasser” ces pointeurs et d ‘”aplatir” la structure d’une manière ou d’une autre. Pour une liste chaînée linéaire, vous voulez probablement juste écrire les nœuds dans l’ordre. Une autre possibilité consiste à remplacer les décalages dans le fichier par des pointeurs vers la mémoire. Cela est surtout utile si vous devez conserver le même type de structure sur le disque (par exemple, vous voulez une arborescence que vous pouvez manipuler sur le disque en tant qu’arborescence réelle, pas seulement une séquence d’enregistrements).

Quoi qu’il en soit, il est peu probable que le simple fait de stocker les données brutes soit utile.

Le code que vous montrez est incomplet et ne comstack pas. Il vous manque des déclarations pour les variables de membre de classe. Votre constructeur pour EmployerList devrait probablement prendre un const Employer & et le stocker; il ne devrait pas traiter de toutes les variables utilisées pour initialiser un employeur.

Écrire une liste chaînée dans un fichier est un peu compliqué. Vous ne pouvez pas écrire de manière significative des pointeurs; vous devez écrire les valeurs de données pour chaque élément dans un format normalisé et facilement lisible. Vous utilisez la proximité dans le fichier pour indiquer les relations “suivantes” (et “précédentes”). Ce processus s’appelle «sérialisation» en sortie et «désérialisation» en entrée.


Cet idiome:

  Employer *node = new Employer(Email, cName, pos, fName, lName, addr, tHome, tMobile); //if memory was sucessfully allocated if (node != NULL) 

est archaïque (pré-standard, c’est-à-dire avant 1998) C ++. Vous n’avez pas invoqué d’allocateur “sans recours”; si l’allocation échouait, une exception était levée. Par conséquent, le contrôle d’allocation est redondant.

Cela ne cause pas de problèmes directs; le test est juste inutile (et indente votre code plus que nécessaire). Si votre manuel utilise cette technique, vous devriez probablement vous procurer un nouveau manuel.

(J’ai également noté que je devais corriger l’espacement pour rendre le code cohérent; la cohérence de la programmation est très importante.)

Si vous voulez stocker la liste liée sur le disque exactement de la même manière que ce qui est stocké en mémoire, vous ne pouvez pas. Comme les pointeurs de la liste chaînée sont “volatiles”, les éléments sur lesquels ils pointent peuvent être très différents lorsque vous exécutez votre application à un moment différent. Cela signifie qu’il est inutile de continuer les pointeurs eux-mêmes.

Cependant, vous pouvez conserver les nœuds dans une liste liée, ainsi que leurs relations (gérées auparavant par des pointeurs) avec le disque. Si vous utilisez une seule liste chaînée, stockez les nœuds un à un, de la tête à la fin.