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

Résolu
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

  1. 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
    1. Contributeur
      '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
      1. 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