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 :

fichier txt : tellg() ne me retourne pas de bonnes valeurs


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut fichier txt : tellg() ne me retourne pas de bonnes valeurs
    bonjour,

    Je suis sous WindowsXP et je travaille avec BorlandC++ 6 Professionnal.

    J'ai un sérieux souci avec un fichier texte.

    Plus précisément avec des \n à la position 4096 et 4097 de ce fichier texte. A cause de ces caractères, la fonction tellg() ne me retourne pas de bonnes valeurs.

    Pour être sûr que cela ne venait pas de mon fichier, je génère un fichier txt avec un contenu aléatoire et en imposant un \n lorsque j'arrive au 4096 et 4097 caractères. J'utilise les codes ASCII compris entre 32 (espace) inclus et 127 (supprimer) exclus.

    J'ai mis dans ma fenêtre 1 TStringGrid, un bouton (BtnOuvrir) et un composant OpenDialog (OpenDialog1).


    Code c++ : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    TfFichier *fFichier;
     
    //---------------------------------------------------------------------------
    __fastcall TfFichier::TfFichier(TComponent* Owner)
        : TForm(Owner)
    {
        StringGrid1->ColWidths[0] = 500;
        StringGrid1->ColWidths[1] = 40;
        StringGrid1->ColWidths[2] = 40;
     
        GenereFichier();
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfFichier::BtnQuitterClick(TObject *Sender)
    {
        Close();
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfFichier::GenereFichier()
    {
      int i, n;
      int min, max;
      min = 0;
      max = 127;
     
      srand(time(NULL));
      ofstream Fichier("texte.txt", ios::out);
     
     
      for (n=0; n<5000; n++)
      {
        i = (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
        if (n==4095 || n==4097 || n==4096)
        {
            Fichier<<endl;
        }
        else
        {  
            if (i>=32 && i<127)
            {
                    Fichier<<char(i);
            }
            else
            {
                Fichier<<endl;
            }
        }
     
        //Fichier.flush();
      }
     
      Fichier.close();
     
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfFichier::BtnOuvrir1Click(TObject *Sender)
    {
        AnsiString nom, valeur;
        char buffer[4097];
        int n, i;
        unsigned char data;
     
        if (OpenDialog1->Execute())
        {
            nom = OpenDialog1->FileName;
            this->Repaint();
     
            Label1->Caption = nom;
            StringGrid1->Cols[0]->Clear();
            StringGrid1->Cols[1]->Clear();
            StringGrid1->Cols[2]->Clear();
     
            StringGrid1->RowCount = 2;
     
            ifstream Fichier(nom.c_str());
     
            n = 0;
            i = 1;
            while (!Fichier.eof() && Fichier.good())
            {
     
                Fichier.getline(buffer, sizeof(buffer), '\n');
     
                n = n + strlen(buffer) + 2;
     
                StringGrid1->Cells[0][i] = buffer;
                StringGrid1->Cells[1][i] = IntToStr(n);
                StringGrid1->Cells[2][i] =  IntToStr(Fichier.tellg());
     
     
                i++;
                StringGrid1->RowCount ++;
            }
     
            Fichier.close();
        }
     
    }


    n'oubliez pas d'inclure
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <fstream.h>
    #include <time.h>

    pour la fonction random et pour les ifstream et ofstream.

    ------------------------
    Dans le second RichEdit il y a 2 colonnes de chiffres :
    - le premier chiffre est la somme des longueur des chaines récupérées (j'ai ajouté 2 pour tenir compte du \n en fin de ligne) ;
    - le second chiffre est la valeur retournée par tellg().


    Regardez les 2 colonnes de valeurs dans le RichEdit2 : il y a un écart de 1 au moins jusqu'au 4096ème caractère entre la valeur de gauche et la valeur de droite.

    Si vous faites un fichier plus petit (moins de 4096 caractères dans la fonction GenereFichier), le problème ne se pose plus ou si vous supprimez ce test
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        if (n==4097 || n==4096) // j'impose un retour chariot ici
            Fichier<<endl;
    plus de problème non plus (à moins que la valeur de i soit inférieure à 32 à ce moment).


    Comment je peux corriger ce problème ? Sachant que je dois utiliser ifstream et ofstream.
    à vous


    [edit]
    j'ai modifié le code : j'utilise un TStringGrid au lieu des RichEdit : on peut plus facilement repérer les lignes qui posent problème (les valeurs de tellg() et calculées et le contenu de chaque ligne du fichier se trouvent sur la même ligne du TStringGrid).
    [/edit]

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    après plusieurs tests, je me demande si \n est le seul responsable (problème aléatoire )

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Auteur
    Dans cette ligne je ferais un essai soit de decrementer soit d'incrementer la variable de comptage
    if (n==4097 || n==4096) // j'impose un retour chariot ici
    Fichier<<endl;
    else

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    Citation Envoyé par blondelle Voir le message
    Salut Auteur
    Dans cette ligne je ferais un essai soit de decrementer soit d'incrementer la variable de comptage
    c'est à dire ?

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Si j'ai bien compris tu ne veut soit comptabiliser soit tu ne veut pas comptabiliser les retours chariot quand tu passe dans le teste je pense que tu comptabilise.
    Il est peut etre possible dans un premier temps de mettre un compteur dans le teste pour compter ce que tu recoit et par comparaison tu verra si c'est la source de ton probleme.

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    La fonction genereFichier() impose un retour chariot à un endroit précis du fichier (4096 et 4097).

    Le problème est au moment de la lecture, les valeurs affichées sur une même ligne dans le second RichEdit sont parfois différentes (il faut lancer plusieurs fois le programme).

    Peut-être que le problème est au moment de la génération du fichier, mais où ??

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

Discussions similaires

  1. Fonction SQL IFNULL ne retourne pas la bonne valeur.
    Par Simka1000 dans le forum AS/400
    Réponses: 2
    Dernier message: 15/11/2013, 10h56
  2. getenv ne retourne pas la bonne valeur
    Par xaltar6 dans le forum Langage
    Réponses: 5
    Dernier message: 11/04/2013, 15h35
  3. Execute_query ne retourne pas les bonnes valeurs
    Par complicated dans le forum Forms
    Réponses: 2
    Dernier message: 23/11/2011, 11h12
  4. Méthode qui ne retourne pas la bonne valeur
    Par clubiste1920 dans le forum Débuter avec Java
    Réponses: 15
    Dernier message: 31/03/2011, 17h14
  5. [SQL Server] select max ne retourne pas la bonne valeur
    Par *alexandre* dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/09/2008, 14h49

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