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

Delphi Discussion :

lecture/écriture dans un fichier texte


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut lecture/écriture dans un fichier texte
    Salut les amis,
    Je souhaite lire & écrit dans un fichier texte. Mias là où je suis un peu perdu est que 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
    Procedure Enregistre;
    begin
        Table[NE].N:=Form1.EditNom.Text;
        Table[NE].P:=Form1.EditPrenoms.Text;
        Table[NE].DTN:=Form1.EditDtNaiss.Text;
        Table[NE].L:=Form1.EditLieu.Text;
        Chr(13);
    end;
     
    procedure TForm1.QuitterClick(Sender: TObject);
    begin
       if
       (EditNom.Text+EditPrenoms.Text+EditDtNaiss.Text<>'')
        then   Enregistre;
              Rewrite(F);
              For I:=1 to NbEnr do
              Write(F,Table[I]);
              CloseFile(F);
          Application.Terminate;
     
    end;
    suivant écrit mais pas comme je le souhaite dans mon fichier. Je voudrais avoir mes données sur plusieurs lignes de cette manière;
    nom, prénoms, date de naissance, lieu de laissance
    nom, prénoms, date de naissance, lieu de laissance
    etc..
    mais au conntraire mon programme les a écrit au kilométrique

    Voici mon code pour la lecture :
    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
    procedure TForm1.FormActivate(Sender: TObject);
    begin
          Adresse.Clear;
          AssignFile(F,'C:\Badges.txt');
          {$I-}
          Reset(F);
          {$I-}
          NE:=1;
          if IOResult=0 then
            begin
              repeat
                Read(F,Enreg);
                  Table[NE]:=Enreg;
                  NE:=NE+1;
                Until Eof(F);
                NbEnr:=NE-1;{Nombre d'enrégistrement dans le fichier}
                CloseFile(F);
                NE:=1;{Numéro de l'enrégistrement courant}
                Affiche(NE);{Affichage du premier enrégistrement}
            end
            else
            begin
              with Enreg do
                begin
                  Table[1].N:='';
                  Table[1].P:='';
                  Table[1].DTN:='';
                  Table[1].L:='';
                end;
                NbEnr:=1;
              end;
    end;
    Ça fonctionne mais avec la manière dont je souhaiterais avoir les données je crois qu'il risque d'avoir un bug.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Personnellement voir, des Reset dans un Activate et son Close sans un Event ... j'ai un peu de mal ... une fonction de lecture, avec chargement en mémoire pour l'affichage, une fonction d'écriture ... on ne laisse le fichier ouvert tout le temps comme ça (sauf en db mais c'est un serveur robuste qui tourne pas un QuitterClick ...)

    ton Chr(13); ne sert à rien ...

    Ensuite, si tu utilise un tableau de structure, j'ai fait quelque chose de similaire pour des tests (désolé c'est du code pourri de test, moins clean que du code de prod) ... je load le fichier dans une listbox, puis je veux modifier un item, je le modifie à la volée ... d'ailleurs dommage de ne pas avoir fourni la structure, cela aurait aidé à comprendre ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
       TStructRec = packed record
          ID: Integer;
          Nom: string[50];
          Memo: string[255];
          Date: TDateTime;
       end;
    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
    procedure TFrmTestFichier.BtnLoadClick(Sender: TObject);
    var
       Fichier: file of TStructRec;
       TmpStructRec: TStructRec;
       i: Integer;
    begin
       if not FileExists(EdPathStructFile.Text) then begin
          ListBoxRecords.Items.Clear();
          ListBoxRecords.Items.Add('New');
          Exit; // Rien à Charger
       end else begin
          ListBoxRecords.Items.Clear();
          ListBoxRecords.Items.Add('New');
     
          AssignFile(Fichier, EdPathStructFile.Text);
          Reset(Fichier); //
          try
             while not Eof(Fichier) do begin
                Read(Fichier, TmpStructRec);
                i := ListBoxRecords.Items.Add(IntToStr(TmpStructRec.ID) + ' : ' + TmpStructRec.Nom);
                ListBoxRecords.Items.Objects[i] := Pointer(TmpStructRec.ID);
             end;
          finally
            CloseFile(Fichier);
          end;
       end;
    end;
     
     
    procedure TFrmTestFichier.BtnEcrireClick(Sender: TObject);
    var
       Fichier: file of TStructRec;
       TmpStructRec: TStructRec;
    begin
       ZeroMemory(@TmpStructRec, SizeOf(TmpStructRec));
       TmpStructRec.ID := StrToInt(EdID.Text);
       TmpStructRec.Nom := EdName.Text;
       TmpStructRec.Memo := EdMemo.Text;
       TmpStructRec.Date := Now();
     
     
       AssignFile(Fichier, EdPathStructFile.Text);
       if not FileExists(EdPathStructFile.Text) then begin
          ReWrite(Fichier);
       end else begin
          Reset(Fichier);
          Seek(Fichier, TmpStructRec.ID); // Magique le BlockSize est SizeOf(TStructRec); mais faudrait peut-être un test de longueur de fichier ...
       end;
       try
          Write(Fichier, TmpStructRec);
       finally
          CloseFile(Fichier);
       end;
     
       BtnLoad.Click();
    end;
    Et Comme toi, c'est un fichier binaire, tout à fait normal, ...

    donc pour toi je dirais de modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table[NE].EndMark := #13#10; // EndMark étant un String[2];
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Si le fichier texte est relativement court, utilise une TStringList C'est beaucoup plus facile
    Pour plus d'infos
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par the watcher
    Je voudrais avoir mes données sur plusieurs lignes
    Bonjour,
    Tu souhaites pouvoir lire ton fichier dans un éditeur ?

    Remplaces le write par writeln et read par readln

    a+

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Pour le moment, il semble écrire des Structures ... ça lui compliquerait la vie d'ajouter un Parsing pour découper les buffer lu dans un Fichier Texte via TStringList ou TextFile ...

    Ensuite, il semble ne stocker QUE des chaines, il suffit d'ajouter deux octets pour avoir des lignes bon tout dépend si l'on déclare des Chaines Courtes qui vont ajouter leur longueur (du coup binaire) ou des Array[0..Max] of Char qui seront brut de décoffrage ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    yurck a écrit
    Tu souhaites pouvoir lire ton fichier dans un éditeur ?

    Remplaces le write par writeln et read par readln
    J'ai en éffet fais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.QuitterClick(Sender: TObject);
    begin
       if
       (EditNom.Text+EditPrenoms.Text+EditDtNaiss.Text<>'')
        then   Enregistre;
              Rewrite(F);
              For I:=1 to NbEnr do
              Writeln(F,Table[I]);
              CloseFile(F);
          Application.Terminate;
    end;
    Impossible de compiler le prog :
    Type illegal dans une fonction write/writeln

  7. #7
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    j'oubliais:
    Voici mes déclarations :
    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
    Type
      Txt = record
        N, P : String[20];// Nom et Prenom
        DTN : String[10];//Date de naissance
        L : String[30];//Lieu de naissance
        T : String[20];
        M : String[20];
        end;
    var
      Form1: TForm1;
      F : File of Txt;
      Enreg : Txt;
      Table : Array[1..100] of Txt;
      NE : LongInt; {Numéro de l'enrégistrement courant}
      NbEnr : Integer; {Nombre d'enrégistrement}
      I : Integer;
      Ligne : String;
     
    implementation

  8. #8
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    NB :

    1) ton Chr(13) tout seul dans une procédure n'a aucun effet !

    2) Un fichier typé n'a jamais, au grand jamais, produit un fichier texte.

    Étudie la différence entre fichiers typés et fichiers texte.

  9. #9
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par the watcher
    yurck a écrit des conneries

    Impossible de compiler le prog :
    Type illegal dans une fonction write/writeln
    Désolé, utilises alors la solution de ShaiLeTroll (voir ci dessus) qui reste dans la même philosophie et me semble être la + rapide à mettre en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table[NE].EndMark := #13#10; // EndMark étant un String[2];
    a+

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Personnellement, je n'ai toujours pas compris quel était le vrai format du fichier, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le problème est que ce fichier est créer et rempli par un autre programme écrit dans un autre langage.
    si un extrait d'un fichier de quelques enrecs était fourni on pourrait répondre, car j'ai vraiement l'impression qu'il y a confusion ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. lecture / écriture dans des fichiers text
    Par nadir CoCo dans le forum C++
    Réponses: 6
    Dernier message: 28/06/2012, 09h10
  2. lecture-écriture dans un fichier text
    Par guefrachi dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 29/07/2010, 20h28
  3. Réponses: 4
    Dernier message: 02/05/2007, 10h41
  4. lecture écriture dans un fichier
    Par poukill dans le forum C++
    Réponses: 9
    Dernier message: 23/05/2006, 11h02
  5. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15

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