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 :

lecture d'un fichier *.txt


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut lecture d'un fichier *.txt
    bonjour

    je voudrais un code ou une idée pour extraire des données d'un fichier.
    je m'explique, j'ai un texte délimité par deux mots. et puis ce texte contient un ensemble de variable avec leurs valeurs
    exemple :
    debut
    x="..."
    y="..."
    z="..."
    .
    .
    .
    fin
    deut
    .
    .
    .
    .
    fin
    .
    .
    .
    je veut parcourir ce dossier(*.txt). puis ces différentes parties et afficher dans un MEMO la valeur de X,Y,Z pour chaque partie délimité par un mot de début et mot de fin.

    pouvez vous me donner un coup de main svp ?
    merci.

  2. #2
    Membre habitué Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Points : 181
    Points
    181
    Par défaut
    pour écrire dans un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TFileStream * file = new TFileStream("fichier.txt",fmCreate);
    file->Write(infos.c_str(),500);
    et pour le lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TStringList *Liste = new TStringList;
    Liste->LoadFromFile("fichier.txt");
    Memo->String = Liste;

    voila de tete ça doit être ça (je suis pas sur pour la propriété qui contient du texte dans les memo)


    redis nous
    a+
    /**
    * Author: Tehem
    * Version: 2.0
    */
    Extension Twig pour Symfony 2.1 (Check Defined Constant)
    https://github.com/tehem/TwigConstantExtension

  3. #3
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TStringList  *List = new TStringList();
     
    List->LoadFromFile("fichier.txt");
     
    Memo1->Lines = List ;
     
    delete List;
    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Points : 77
    Points
    77
    Par défaut
    Ne serais t il pas possible d'utiliser les fichier *.ini qui ont une architecture proche de ce que tu nous donne ?
    Auquel cas la faq donne bon nombre de réponse à ce sujet:
    http://cpp.developpez.com/faq/bcb/?page=systemeini
    Normalement si tu scrute ce qui est donné ça devrais ressemblé à cela:
    [Section]
    NomDeClé=Valeur

    [Section2]
    NomDeClé1=Valeur
    NomDeClé2=Valeur
    ...
    donc dans ton cas:
    [Info1]
    x = ...
    y = ...
    z = ...

    [Info2]
    x = ...
    y = ...
    z = ...
    Il me semble que ça correspond à ce que tu cherche.
    Cordialement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    merci pour votre idée qui semble être le début de ma solution, permettez moi de poser une petite question d'approfondissement
    est il possible de créer un fichier *.ini à partir d'un fichier *.txt.
    et puis dans mon fichier j'ai certains composant sous forme d'une d'arborescence ou encore d'objets inclus les un dans les autres. est ce que cette methode peut s'avère bénéfique.

    merci.

  6. #6
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    la meilleur solution serait que tu post un bout de ca fameux fichier tel qu'il devra etre utliser
    une partie du moin, pour qu'on puisse faire quelque test sans a chaque fois avoir a demander des info

    mais d'une part, tu ve afficher des donnée d'un fichier txt dans un memo ... ce qui pe etre fais tres facilement et sans plus que 3 ligne de code ... si tu ve tous afficher

    Mais toi tu ve juste afficher une partie ? ou enlever des lignes ??

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    vous trouveriez dans la PJ qui suit le fichier du quel je veut extraire des données.
    et parmis ce que je veut extraire il y a des champs en chaine de caractères ('...' ) et autres en entiers. mais aussi je veut connaitre quel composant est inclus dans quel composant.

    merci.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Je crois qu'il y a une erreur avec ton fichier joint. Il ne contient pas de donnees que tu as precise, mais le contenu de ta form au format texte.

    Je pense que tu peux aussi utiliser la fonction TStringList. Tu charges ton fichier *.txt dans la TStringList et ensuite tu peux parser ton texte.
    Tu charges ton texte comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TStringList *pSL = new TStringList();
    pSL->LoadFromFile(TonFichier.txt);
    for (int i=0; i < pSL->Count; i++)  {
       //ici tu inseres du code pour analyser toutes tes lignes
       ...  pSL->Strings[i]  ...=>//Contenu de la ligne i de ton fichier txt
    }
    delete pSL;

  9. #9
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Pourquoi pas quelque chose dans ce genre :

    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
     
    AnsiString Filepath;
    AnsiString Filename = "Test.txt";
    TStringList *Fichier = new TStringList;
    int Line;
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Filepath = ExtractFilePath(Application->ExeName);
    }
    //--
     
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    delete Fichier;
    }
    //--
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    Memo1->Lines->Clear();
    AnsiString N = Filepath + Filename;
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        for(Line = 0; Line < Fichier->Count; Line++)
            {
            if(Fichier->Strings[Line] == "Debut");
                {
                ExtractValues();
                }
            }
        }
    }
    Deux méthodes à déclarer dans la classe de la form, en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        void __fastcall ExtractValues();
        void __fastcall ExtractValue(AnsiString N);
    Les deux méthodes :

    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
     
    void __fastcall TForm1::ExtractValues()
    {
    Line++;
    do{
        AnsiString N = Fichier->Strings[Line];
        N = N.UpperCase(); //pour lever l'ambiguité 'x' ou 'Y'
        if(N.Pos("X") != 0)
            {
            ExtractValue(N);
            }
        else
            {
            if(N.Pos("Y") != 0)
                {
                ExtractValue(N);
                }
            else
                {
                if(N.Pos("Z") != 0)
                    {
                    ExtractValue(N);
                    }
                else
                    {
                    if(N.Pos("FIN") != 0)
                        {
                        Line++;
                        return;
                        }
                    }
                }
            }
        Line++;
        } while(Line < Fichier->Count);
    }
     
    //--
     
    void __fastcall TForm1::ExtractValue(AnsiString N)
    {
    int p = N.Pos("=");
    if(p != 0)
        {
        N = N.SubString(p+1, N.Length());
        Memo1->Lines->Add(N.Trim());
        }
    }
    Si le formatage des lignes devait être différent, dans ce cas il faudrait creuser un peu plus !

    A plus !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    merci pour votre réponse,
    et après avoir essayer de mettre en œuvre votre code, j'ai le regréais de vous dire que malgré qu'il n y a pas de fautes de syntaxes le programme qui s'en suit ne m'affiche pas de réponses.

    que dois je faire a votre avis

  11. #11
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Je suis parti du formatage suivant :

    Debut
    x=40
    y=50
    z=70
    Fin
    Debut
    x =40
    y = 50
    z= 70
    Fin
    Debut
    x=40
    y=50
    z=70
    Fin
    Debut
    x=40
    y=50
    z=70
    Fin
    Debut
    x=40
    y=50
    z=70
    Fin

    Donc à toi d'adapter le code, en sachant que tu vas devoir jongler avec les méthodes de la classe AnsiString !

    A plus !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    en fait le problème, c'est que je vois pas ou le l'adresse de mon fichier va être chargée. pour plus de détails, j'ai voulu essayer ce programme avec la même structure que j'ai posté en premier lieux mais rien ne se passe.

    dois je définir des composants particuliers ou encore intergrer une boite de dialogue pour inclure mon fichier. meci

  13. #13
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    au tous début du code du speedbutton il test si le fichier existe et si oui il le charge dans TSrtringList.

    Vérifie pe etre que ton fichier sapelle bien Test.txt

    parceque code posté par henderson fonctionne en géneral


    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    merci beaucoup pour la reponse qui fonctionne impec !!!!

    est il possible de gérer un fichier de la sorte mais ce fichier peut etre changer !!!

    en d'autre terme est il possible de rendre ce programme capable de lire les données d'un manière dynamique d'un fichier qui peut varié !!!
    merci

  15. #15
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Pour ce test, j'ai utilisé un TMemo, pour avoir écho de la modification.
    Sans doute qu'on se limitera, au final, à un TStringList.

    J'ai utilisé :
    - un TEdit (EditObject) pour rechercher le nom d'un objet
    - un TEdit (EditProperty) pour rechercher le nom d'un propriété
    - un TEdit (EditValue) pour modifier la valeur de la propriété
    - un TSpeedButton qui charge le fichier dans Memo1
    - un TSpeedButton pour lancer la modification

    Le fichier est celui que tu as donné.
    Je l'ai mis dans le dossier de ce projet pour tester.

    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
     
    AnsiString Filepath;
    AnsiString Filename = "fichier test.TXT";
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Filepath = ExtractFilePath(Application->ExeName);
    }
    //--
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    AnsiString N = Filepath + Filename;
    if(FileExists(N))
        {
        Memo1->Lines->LoadFromFile(N);
        }
    }
    //--
    void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
    {
    AnsiString N;
    int p;
    for(int j = 0; j < Memo1->Lines->Count; j++)
        {
        N = Memo1->Lines->Strings[j];
        if(N.Pos(EditObject->Text) != 0)
            {
            //On tient l'objet
            for(int i = j + 1; i < Memo1->Lines->Count; i++)
                {
                N = Memo1->Lines->Strings[i];
                //Tester si on est toujours dans le scope de l'objet
                if(N.Pos("object") == 0)
                    {
                    if(N.Pos(EditProperty->Text) != 0)
                        {
                        p = N.Pos("=");
                        if(p != 0)
                            {
                            N = N.SubString(1, p+1);
                            Memo1->Lines->Strings[i] = N + EditValue->Text;
                            return; // la modification est effectuée
                            }
                        }
                    }
                }
            }
        }
    ShowMessage("La modification a échoué");
    }
    A plus !

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

Discussions similaires

  1. lecture d'un fichier txt ligne par ligne
    Par SoBaKa dans le forum Général Python
    Réponses: 4
    Dernier message: 06/03/2007, 12h02
  2. Lecture depuis un fichiers txt
    Par mask91 dans le forum C++
    Réponses: 15
    Dernier message: 04/03/2007, 22h40
  3. Réponses: 4
    Dernier message: 13/11/2006, 22h30
  4. Lecture et ecriture fichier txt
    Par jeanmy dans le forum Delphi
    Réponses: 12
    Dernier message: 07/08/2006, 17h23
  5. [debutant] lecture d'un fichier txt de 10mo
    Par karamazov994 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 19/04/2005, 15h55

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