1
votes

Comment puis-je ajouter du texte devant chaque fois que j'écris dans un fichier?

Hé, je traite de la gestion de fichiers en C ++ ... Je suis nouveau dans la gestion des fichiers .... Je veux ajouter le contenu devant le fichier chaque fois que j'écris dans le fichier ........

J'ai ouvert un fichier en utilisant ..... fstream fi ("user.txt", ios :: app);

mais cela ajoute toujours le contenu à la fin du fichier .....

J'ai écrit un code C ++ en utilisant .....

Fstream fi ("user.txt", ios :: app); fi

Fstream fi("user.txt",ios::app);
fi<<"john is a great boy"<<endl;

résultat réel: il ajoute toujours mon contenu à la fin du fichier ...
Attendu: il doit toujours ajouter du contenu devant le fichier ....


3 commentaires

"Il doit toujours ajouter du contenu au début du fichier" - Le la description de ios :: app n'est rien sinon claire. Il dit "chercher à la fin du flux avant chaque écriture". Par conséquent, vous n'utilisez pas un mode ouvert approprié. Maintenant, la mauvaise nouvelle: il n'y a pas de mode ouvert qui fait ce que vous cherchez. Vous devez gérer vous-même les lectures et les écritures.


Vous pouvez faire cela via une mise en mémoire tampon en lecture / écriture avec deux blocs de la taille de vos données pré-pendantes. Lisez deux blocs (ou jusqu'à EOF) de la taille des données pré-pendantes. Ensuite, écrivez l'en-tête, puis écrivez block1, puis chargez le bloc1 avec une autre trame, puis écrivez le bloc deux. Ensuite, chargez le bloc2 avec une autre trame, puis écrivez le bloc1, etc. Cela continue jusqu'à ce que l'EOF soit atteint et que vous ayez écrit votre dernier bloc. Je ne le conseille pas, car il peut facilement corrompre si une erreur de lecture / écriture se produit, mais cela atténue un fichier intermédiaire. Bonne chance.


Il serait vraiment préférable d'ajouter les données à la fin du fichier, puis d'inverser le fichier lorsque vous avez terminé. Les fichiers sont conçus pour être ajoutés, ce que vous essayez de faire sera extrêmement inefficace et difficile à programmer également.


3 Réponses :


0
votes

Je pense que la seule façon de le faire est d'écrire votre contenu dans un autre fichier, puis d'y ajouter les anciennes lignes.


0 commentaires

2
votes

La première question serait: pourquoi voulez-vous le faire?

Ensuite, avec le traitement des fichiers, cela va devenir délicat, car ce n'est pas ainsi que les fichiers fonctionnent au niveau du système d'exploitation - alors que l'ajout est généralement pris en charge de manière native, ce n'est pas le cas pour le préfixe (et donc il n'y a pas de support pour C ++ STL Soit). Vous devrez donc écrire les nouvelles lignes dans un fichier temporaire, puis ajouter le contenu précédent par la suite tout le temps. Pas moyen de contourner Windows, Linux, BSD et ses dérivés.

Si vous insistez vraiment, vous pouvez écrire votre propre classe de flux basée sur des flux de fichiers standard cachant tout ce travail. Une variante alternative pourrait lire le fichier de sortie une seule fois, conserver toutes les lignes en mémoire, gérer les nouvelles lignes de manière appropriée et ne réimprimer les lignes dans le fichier qu'une seule fois lors de la fermeture de l'objet de flux. Inconvénient: si l'application plante, un certain nombre de lignes peuvent être perdues. Vous pouvez utiliser un std :: deque et ajouter les nouvelles lignes ou lire les lignes dans l'ordre inverse dans un std :: vector , ajouter les nouvelles lignes puis imprimer dans fichier en utilisant des itérateurs inversés.

Cependant, il vaut probablement mieux ajouter simplement aux fichiers. Vous pourriez alors écrire une application séparée en inversant l'ordre des lignes - avantage de: Vous ne feriez le travail d'inversion qu'une seule fois, la lecture de l'arrière peut être faite assez efficacement et lors de l'écriture du nouveau fichier de sortie, vous n'ajouteriez qu'à nouveau. Alternativement, vous pouvez écrire votre propre application de visualisation de fichiers présentant les lignes dans l'ordre inversé (encore une fois en lecture arrière, si la taille est trop grande, ou simplement en gardant toutes les lignes en mémoire à la fois).


0 commentaires

0
votes

Si votre fichier n'est pas très volumineux, vous pouvez envisager de transférer d'abord le contenu du fichier dans stringstream ss , d'ajouter votre nouveau contenu devant ss et de le réécrire déposer.


0 commentaires