Comment écrire un objet de fichier en C++
J'ai un objet avec plusieurs chaînes de texte en tant que membres. Je veux écrire cet objet au fichier à la fois, au lieu de l'écriture de chaque chaîne de caractères dans un fichier. Comment puis-je le faire?
OriginalL'auteur neuromancer | 2010-03-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplacer
operator>>
etoperator<<
de lecture/écriture de flux.Exemple
Entry struct
avec certaines valeurs:Mise en œuvre:
Puis vous ouvrez filestream, et pour chaque objet de votre appel:
Ou de sortie:
Ou si vous souhaitez utiliser le volet
read
etwrite
alors que vous venez de remplacer le code correspondant dansoperator
s de mise en œuvre.Lorsque les variables sont privés à l'intérieur de votre structure/classe alors vous devez déclarer
operator
s comme ami des méthodes.Vous mettre en œuvre n'importe quel format/séparateurs que vous le souhaitez. Lorsque votre chaîne inclure des espaces d'utiliser getline() qui prend une chaîne et de flux au lieu de
>>
parce queoperator>>
utilise des espaces comme délimiteurs par défaut. Dépend de votre séparateurs.OriginalL'auteur stefanB
Il est appelé à la sérialisation. Il y a beaucoup de sérialisation fils sur.
Il y a aussi une belle bibliothèque de sérialisation inclus dans boost.
http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/index.html
fondamentalement, vous pouvez faire
et
avec boost de sérialisation.
OriginalL'auteur Chris H
Si vous avez:
ensuite, vous pouvez écrire tout juste à écrire(fh, ptr, sizeof(struct).
Bien sûr, ce n'est pas portable (car nous ne sommes pas sauver la endieness ou de la taille de "int", mais qui peut ne pas être un problème pour vous.
Si vous avez:
alors vous ne cherchez pas à écrire l'objet; vous êtes à la recherche pour le sérialiser. Votre meilleur pari est de regarder dans le Stimuler bibliothèques et d'utiliser leur sérialisation des routines, parce que ce n'est pas un problème facile dans des langues sans réflexion.
OriginalL'auteur user205666
Il n'est pas vraiment un moyen simple, c'est du C++, après tout, pas de PHP ou JavaScript.
http://www.parashift.com/c++-faq-lite/serialization.html
Boost dispose également d'une bibliothèque: http://www.boost.org/doc/libs/release/libs/serialization ... comme Tronic déjà mentionné 🙂
OriginalL'auteur KiNgMaR
La meilleure méthode est d'écrire chaque champ individuellement avec la longueur de chaîne.
Comme alternative, vous pouvez créer un
char
tableau (oustd::vector<char>
) et d'écrire tous les membres dans la mémoire tampon, puis écrire la mémoire tampon à la sortie.Le sous-jacent épine est qu'un compilateur est autorisé à insérer le remplissage entre les membres d'une classe ou d'une structure. Utilisation
memcpy
oustd::copy
entraînera des octets de remplissage écrit à la sortie.N'oubliez pas que vous devez écrire la longueur de chaîne et le contenu ou le contenu suivie par certains caractères de fin.
À d'autres personnes de proposer de vérifier la poussée de la Sérialisation de la bibliothèque.
OriginalL'auteur Thomas Matthews
Malheureusement, ce n'est généralement pas tout à fait possible. Si votre structure ne contient que de la plaine de données (pas de pointeurs ou des objets complexes), vous pouvez la stocker sur un seul morceau, mais des précautions doivent être prises si la portabilité est un problème. Rembourrage, le type de données de la taille et de l'endianess questions de faire de cette problématique.
Vous pouvez utiliser Boost.La sérialisation de réduire la quantité de code nécessaire pour le bon portable et versionable searialization.
OriginalL'auteur Tronic
En supposant que votre objectif est, comme indiqué, à l'écriture de l'objet avec un seul appel à write() ou fwrite() ou que ce soit, vous me devez d'abord copier la chaîne et autres objets de données dans un seul bloc contigu de mémoire. Ensuite, vous pouvez écrire() ce bloc de mémoire avec un seul appel. Ou vous pourriez être en mesure de faire un vecteur d'écrire en appelant writev(), si cet appel est disponible sur votre plateforme.
Cela dit, vous n'aurez probablement pas obtenir beaucoup en réduisant le nombre de rédiger des appels. Surtout si vous êtes en utilisant fwrite() ou similaire, la bibliothèque C est déjà mise en mémoire tampon pour vous, de sorte que le coût de multiples petits appels est minime de toute façon. Ne mettez pas vous-même à travers beaucoup de la douleur et de la complexité du code, sauf si il va vraiment faire du bien...
OriginalL'auteur Jeremy Friesner