Comment stocker une très grande variable std::string

Résolu/Fermé
CatEndal
Messages postés
39
Date d'inscription
samedi 25 mars 2017
Statut
Membre
Dernière intervention
3 mai 2018
- 10 août 2017 à 18:26
CatEndal
Messages postés
39
Date d'inscription
samedi 25 mars 2017
Statut
Membre
Dernière intervention
3 mai 2018
- 11 août 2017 à 17:47
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

3 réponses

Pruno57
Messages postés
3
Date d'inscription
jeudi 10 août 2017
Statut
Membre
Dernière intervention
11 août 2017

10 août 2017 à 19:42
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
0
CatEndal
Messages postés
39
Date d'inscription
samedi 25 mars 2017
Statut
Membre
Dernière intervention
3 mai 2018

10 août 2017 à 20:26
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
0
ElementW
Messages postés
4764
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 300
11 août 2017 à 00:17
'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éfaut
std::ifstream
et
std::ofstream
sont ouverts en mode texte, ce qui laisse libre choix à l'implémentation de la
stdlibc++
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. La
stdlibc++
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 de
std::getline
:
colle << copy.rdbuf();

std::ifstream::rdbuf()
renvoie un pointeur vers l'objet agissant comme source de données, et les
std::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 de
std
, ce qui peut poser des problèmes d'ambiguïtés et de conflits de nommage plus tard.
0
CatEndal
Messages postés
39
Date d'inscription
samedi 25 mars 2017
Statut
Membre
Dernière intervention
3 mai 2018

11 août 2017 à 17:47
Super, ça marche, merci
et pour le
 using namespace std; 
je sais que cela peut poser des problèmes de conflits, mais je ne l'utilise que dans des programmes relativement simples comme celui ci
0