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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 71
    Points : 36
    Points
    36

    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 71
    Points : 36
    Points
    36

    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
    816
    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 : 816
    Points : 1 792
    Points
    1 792

    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 71
    Points : 36
    Points
    36

    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
    816
    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 : 816
    Points : 1 792
    Points
    1 792

    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 71
    Points : 36
    Points
    36

    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
    816
    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 : 816
    Points : 1 792
    Points
    1 792

    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 71
    Points : 36
    Points
    36

    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

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, 13h22
  2. Petit prob avec l'OLE EXCELL sous builder
    Par vladi dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2005, 20h30
  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, 13h47
  4. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 14h19

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