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

C++Builder Discussion :

Enregistrer dans un fichier à la suite


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut Enregistrer dans un fichier à la suite
    Bonjour à tous

    J'essaye d'enregistrer dans un fichier texte un tableau de données qui contient un très grand nombre de lignes.

    J'utilise un Memo dans lequel j'ajoute mes lignes puis j'utilise SaveToFile pour l'enregistrer.

    au moment du SaveTofile j'ai un out of memory qui se produit.

    J'ai diminué le nombre de ligne pour voir et cela fonctionne.

    J'aimerais donc savoir comment faire pour pouvoir enregistrer mon fichier en plusieurs fois pour ainsi éviter le out of mémory.

    J'ai également essayé avec un TStringList mais le problème est le même

    Merci d'avance pour votre aide

  2. #2
    Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Points : 46
    Points
    46
    Par défaut
    Le problème de mémoire vient je pense parce que tu copies toutes les valeurs de ton tableau dans ton mémo.
    C'est pourquoi je te propose cette solution. Segmenter la lecture de ton tableau et supprimer les informations de ton TMemo ou de ton tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    TMemo* monMemo
    int ligneLu = 0;
    int ligneTotal = <nombre de ligne de ton tableau>
    int ligneParLoop = <défini par l'utilisateur>
    UnicodeString maLigne;
     
    /**ici pour libérer le tmemo**/
    while(ligneLu !=ligneTotal){
        for(int numCol=0; numCol != <nombre de colonne de ton tableau>; numCol++){
                  maLigne += <colonne de ton tableau selon la ligne>
                  numCol++;
         }
         monMemo->Lines->Add(maLigne);
         maLigne = "";
     
         ligneLu++;
         if(ligneLu % ligneParLoop == 0){
              monMemo->Lines->SaveToFile(<nom fichier>);
              monMemo->Clear();
        }
    }
     
    /**pour libérer le tableau**/
    while(ligneLu !=ligneTotal){
        for(int numCol=0; numCol != <nombre de colonne de ton tableau>; numCol++){
                  maLigne += <colonne de ton tableau selon la ligne>
                  <retirer valeur de ton tableau>
                  numCol++;
         }
         monMemo->Lines->Add(maLigne);
         maLigne = "";   
         ligneLu++;
    }
    monMemo->SaveToFile(<nom fichier>);

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci pour ta réponse Maliono

    Le problème vient pas lors du remplissage du Memo car il se remplit très bien avec toutes les lignes
    c'est le SavetoFile qui me fait un out of memory.

    Je viens d'essayé de segmenter comme tu m'a proposé mais j'ai peur que le SavetoFile écrase ce qu'il existe déjà au lieu d'enregistrer à la suite

  4. #4
    Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Points : 46
    Points
    46
    Par défaut
    Je ne sais pas comment SaveToFile fonctionne. Peut être qu'il n'est pas le réel fautif et qu'en réalité tu es au limite de ta mémoire. Tu peux surveiller la mémoire de ton programme grâce à Process Explorer si jamais.

    J'ignorais que SaveToFile écraisait le contenu du fichier. Tu peux toujours utiliser http://www.cplusplus.com/reference/fstream/ofstream/, tu devras juste préciser à l'ouverture d'aller en fin de fichier (append).

    En segmentant et en supprimant les données dupliqués tu ne devrais normalement plus avoir de problème.

  5. #5
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Citation Envoyé par kurul1 Voir le message
    au moment du SaveTofile j'ai un out of memory qui se produit.
    Cela me surprends.
    Avant de partir dans des segmentations d'écriture de fichiers, il faut être sûr que le problème vienne bien de là.

    Je te conseille d'insérer un bout de code dans ce genre-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    TStrings& lignes = *(MonMemo->Lines);
     
    size_t limite = 0;
    try {
        while(true) {
            char* test = new char[1024*1024*limite];
            delete test;
            ++limite;
        }
    } catch(std::bad_alloc& e) {
        int dummy = 0;
        // Mets un point d'arrêt ici et regarde la valeur de limite.
        // Si cette dernière est grande, ça signifie que le problème vient bien de SaveToFile.
        // Si elle est petite, le problème est en amont.
    }
     
    lignes.SaveToFile(cheminFichier);
    Citation Envoyé par Maliono Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        for(int numCol=0; numCol != <nombre de colonne de ton tableau>; numCol++){
                  maLigne += <colonne de ton tableau selon la ligne>
                  numCol++;
         }
    [...]
        for(int numCol=0; numCol != <nombre de colonne de ton tableau>; numCol++){
                  maLigne += <colonne de ton tableau selon la ligne>
                  <retirer valeur de ton tableau>
                  numCol++;
         }
    Erreur d'étourderie : à chaque fois, tu écris deux fois numCol++.

    Citation Envoyé par Maliono Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         if(ligneLu % ligneParLoop == 0){
              monMemo->Lines->SaveToFile(<nom fichier>);
              monMemo->Clear();
        }
    Comme le craint kurul1, SaveToFile n'ajoute pas à la fin du fichier mais écrase le contenu initial du fichier.

    Citation Envoyé par Maliono Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monMemo->SaveToFile(<nom fichier>);
    Erreur d'étourderie : monMemo->Lines->SaveToFile

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Pour savoir d’où venait le problème, j'ai justement mis un point d’arrêt avec un message juste entre la fin du remplissage du Memo et le SaveToFile et j'ai bien mon message qui s'affiche. dès que je clique sur le Ok de mon message pour passer à la ligne SaveToFile, le out of memory survient.

    C'est pourquoi j'ai testé en limitant le Nombre de ligne de mon Memo et en ne les traitant pas toutes les lignes de mon tableau et là cela passe.

    Donc pour moi il semblerait que ce soit le SaveToFile qui supporte pas mon nombre de ligne (sur ce fichier que je traite j'ai 281083 lignes).

  7. #7
    Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Points : 46
    Points
    46
    Par défaut
    Oui j'ai fais des erreurs mais c'était pour donné l'idée générale de l'algo :p
    et 280 000 c'est pas tant que ça tu sais ^^, après cela dépend de combien de caractères est composé en moyenne les lignes.

  8. #8
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Bon alors j'ai finalement opté pour une méthode à l'ancienne et cela fonctionne avec ces bon vieux fopen, fprintf et fclose.

    Je pensais que j'arriverais avec des méthodes plus récentes mais comme quoi l'ancien ça fonctionne toujours.

    Merci pour votre aide en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2005, 18h03
  2. comment ne pas enregistrer dans le fichier log?
    Par trotters213 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 21/03/2005, 14h56
  3. [LG]Enregistrements dans un fichier
    Par ticoude dans le forum Langage
    Réponses: 1
    Dernier message: 26/11/2004, 18h33
  4. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 00h59
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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