Comment stocker une très grande variable std::string
Résolu
CatEndal
Messages postés
42
Statut
Membre
-
CatEndal Messages postés 42 Statut Membre -
CatEndal Messages postés 42 Statut Membre -
Bonjour
je suis en train d'essayer de faire un programme de copie automatique avec les fonction de <fstream>, seulement pour copier des grandes lignes, comme un fichier png(ouvert avec un éditeur de texte,), la variable ne stocke rien. alors existe-t-il un moyen d'agrandir la capacité d'une variable ?
merci
je suis en train d'essayer de faire un programme de copie automatique avec les fonction de <fstream>, seulement pour copier des grandes lignes, comme un fichier png(ouvert avec un éditeur de texte,), la variable ne stocke rien. alors existe-t-il un moyen d'agrandir la capacité d'une variable ?
merci
3 réponses
-
string n'a pas de limite normalement...
tu dois avoir un problème dans la lecture plutôt
là sans aucune ligne de code, c'est difficile de t'aider plus -
d'accord, voilà mon code
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void main()
{
string lire;
ifstream copy("F:/copie/copier/index.png");
ofstream colle("F:/copie/coller/index.png");
while (getline(copy, lire))
{
colle << lire << endl;
}
}
et voilà le avant/ après copie du fichier
https://img-19.ccm2.net/A5JPKE1O743ditO2L244XUMb_u8=/b07c9331f8f94f9bb147afb151b2e2ec/ccm-ugc/1Capture.PNG -
'lut, pour copier des données binaires il ne faut jamais utiliser de flux ou fonctions qui agissent sur du texte (je parle bien de texte, pas de
std::string
).
Par défautstd::ifstream
etstd::ofstream
sont ouverts en mode texte, ce qui laisse libre choix à l'implémentation de lastdlibc++
de la plate-forme quant à l'interprétation et la modification à la volée de ce qui est lu et écrit.
Sur Windows, les retours à la ligne CR+LF peuvent être convertis en LF en interne dans certains cas, par exemple.
Maintenant, l'en-tête des PNG est le suivant:{ 0x89, 'P', 'N', 'G', '\r', '\n', 0x1A, '\n' }
Dans cette séquence, le 0x1A est le caractère de fin de fichier de DOS. Lastdlibc++
de Windows arrête de lire les fichiers quand elle rencontre ce caractère en mode texte.
La solution est donc en deux temps:
1. On ouvre les flux en mode binaire:ifstream copy("F:/copie/copier/index.png", std::ios::binary); ofstream colle("F:/copie/coller/index.png", std::ios::binary);
2. On utilise la formule magique™ au lieu destd::getline
:colle << copy.rdbuf();
std::ifstream::rdbuf()
renvoie un pointeur vers l'objet agissant comme source de données, et lesstd::ofstream
savent les lire jusqu'à leur épuisement tout seuls (surcharge n°9), c'est à dire jusqu'à la fin du fichier.
Au passage,using namespace std;
est une mauvaise pratique car elle pollue ton espace de nom (namespace) avec le contenu destd
, ce qui peut poser des problèmes d'ambiguïtés et de conflits de nommage plus tard.