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 :

lire un fichiers texte


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut lire un fichiers texte
    Je veux lire un fichier texte et afficher par exemple le premiers élément dans un édit pour voir si il a bien lit le fichier ou pas car il existe pas de consol dans builder C++

    Alors voila mon code dans le en clique de bouton

    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int vect[6];
    TStringList *L;
    L=new TStringList();
    if (FileExists("C:\Users\ACER\Desktop\Projet\test.txt"))
    {
    L->LoadFromFile("C:\Users\ACER\Desktop\Projet\test.txt");
    for(int i=0; i<2; i++)
    vect[i]=StrToInt(L->Strings[i]);
    }
     
    Edit1->Text= vect[1];
     
    }
    Mai après l’exécution il affiche 0 dans l’édit et non la valeur d’édit !! Aider moi SVP

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    le probleme aiter dans le chemain ( \\ ) le probleme maitenant que j'ai des donner de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    4.150454e+000
    4.446479e+000
    2.200351e+000
    1.861601e-001
    3.909361e+000
    2.755779e+000
    4.132143e+000
    et il veux pas les lir avec le meme code

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    double vect[600];
    TStringList *L;
    L=new TStringList();
    vect[1]=123;
    if (FileExists("C:\\Users\\ACER\\Desktop\\Projet\\C3.txt"))
    {
    L->LoadFromFile("C:\\Users\\ACER\\Desktop\\Projet\\C3.txt");
    for(int i=0; i<2; i++)
    vect[i]=StrToInt(L->Strings[i]);
    }
     
    Edit1->Text= vect[1]; // affichez dans un edit
     
     
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    La fonction de conversion que tu appelles, StrToInt(), convertit une chaîne (Str) en entier (Int). Si tu veux convertir des nombres réels, il va te falloir quelque chose comme StrToFloat()

    Francois

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Par exemple :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    TStringList *Fichier;
    AnsiString Filepath;
    AnsiString Filename = "Test.TXT";
    //Un tableau dynamique
    int NbValeurs;
    double *Valeurs=NULL;
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Filepath = ExtractFilePath(Application->ExeName);
    Fichier = new TStringList;
    }
     
    //-- rajouter la déclaration du destructeur dans la classe
    __fastcall TForm1::~TForm1()
    {
    delete Fichier;
    if(Valeurs != NULL) delete [] Valeurs;
    }
     
    //--
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    int p, j;
    char d = DecimalSeparator;
    DecimalSeparator = '.';
     
    AnsiString N = Filepath + Filename;
     
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        NbValeurs = Fichier->Count;
        if(NbValeurs == 0)
            {
            ShowMessage("Le fichier est vide");
            }
        else
            {
            if(Valeurs != NULL) delete [] Valeurs;
            Valeurs = new double[NbValeurs];
            for(j = 0; j < NbValeurs; j++)
                {
                N = Fichier->Strings[j];
                p = N.Pos(",");
                if(p != 0) N[p] = DecimalSeparator;
                Valeurs[j] = N.ToDouble();
                }
            }
        }
    else
        {
        ShowMessage("Le fichier est introuvable");
        }
    DecimalSeparator = d;
    }

    Si par contre la conversion ToDouble devait générer une exception, dans ce cas il faudrait gérer avec un try... (cas où le fichier est tout... sauf ce que l'on en attend).

    A plus !

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    pour faire des traitement sur des donner par exemple cherches leur moyenne es que je utilise les chiffre avec la virgule (x,xx) ou avec le point (x.xxx ) ??

    J’utilise Valeurs ? , et comment je peut prendre que 4 valeur après la virgule ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Le problème du séparateur décimal est ici résolu (indifféremment : '.' ou ',') testé avec :

    4,150454e+000
    4,446479e+000
    2,200351e+000
    1.861601e-001
    3,909361e+000
    2,755779e+000
    4,132143e+000
    4.476479e-001
    4.150501e+000
    Personnellement, je préfère utiliser un tableau dynamique parce que plus souple qu'un tableau prédéfini (cas où le tableau serait trop petit par rapport au fichier) !
    Sa création et sa destruction ne posent aucun problème particulier !
    A ce stade, les doubles y sont stockés prêts à être exploités (le séparateur décimal n'intervient qu'au niveau des Ansistring) !

    Le résultat peut être tronqué à l'affichage (sans toucher à la valeur elle-même), voir l'aide : AnsiString::FormatFloat.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    double sum =0.0;
    for(j=0; j < NbValeurs; j++)
        {
        sum+=Valeurs[j];
        }
    sum = sum / NbValeurs;
    Label1->Caption = FloatToStr(sum);
    Label2->Caption = FormatFloat("#,##0.000", sum);
    A plus !

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    j'ai un autre programme , alors voila je veux lire un fichiers text qui contient 469011 valeurs et quant je veux affichers la valeurs 50000 il arrive pas je comprant pas pourquoit :

    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
    36
    37
    38
    39
    40
    41
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int p, j;
    char d = DecimalSeparator;
    DecimalSeparator = '.';
     
    AnsiString N = Filepath + Filename;
     
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        NbValeurs = Fichier->Count;
           ShowMessage(NbValeurs);
        if(NbValeurs == 0)
            {
            ShowMessage("Le fichier est vide");
            }
        else
            {
            if(Valeurs != NULL) delete [] Valeurs;
            Valeurs = new double[NbValeurs];
            for(j = 0; j <NbValeurs; j++)
                {
                N = Fichier->Strings[j];
                p = N.Pos(",");
                if(p != 0) N[p] = DecimalSeparator;
                Valeurs[j] = N.ToDouble();
     
     
                }
            }
             ShowMessage(Valeurs[3]);
        }
     
    else
        {
        ShowMessage("Le fichier est introuvable");
        }
     
     
    }
    il me dit **** NAN n'est pas une valeurs en virgule flottante correct *** et je suis sur que mon fichiers ne contient ne contient pas des NAN

    alors je fait quoit pour qu'il puise me lire tout le fichiers !! et jai remarqué quant je remplace la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j = 0; j <NbValeurs; j++
    ) par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j = 0; j <50000; j++)
    ça marche et si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j = 0; j <60000; j++)
    c'a marche pas

    je veux une solution a ça svp il lit pas tout le fichiers et je comprant pas pourquoit

  8. #8
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Première question, est que tu es certain que NbValeurs est égal à 50000?

    Deuxième question, est-ce que ton fichier se termine par une ligne vide?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    S@lut,

    Essayes de vérifier la fin de ton fichier texte, s'il y a une ligne vide ou pas (pointes toi juste après la denière valeur et tapes le bouton Suppr afin de suprimer éventuellement une ligne en plus).

    Sinon essayes:

    Valeurs[j] = (N.Trim()).ToDouble();

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    j'ai esseyé avec

    (N.Trim()) mai c'a donne toujour rien je ne c'est plus quoit faire

    normalement NBvaleur == 490011 valeur

  11. #11
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Remplace ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Valeurs[j] = N.ToDouble();
    Par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                try
                {
                    Valeurs[j] = N.ToDouble();
                }
                catch(EConvertError &E)
                {
                    //ShowMessage("Problème lors de la transformation en double à ligne " + String(j) + ".");
                    //Valeurs[j] = 0.0;
                }
    Dans le catch j'ai mis en commentaire deux lignes. Tu peux choisir de rien faire, comme c'est le cas avec les deux commentaires. Ou sinon mettre un message en décommentant la première ligne, ou sinon la seconde pour avoir une valeur de 0.0 quand il y a une erreur. Tout dépend de ce que tu veux faire.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    La première tâche utile aurait été d'étudier un formatage de fichier de manière à y stocker les doubles directement et non pas sous une forme littérale.
    On y gagnait trois octets par valeur stockée et un temps non négligeable pris par les conversions (double --> littéral --> double).

    A plus !

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    ça bloque toujour je comprant pas ou est le probleme quant je fait la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for(j = 0; j<NbValeurs ; j++)
    Il arrive meme pas a maficher la 3eme Valeur, je comprant pas !! aider moi svp a pouvoir lire tout les donner de 1 jusqua 469011 voila mon code

    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
    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
    int NbValeurs;
    double *Valeurs=NULL;
     
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Filepath = ExtractFilePath(Application->ExeName);
    Fichier = new TStringList;
     
    }
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int p, j;
    char d = DecimalSeparator;
    DecimalSeparator = '.';
    // ******************************** Charger le Signal C3 ***********************
    AnsiString N = Filepath + Filename;
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        NbValeurs = Fichier->Count;
           ShowMessage(NbValeurs);
        if(NbValeurs == 0)
            {
            ShowMessage("Le fichier est vide");
            }
        else
            {
            if(Valeurs != NULL) delete [] Valeurs;
            Valeurs = new double[NbValeurs];
            for(j = 0; j<NbValeurs ; j++)
                {
                N = Fichier->Strings[j];
                p = N.Pos(",");
                if(p != 0) N[p] = DecimalSeparator;
                //Valeurs[j] = N.ToDouble();
                  try
                {
                    Valeurs[j] = N.ToDouble();
                }
                catch(EConvertError &E)
                {
                    ShowMessage("Problème lors de la transformation en double à ligne " + String(j) + ".");
                    //Valeurs[j] = 0.0;
                }
     
                }
            }
             ShowMessage(Valeurs[3]);
        }
    else
        {
        ShowMessage("Le fichier est introuvable");
        }
    // ----------- dessiner le signal dans un graphe
    //effacer le dessin precedent
    this->Series1->Clear();
    //nouveau dessin
    for(int i=0; i <NbValeurs  ; i++)
    this->Series1->Add(Valeurs[i] ,"");
     
    }
    ça bloque il arrive meme pas a afficher la 3 eme élément dans showmessage

  14. #14
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Regarde le message qui dit la ligne où il y a le problème. Et paste ici les 5 lignes en haut et les 5 lignes en bas. C'est juste pour pas avoir à mettre tout le fichier de 469011 valeurs.

    Sans ton fichier texte, on ne peut pas continuer à t'aider, du moins sa va être compliqué.

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    ok alors voila mon fichiers text contoen plus de 4 MO alors je le fait joindre dans ce lien , mon fichiers texte ce trouve ICI :

    http://www.megaupload.com/?d=W0OZNHBN


    Mon code et afficher dans les message precedant et ça bloque dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valeurs[j] = N.ToDouble();
    mai je comprant pas ou est le probleme , je suis bloqué !! Aider moi svp

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    C est normal ton fichier contient des valeurs NAN
    Faut traiter ce cas , si tu executes ton programme compilé sans c++builder de lancer , il te dirait "prob de transformation ..." , en mode debug çà plante c est vrai

    Pourquoi pas un petit if ( machin != "NAN") { blablabla ;} ?

  17. #17
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Citation Envoyé par kheira Voir le message
    il me dit **** NAN n'est pas une valeurs en virgule flottante correct *** et je suis sur que mon fichiers ne contient ne contient pas des NAN
    Pourtant dans ton fichier, il y en a:
    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
    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
    103
    104
    -4.322344
    -3.809524
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    -5.567766
    -7.252747
    Exactement où mon message l'avait dit: "Problème lors de la transformation en double à ligne 52251."

    Je pense que tu n'as pas de problème de programmation, mais plutôt un problème de lecture.

  18. #18
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    attent je comprant pas !!! le fichiers C3 ne contient pas des NaN ... alors comment ta trouver c'est NAN

    si tu ouvre le fichiers normalement tu trouvera des nombre et non des NaN

    alors je vois pas ou ta trouver c'est NaN

    explique moi SVP

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    j'ai lut le fichiers avec matlab il contien pas des NaN alors je comprant rien !!

    ya pas une solution a mon probleme !!

  20. #20
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Ouvre ton fichier dans un éditeur texte. De mon coté j'utilise UltraEdit.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2005, 15h57
  2. [Applet] lire un fichier texte
    Par lebesnec dans le forum Applets
    Réponses: 2
    Dernier message: 07/07/2005, 10h09
  3. Réponses: 1
    Dernier message: 24/11/2004, 16h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 15h22
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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