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

Free Pascal Discussion :

Variabiliser données string d'un fichier [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut Variabiliser données string d'un fichier
    Bonjour,

    Je cherche à récupérer des variables issues d'un fichier log.
    Ce fichier log comporte des enregistrements sur deux lignes :
    Nom
    Prenom

    il comporte 160 enregistrements. (320 lignes).

    Dans le programme principal, je déclare un type d'enregistrement sur deux lignes, un file of type d'enregistrement sur deux lignes, un tableau d'enregistrements sur deux lignes.

    Je fais un boucle for avec un seul tour, et lorsque je lis le contenu de l'enregsitrement, c'est plus de 4 fois un enregistrement?

    Toute aide est bienvenue.

    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
    program TableauString;
    {$MODE DELPHI}
    uses sysutils;
    type
    	PPersonne = record
    		Nom, Prenom : string[20];
    		end;
    	DataString = array of PPersonne;
    	Fichier = file of PPersonne;
    var
    	Enregistrement : Fichier;
    	DataS : PPersonne;
    	StringDatas : DataString;
    	k : Integer;
    	cpt : Integer;
    begin
    	Datas.Nom := '';
    	Datas.Prenom := '';
    	writeln('Combien d''enregistrements de noms et prenoms voulez-vous charger?');
    	readln(k);
    	assign(Enregistrement,'datastring.log');
    	reset(Enregistrement);
    	for Cpt := 1 to k do
    		begin
    			read(enregistrement,Datas);
    			write(DataS.Nom);
    			//write(DataS.Prenom);
    		end;
    	{/rof}
    close(Enregistrement)
    end.
    Code datastring.log : 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
    Butcher
    Mike
    Millar
    Kevin
    Bleacher
    Bob
    Slusarski
    Joe
    Butcher
    Mike
    Millar
    Kevin
    Cross
    Don
    Miller
    Damian
    Butcher
    Mike
    Millar
    Kevin
    Cross
    Don
    Miller
    ...
    ...
    etc ....

    ./tableauString
    Combien d'enregistrements de noms et prenoms voulez-vous charger?
    1
    utcher
    Mike
    Millar
    Kevin
    Bleacher
    Bob
    Sluvin
    Bleacher
    Bob
    Slu

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Boe,

    Les fichiers log sont des fichiers pur texte, pas des fichiers d'enregistrements au sens du Pascal.

    Il faut les lire ligne par ligne, pas d'autre solution (sauf si tu veux parser toi-même les lignes, en lisant octet/octet, et en testant les séparations de lignes).

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut
    Merci Droggo pour l'éclairage.

    J'ai changé l'extension du fichier datasring.log en fichier datasring.pas et refondu mon fichier source.
    Reste plus qu'à l'implementer comme procedure de chargement de variables.

    Merci

    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
    program ChargementId;
    {$MODE DELPHI}
    type
    	fichiernom = text;
    var
    	k : Integer;
    	cpt : Integer;
    	r : fichiernom;
    	s : string;	
    begin
    	writeln('Combien d''enregistrements de noms et prenoms voulez-vous charger?');
    	readln(k);
    	assign(r,'datastring.pas');
    	reset(r);
    	for cpt := 1 to k do
    			begin
    				readln(r,s);
    				writeln(s);
    			end;
    	{/rof}
    close(r)
    end.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Voe,

    1) Pourquoi renommer ton fichier avec une extension .pas, qui ne correspond pas à son contenu ?
    Inutile et trompeur.

    2) Pourquoi définir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
    	fichiernom = text;
    qui donne à un type un nom qui ne correspond pas à son usage (le nom d'un fichier est une chaîne de caractère) ?
    Inutile et trompeur.

    3) Il faut sécuriser toutes les lectures dans ton fichier, en vérifiant que les accès ne génèrent pas d'erreur, idem pour l'appel de Reset.

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Par défaut
    Merci Droggo de me donner une ligne de conduite à tenir en programmation, j'aime bien le principe
    Citation Envoyé par droggo Voir le message
    Voe,

    1) Pourquoi renommer ton fichier avec une extension .pas, qui ne correspond pas à son contenu ?
    Inutile et trompeur.
    J'avais regardé un vieil exemple d'un fichier source pascal tournant sous Turbo Pascal 4, qui utilisait un fichier .pas pour récupérer des données, les extensions de fichiers sont importantes sous Microsoft, je suis sous Linux, mais c'est pas une excuse ...

    Citation Envoyé par droggo Voir le message
    2) Pourquoi définir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
    	fichiernom = text;
    qui donne à un type un nom qui ne correspond pas à son usage (le nom d'un fichier est une chaîne de caractère) ?
    Inutile et trompeur.
    Je me suis emmêlé les pinceaux, à force de tourner avec six ou huit sources différentes, je voulais donner comme nom de type, un fichier de noms.

    Citation Envoyé par droggo Voir le message
    3) Il faut sécuriser toutes les lectures dans ton fichier, en vérifiant que les accès ne génèrent pas d'erreur, idem pour l'appel de Reset.
    Sécurisé, c'est tant que je ne suis pas devant le eof(r) (* La fin de fichier r *)
    faire traitement.

    J'ai rajouté un type enregistrement qui contient deux elements de type string, un tableau de type enregistrement.
    Cela permet de récupérer les futurs variables.

    Code ChargementId.pas : 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
    program ChargementId;
    {$MODE DELPHI}
    type
    	fichierdedonnees = text;
    	RPersonnes = record
    		Nom,Prenom : String;
    		end;
    	{/Drocer}	
    	ARPers = array of RPersonnes;
    var
    	k : Integer;
    	cpt : Integer;
    	tmp : Integer;
    	r : fichierdedonnees;
    	s : string;	
    	MonTableauPersonnes : ARPers;
    begin
    	writeln('Combien d''enregistrements de noms et prenoms voulez-vous charger?');
    	readln(k);
    	setlength(MonTableauPersonnes,k+1);
    	assign(r,'datastring.log');
    	reset(r);
    	cpt := 1;
    	tmp := cpt;
    		while (tmp < k * 2  ) do // deux elements par enregistrement
    			begin
    				if eof(r) then
    					begin
    						writeln('Nous sommes en Fin de Fichier (ligne ',tmp-1,') appuyer sur Return');
    						readln;
    						break
    					end
    				else
    					begin
    						readln(r,s);
    						MonTableauPersonnes[cpt].Nom := s;
    						inc(tmp);
    						readln(r,s);
    						MonTableauPersonnes[cpt].Prenom := s;
    						inc(tmp);
    						inc(cpt);						
    					end;
    				{/Fi}
    			end;
    		{/Elihw}
    	writeln(tmp-1,' lignes survolees dans le fichier');writeln;
    	writeln('Affichage des strings variabilises dans des enregistrements :');writeln;
    	for tmp := 1 to k do
    		begin
    			writeln('--------------------------------------------':42);
    			writeln('- ',MonTableauPersonnes[tmp].Nom:42);
    			writeln('++++++++++++++++++++++++++++++++++++++++++++':42);
    			writeln('- ',MonTableauPersonnes[tmp].Prenom:42);
    			writeln('--------------------------------------------':42);
    		end;
    	{/Rof}
    	close(r)
    end.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Noe,

    La définition du type
    est toujours inutile, ton fichier est de type text, c'est suffisamment clair.

    Je n'ai pas vérifié le code, mais je vois une indentation qui décale trop les blocs imbriqués. 2 ou 4 caractères sont suffisant pour la clarté, et ça évite de trop étaler le code sur l'écran.
    Il faut également aérer un peu en séparant les blocs logiques par des lignes vides.

    Voici un exemple de ce que ça peut donner :
    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
    program ChargementId;
    {$MODE DELPHI}
     
    type
      fichierdedonnees = Text;
      RPersonnes = record
        Nom, Prenom: string;
      end;
      {/Drocer}  
      ARPers = array of RPersonnes;
     
    var
      k : integer;
      cpt : integer;
      tmp : integer;
      r : fichierdedonnees;
      s : string;  
      MonTableauPersonnes : ARPers;
     
    begin
      Writeln('Combien d''enregistrements de noms et prenoms voulez-vous charger?');
      Readln(k);
      SetLength(MonTableauPersonnes, k + 1);
     
      Assign(r, 'datastring.log');
      Reset(r);
      cpt := 1;
      tmp := cpt;
      while (tmp < k * 2) do // deux elements par enregistrement
      begin
        if Eof(r) then
        begin
          Writeln('Nous sommes en Fin de Fichier (ligne ',
            tmp - 1,') appuyer sur Return');
          Readln;
          Break
        end
        else
        begin
          Readln(r, s);
          MonTableauPersonnes[cpt].Nom := s;
          Inc(tmp);
          Readln(r, s);
          MonTableauPersonnes[cpt].Prenom := s;
          Inc(tmp);
          Inc(cpt);            
        end;
        {/Fi}
      end;
     
      {/Elihw}
      Writeln(tmp - 1,' lignes survolees dans le fichier');
      Writeln;
      Writeln('Affichage des strings variabilises dans des enregistrements :');
      Writeln;
      for tmp := 1 to k do
      begin
        Writeln('--------------------------------------------': 42);
        Writeln('- ', MonTableauPersonnes[tmp].Nom: 42);
        Writeln('++++++++++++++++++++++++++++++++++++++++++++': 42);
        Writeln('- ', MonTableauPersonnes[tmp].Prenom: 42);
        Writeln('--------------------------------------------': 42);
      end;
     
      {/Rof}
      Close(r)
    end.
    Et bien entendu, la meilleure solution pour améliorer la lisibilité est de découper tout ça en fonctions/procédures, ET de mettre des commentaires.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/02/2012, 17h10
  2. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05
  3. Exportattion de données sous forme de fichiers
    Par bidson dans le forum XMLRAD
    Réponses: 20
    Dernier message: 08/06/2004, 13h25
  4. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05
  5. lecture de données a partir de fichier
    Par sana dans le forum MFC
    Réponses: 5
    Dernier message: 21/01/2004, 12h57

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