IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

extraction d'un gros fichier ifstream::getline


Sujet :

SL & STL C++

  1. #1
    Invité4
    Invité(e)
    Par défaut extraction d'un gros fichier ifstream::getline
    Bonjour,
    j'ai un fichier de 100Mo qui contient le nom d'un fichier, un retour à l ligne, son contenu en base64, etc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    image1.jpg
    aAbgkjasjshka(contenu base64 très long)
    image2.jpg
    hjsgjgasjha(contenu base64 très long
    etc
    Je cherche à extraire le contenu base64 d'un fichier en fonction de son nom, mais sans extraire chaque contenu à chaque fois, vu que c'est volumineux.

    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while ( fichier.getline(Buffer, 20)) // 20 est petit, car on ne cherche que des noms de fichiers donc 20 est assez grand et il ne lira pas les immenses paquets de données des contenus
    {
                    if (strcmp(Buffer, Fichier_cherche.c_str()) == 0)
                    {
                            char Buffer2[17Mo x 1024Ko x 1024 O]; // 17Mo afin de pouvoir mettre tout le fichier
                            fichier.getline(Buffer2, 17Mo x 1024Ko x 1024 O);
                            return Buffer2;
                     }
    Mais la boucle s'arrête après avoir testé la première et la seconde ligne.
    Savez-vous ce qui se passe ?

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Tu exploses ta pile ! De mémoire, elle est de 1 Mo par défaut.
    Tu as 2 solutions:
    1/ Pas propre: augmenter la taille de ta pile dans les options de link -> danger: le jour où ton tableau grandit, il faut recommencer l'opération!
    2/ Tu remplace l'allocation de Buffer2 sur la pile par une allocation sur le tas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ( fichier.getline(Buffer, 20)) // 20 est petit, car on ne cherche que des noms de fichiers donc 20 est assez grand et il ne lira pas les immenses paquets de données des contenus
    {
                    if (strcmp(Buffer, Fichier_cherche.c_str()) == 0)
                    {
                            unsigned char *Buffer2(new unsigned char[17Mo x 1024Ko x 1024 O]); // 17Mo afin de pouvoir mettre tout le fichier
                            fichier.getline(Buffer2, 17Mo x 1024Ko x 1024 O);
                            return Buffer2;// attention à bien libérer Buffer2 : delete []
                     }
    Ou mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ( fichier.getline(Buffer, 20)) // 20 est petit, car on ne cherche que des noms de fichiers donc 20 est assez grand et il ne lira pas les immenses paquets de données des contenus
    {
                    if (strcmp(Buffer, Fichier_cherche.c_str()) == 0)
                    {
                            boost::shared_array <unsigned char>Buffer2(new unsigned char[17Mo x 1024Ko x 1024 O]); // 17Mo afin de pouvoir mettre tout le fichier
                            fichier.getline(*Buffer2, 17Mo x 1024Ko x 1024 O);
                            return Buffer2;// attention à bien libérer Buffer2 : delete []
                     }
    [EDIT]: j'ai pas rajouté la gestion de l'échec de l'allocation. A faire pour avoir un code vraiment correct.

  3. #3
    Invité4
    Invité(e)
    Par défaut
    ok, merci bien

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par Eldacar Voir le message
    Je cherche à extraire le contenu base64 d'un fichier en fonction de son nom, mais sans extraire chaque contenu à chaque fois, vu que c'est volumineux.
    Si tu connais la taille des contenus tu peux les sauter avec la fonction seekg(), sinon pas possible il faut d'une manière ou d'une autre tout lire jusqu'au nom de fichier recherché.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Par contre, ce que ton code veut faire n'est pas cohérent avec ce que tu veux faire. Tu lis 17Mo à chaque fois? Tes fichiers sont de tailles fixes? Sinon, comment détermines-tu la fin de l'encodage en base64 (en particulier lorsqu'il n'y a pas de padding avec ==)?

  6. #6
    Invité4
    Invité(e)
    Par défaut
    J'ai fini par résoudre mon problème différemment.
    Comme vous me l'avez dit, j'ai vu que ça fonctionnait mal.
    J'ai donc modifié le programme qui génère l'archive.
    Il génère un fichier à côté qui contient l'emplacement et la taille de chaque sous fichier en base64 dans l'archive.
    Ainsi, j'y vais avec seekg.

    Merci bien

Discussions similaires

  1. Problème d'extraction d'un gros fichier 7z
    Par bbkenny dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 27/11/2013, 20h48
  2. [Joomla!] Extraction de gros fichier
    Par Marco la baraque dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 02/12/2008, 11h11
  3. [JDOM] Gestion "gros fichiers"
    Par Haazheel dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 17/10/2003, 13h42
  4. Un langage pour lire, traiter et écrire de gros fichiers
    Par March' dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/04/2003, 15h26
  5. XML DOM et gros fichiers
    Par Manu_Just dans le forum APIs
    Réponses: 4
    Dernier message: 28/03/2003, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo