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

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut Ficher avec TStream et Structure c++ builder fmx

    Bonjour,

    Le code ci-dessous avec TStream fonctionne bien.

    Le problème est qu'il affiche les données à la suite sur la ListBox
    Dupont
    Paris
    Martin
    Lille
    et non de cette façon (par enregistrement) :
    Dupont Paris
    Martin Lille
    À moins de faire de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer->WriteLine(personnes.nom + " " + personnes.ville + " " + personnes.num);
    Pas terrible et comment modifier par exemple la variable personnes.ville ou supprimer un enregistrement ?

    Je cherche avec seek. Si vous avez une idée ...

    Merci d'avance.

    Cordialement.

    Exemples Embarcadero :

    http://docwiki.embarcadero.com/CodeE...ample#mw-pages

    StreamAdvancedRdWr
    StreamCharRdWr
    StreamStrRdWr



    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
     
    struct PERSONNE
     {
      AnsiString nom;
      AnsiString ville;
      int num;
     };
     PERSONNE personnes;
     int pos;
     
    void __fastcall TForm2::WriterStructClick(TObject *Sender)
    {
       TStreamWriter* writer;
     
      /* Creation écriture */
    	writer = new TStreamWriter("local.txt", ios::out | ios :: app);   //   ios :: app pour ajouter des enregistrements
     
    	/* ajouter des données */
          personnes.nom = Edit2->Text;
    	  personnes.ville = Edit3->Text;
    	  personnes.num = pos;
    	  pos+=1;
    	writer->WriteLine(personnes.nom);
    	writer->WriteLine(personnes.ville);
    	writer->WriteLine(personnes.num);
     
    	/* fermer */
    	delete writer;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::ReaderStructClick(TObject *Sender)
    {
     ListBox2->Clear();
      TStreamReader* reader;
      /* création lexture */
    	reader = new TStreamReader("local.txt", ios::in);
    	while (reader->Peek() >= 0)
     
     {
       ListBox2->Items->Add(reader->ReadLine());
     }
     
     
     // fermer
      delete reader;
     
    }

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    C'est int personnes.num qui empêchait un affichage correct. Ou alors transformer int en string pour le fichier

    Cette fois, ça marche ...

    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
     
    void __fastcall TForm2::WriterStructClick(TObject *Sender)
    {
       TStreamWriter* writer;
     
      /* Creation écriture */
    	writer = new TStreamWriter("local.txt", ios::out | ios :: app);   //   ios :: app pour ajouter des enregistrements
     
    	/* ajouter des données */
    	  personnes.nom = Edit2->Text;
    	  personnes.ville = Edit3->Text;
    	writer->WriteLine(personnes.nom);
    	writer->WriteLine(personnes.ville);
     
    	/* fermer */
    	delete writer;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::ReaderStructClick(TObject *Sender)
    {
     ListBox2->Clear();
      TStreamReader* reader;
      /* création lexture */
    	reader = new TStreamReader("local.txt", ios::in);
    	while (reader->Peek() >= 0)
     
     {
       personnes.nom = reader->ReadLine();
       personnes.ville = reader->ReadLine();
       ListBox2->Items->Add(personnes.nom +"  "+ personnes.ville);
     }
     
     
     // fermer
      delete reader;
     
    }

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 833
    Points : 1 813
    Points
    1 813

    Par défaut

    Salut
    tu ne peux pas employer un Type structuré pour ce genre d'opération
    une structure a toujours une taille fixe
    la solution simple est d'utiliser soit un format XML
    soit une structure du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct PERSONNE
     {
      char nom[80];
      char ville[50];
      int num;
     };
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    Salut et merci

    Je ne me suis pas encore penché sur le XML avec builder.

    Avec les char, j'ai comme erreur "Addition de pointeur incorrecte"
    sur ces lignes :

    personnes.nom = Edit2->Text;
    personnes.ville = Edit3->Text;
    personnes.nom = reader->ReadLine();
    personnes.ville = reader->ReadLine();

    Je peux limiter les string avec Edit2->MaxLength = 30;

    Par contre, j'ai converti pos en chaîne et ça marche.

    Je vais chercher comment supprimer et modifier un enregistrement. J'aurai peut-être besoin de ton aide.

    Cordialement

    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
     
    void __fastcall TForm2::WriterStructClick(TObject *Sender)
    {
      AnsiString possup;
     
      Edit2->MaxLength = 30;
      Edit3->MaxLength = 30;
     
       TStreamWriter* writer;
     
      /* Creation écriture */
    	writer = new TStreamWriter("local.txt", ios::out | ios :: app);   //   ios :: app pour ajouter des enregistrements
     
    	/* ajouter des données */
              personnes.nom = Edit2->Text;
    	  personnes.ville = Edit3->Text;
    	  possup = IntToStr(pos); // convertit pos en chaîne
    	  personnes.num = possup;
    	  pos+=1;
     
    	writer->WriteLine(personnes.nom);
    	writer->WriteLine(personnes.ville);
    	writer->WriteLine(personnes.num);
     
    	/* fermer */
    	delete writer;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::ReaderStructClick(TObject *Sender)
    {
     ListBox2->Clear();
      TStreamReader* reader;
      /* création lexture */
    	reader = new TStreamReader("local.txt", ios::in);
    	while (reader->Peek() >= 0)
     
     {
       personnes.nom = reader->ReadLine();
       personnes.ville = reader->ReadLine();
       personnes.num = reader->ReadLine();
       ListBox2->Items->Add(personnes.nom +"  "+ personnes.ville +"  " + personnes.num);
     }
     
     
     // fermer
      delete reader;
     
    }

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 833
    Points : 1 813
    Points
    1 813

    Par défaut

    Salut
    ci joint un exemple de base de données en format XML
    tu pourra voir ainsi la méthode utilisée.
    je te joins également un lien vers le tutoriel correspondant en anglais
    http://www.festra.com/cb/xmldb01.htm
    http://www.festra.com/cb/xmldb02.htm
    cordialement
    Fichiers attachés Fichiers attachés
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    Salut et merci.

    Notamment pour le fichier zip.

    J'essaye de trouver un exemple simple : le classique répertoire pour comprendre le mécanisme des fichiers c++ builder.

    Enregistrer nouveau nom
    Modifier un enregistrement (avec un choix dans un ListBox par exemple)
    Supprimer un enregistrement

    Pour ensuite réécrire le fichier si suppression

    Je ne trouve rien à ce sujet sur le net. Ou alors un exemple comme ci-dessous qui cherche des entiers et non les enregistrements (nom, ville ...)

    J'ai deux livres c++ de Claude Delannoy, idem.

    Cordialement

    En c++ builder (aide embarcadero)

    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
     
    void __fastcall TForm2::SeekClick(TObject *Sender)
    {
     
    	TStreamReader* reader;
    	TCharArray buffer;
     
    	/* Create a reader */
    	reader = new TStreamReader("local.txt");
     
    	/* Prepare a buffer */
    	 buffer.set_length(8);
     
    	/* Read first 5 characters */
    	if (reader->ReadBlock(buffer, 0, buffer.Length) < buffer.Length)
    		ShowMessage("ok");
     
     
    	/* And now, seek the stream back by 5 characters */
    	int byteCount = reader->CurrentEncoding->GetByteCount(buffer);
    	reader->BaseStream->Seek(-1 * byteCount, soFromCurrent);
     
    	 personnes.nom = reader->ReadLine();
    	 Edit3->Text = personnes.nom;
    	 Edit2->Text = buffer.get_length();
     
    	/* Efface toutes les données mises en mémoire tampon.  */
    	reader->DiscardBufferedData();
     
    	delete reader;
    }

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 833
    Points : 1 813
    Points
    1 813

    Par défaut

    Salut
    pourquoi réinventer la roue !!
    La solution la plus simple est une base de donnée sous fichier texte tel que donnée
    dans le site fourni tu trouvera de nombreux exemples pour résoudre simplement ton problème.
    en utilisant au départ une TStringList, Une classe maison pour les données que tu veux utiliser, la validation des données,la lecture et l'écriture sur le disque, pour finir par un composant très puissant de la VCL TDataSet.
    Lis et utilise ces différents tutoriaux et tu deviendras un crack dans ce domaine.

    toujours cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    Salut

    Je partage ton point de vue.

    C'est vrai que builder fournit des outils puissants.

    Je me focalise trop sur la programmation"classique"

    Bien cordialement

  9. #9
    Membre averti
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 179
    Points : 376
    Points
    376

    Par défaut

    L'utilisation de XML à partir d'une base Delphi est cohérent. En général les outils issus de Delphi ont l'avantage d'une très grande simplicité d'utilisation tout en étant robustes.
    Mais n'hésitez pas non plus à découvrir progressivement les autres aspects "pur C++" qui pourront vous être fort utiles voir indispensables à l'avenir, tout l'arsenal de la STL notamment.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    Tout à fait yvsmls.
    J'ai deux livres pas mal de Claude Delannoy : Programmer en langage C++ et Exercices en langage C++
    Je trouve qu'il est plus facile d'étudier sur un livre qu'un écran.
    Contrairement à Delphi (il y a plusieurs années), je n'ai pas trouvé de bouquins sur Builder et fmx.
    Cordialement

  11. #11
    Membre averti
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 179
    Points : 376
    Points
    376

    Par défaut

    Il y a eu des livres sur Builder à la fin des années 90, notamment celui de Gérard Leblanc, aujourd'hui évidemment épuisé et qui ne serait de toute façon plus d'actualité.
    Il y a encore de très bonnes ressources sur developpez.com dont celles de DjmSoftware.
    En règle générale il y a une forte diminution des livres en informatique concurrencés par les formations en ligne, les tutos YouTube de qualités très inégales.
    C'est dommage car l'apprentissage à partir d'un livre est plus long mais beaucoup plus efficient, profond et pérenne.
    C++ à la réputation d'être difficile et dangereux, ce n'est qu'en partie vrai, car bien enseigné de façon pédagogique c'est une excellente école permettant d'acquérir une très bonne capacité d’adaptation.
    Builder est de ce point de vue une excellente solution : entre Delphi et C++ il prend le meilleurs des deux mondes en permettant un apprentissage en douceur.
    Très peu connu et utilisé en France, on peu espérer que la version communautaire gratuite va contribuer à son développement, notamment dans l'enseignement et les milieux universitaires.
    Il faut dire aussi qu'Embarcadero traverse une passe difficile en ce moment avec Builder, sans doute du fait de problèmes de compatibilités avec les nouvelles version C++17 et CLANG.
    On peut espérer que tout rentre dans l'ordre dans les semaines qui viennent.

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 79
    Points : 43
    Points
    43

    Par défaut

    Merci yvslms pour vos renseignements. Cordialement

Discussions similaires

  1. Probleme avec les composant socket de builder
    Par lol733 dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/10/2006, 12h22
  2. Petit prob avec l'OLE EXCELL sous builder
    Par vladi dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2005, 19h30
  3. Problème avec GLUT sous borland c++ builder X
    Par hiko-seijuro dans le forum GLUT
    Réponses: 1
    Dernier message: 04/11/2004, 12h47
  4. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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