Comment stocker une très grande variable std::string [Résolu]

CatEndal 30 Messages postés samedi 25 mars 2017Date d'inscription 29 août 2017 Dernière intervention - 10 août 2017 à 18:26 - Dernière réponse : CatEndal 30 Messages postés samedi 25 mars 2017Date d'inscription 29 août 2017 Dernière intervention
- 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
Afficher la suite 
30Messages postés samedi 25 mars 2017Date d'inscription 29 août 2017 Dernière intervention

4 réponses

Répondre au sujet
Pruno57 3 Messages postés jeudi 10 août 2017Date d'inscription 11 août 2017 Dernière intervention - 10 août 2017 à 19:42
0
Utile
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
Commenter la réponse de Pruno57
CatEndal 30 Messages postés samedi 25 mars 2017Date d'inscription 29 août 2017 Dernière intervention - 10 août 2017 à 20:26
0
Utile
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

http://img-19.ccm2.net/A5JPKE1O743ditO2L244XUMb_u8=/b07c9331f8f94f9bb147afb151b2e2ec/ccm-ugc/1Capture.PNG
Commenter la réponse de CatEndal
ElementW 4652 Messages postés dimanche 12 juin 2011Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention - 11 août 2017 à 00:17
0
Utile
1
'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.
CatEndal 30 Messages postés samedi 25 mars 2017Date d'inscription 29 août 2017 Dernière intervention - 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
Commenter la réponse de ElementW