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

Langage Delphi Discussion :

Problème de lecture de fichier texte


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Problème de lecture de fichier texte
    Bonjour,

    J'ai un fichier text du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    0.94902;0.839216;0;Medium Yellow C
    0.866667;0.368627;0;Bright Orange C
    0.819608;0.219608;0.207843;Bright Red C
    0.678431;0;0.388235;Strong Red C
    0.698039;0.14902;0.576471;Pink C
    0.247059;0;0.54902;Medium Purple C
    J'ai écris une procedure du type :
    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
     
    procedure LisFichier( const FileName: TFileName;
                                var Rec : MonType);
    var
      F: TextFile;
      St,S,S0: String;
      J,i: integer;
      C: char;
      R,G,B: single;
    begin
      AssignFile(F, FileName);
      Reset(F);
      while not Eof(F) do
      begin
        ReadLn(F, St);
        S:='';
        J:=0;
        for i:=1 to Length(St) do
        begin
          C:= St[i];
          if C<>';' then S:= S+C else
          if (C=';') or (i=Length(St)) then
          begin
            inc(J);
            case J of
              1: R:= StrToFloat(S);
              2: G:= StrToFloat(S);
              3: B:= StrToFloat(S);
              4: S0:= S;
            end;
            S:= '';
          end;
        end;
      end;
      CloseFile(F);
    end;
    Si je trace cette procedure lorsque J=1 à 3 S correspond bien à la string d'un nombre flottant et si J=4 S à du texte

    Mais pour J=1..3 Le StrToFloat(S) ne fonctionne pas car R,G ou B ne sont pas initialisé par la valeur de S mais si J=4 S0 est bien initialisé par S!!!

    Où est le problème ???

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Parfois vous vous compliquez la vie ^^

    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
     
    procedure LisFichier( const FileName: TFileName;
                                var Rec : MonType);
    var
      lstFile, lstTmp : TStringList;
      i : integer;
    begin
      lstFile := TStringList.Create;
      lstTmp := TStringList.Create;
      try
        lstFile.loadFromFile(FileName);
        for i := 0 to lstFile.count -1 do
        begin
          lstTmp.text := StringReplace(lstFile[i],';',#13#10,[rfReplaceAll]);
          R := StrToFloatDef(lstTmp[0],0);
          G := StrToFloatDef(lstTmp[1],0);
          B := StrToFloatDef(lstTmp[2],0);
          S0 := LstTmp[3];
        // etc ...
        end;
      finally
        lstFile.Free;
        lstTmp.Free;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre expérimenté
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Par défaut
    Juste faciliter la vie a RAYEK on supprime le StringReplace.
    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
    procedure LisFichier( const FileName: TFileName;
                                var Rec : MonType);
    var
      lstFile, lstTmp : TStringList;
      i : integer;
    begin
      lstFile := TStringList.Create;
      lstTmp := TStringList.Create;
      try
        lstFile.loadFromFile(FileName);
        lstTmp.Delimiter := ';';
        lstTmp.StrictDelimiter := True;
        for i := 0 to lstFile.count -1 do
        begin
          lstTmp.DelimitedText := lstFile[i]; // pour ne pas ce compliquer la vie
          R := StrToFloatDef(lstTmp[0],0);
          G := StrToFloatDef(lstTmp[1],0);
          B := StrToFloatDef(lstTmp[2],0);
          S0 := LstTmp[3];
        // etc ...
        end;
      finally
        lstFile.Free;
        lstTmp.Free;
      end;
    end;

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par delphichem Voir le message
    Juste faciliter la vie a RAYEK on supprime le StringReplace.
    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
    procedure LisFichier( const FileName: TFileName;
                                var Rec : MonType);
    var
      lstFile, lstTmp : TStringList;
      i : integer;
    begin
      lstFile := TStringList.Create;
      lstTmp := TStringList.Create;
      try
        lstFile.loadFromFile(FileName);
        lstTmp.Delimiter := ';';
        lstTmp.StrictDelimiter := True;
        for i := 0 to lstFile.count -1 do
        begin
          lstTmp.DelimitedText := lstFile[i]; // pour ne pas ce compliquer la vie
          R := StrToFloatDef(lstTmp[0],0);
          G := StrToFloatDef(lstTmp[1],0);
          B := StrToFloatDef(lstTmp[2],0);
          S0 := LstTmp[3];
        // etc ...
        end;
      finally
        lstFile.Free;
        lstTmp.Free;
      end;
    end;


    Mais j'avais vu qu'il pouvait y avoir des soucis avec le Delemiter (je ne sais plus ou j'avasi vu cela), au moins avec le StringReplace je suis sur à 100% que c'est séparé de la manière que je veux
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre expérimenté
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Par défaut
    Mais j'avais vu qu'il pouvait y avoir des soucis avec le Delemiter (je ne sais plus ou j'avasi vu cela)
    Effectivement il peut y avoir des problèmes, c'est pour ça que j'ai ajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstTmp.StrictDelimiter := True;
    Qui permet de forcer l'utilisation uniquement du caractère spécifier dans Delimiter.

    au moins avec le StringReplace je suis sur à 100% que c'est séparé de la manière que je veux
    Je comprend il vaut mieux être prudent.

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Si j'utilise le Delimiter dans la listFile, est ce que les fin de lignes seront pris en compte normalement ou pas ?
    j'en deduis donc qu'il est nécessaire d'enlever le StrictDelimiter

    Est ce que ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    00;11;22;33
    44;55;66;77
    Devient ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    00
    11
    22
    33
    44
    55
    66
    77
    Si oui, on peut même reduire d'une TStringList encore :p

    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
    procedure LisFichier( const FileName: TFileName;
                                var Rec : MonType);
    var
      lstFile :  TStringList;
      i : integer;
    begin
      lstFile := TStringList.Create;
      try
        lstFile.loadFromFile(FileName);
        lstFile.Delimiter := ';';
        for i := 0 to (lstFile.count Div 4) -1 do
        begin
          R := StrToFloatDef(StringReplace(lstFile[i * 4],'.',DecimalSeparator,[]),0);
          G := StrToFloatDef(StringReplace(lstFile[i * 4 + 1],'.',DecimalSeparator,[]),0);
          B := StrToFloatDef(StringReplace(lstFile[i * 4 + 2],'.',DecimalSeparator,[]),0);
          S0 := lstFile[i * 4 + 3];
        // etc ...
        end;
      finally
        lstFile.Free;
      end;
    end;
    @Colorid : test le nouveau code ou du moins copie la partie des RGB en fesant les bonnes modifs
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre expérimenté
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Par défaut
    Non LoadFromFile utilise les caractère CR et LF (#13 et #10) pour délimiter les lignes elle ne prend pas en considération le Delimiter.

    Tu auras comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0.94902;0.839216;0;Medium Yellow C
    0.866667;0.368627;0;Bright Orange C
    0.819608;0.219608;0.207843;Bright Red C
    0.678431;0;0.388235;Strong Red C
    0.698039;0.14902;0.576471;Pink C
    0.247059;0;0.54902;Medium Purple C

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Ca ne marche toujours pas
    J'ai écris la procédure suivante :
    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
     
    procedure LoadPantoneFile( const FileName: TFileName;
                                var Rec : TPantoneVec );
    var
      lstFile, lstTmp : TStringList;
      i : integer;
      R,G,B: single;
      S: string;
    begin
      lstFile := TStringList.Create;
      lstTmp := TStringList.Create;
      try
        lstFile.loadFromFile(FileName);
        lstTmp.Delimiter := ';';
        lstTmp.StrictDelimiter := True;
        for i := 0 to lstFile.count -1 do
        begin
          lstTmp.DelimitedText := lstFile[i]; // pour ne pas ce compliquer la vie
          R := StrToFloatDef(lstTmp[0],0);
          G := StrToFloatDef(lstTmp[1],0);
          B := StrToFloatDef(lstTmp[2],0);
          S := LstTmp[3];
        // etc ...
        end;
      finally
        lstFile.Free;
        lstTmp.Free;
      end;
    end;
    Toujours le même problème : Au traçage j'ai bien les bonnes string dans lstTmp[0], lstTmp[1] et lstTmp[2], mais R,G,B ne sont pas initialisés !!! comme si le StrToFloatDef() ne fonctionnait pas

    J'ai vérifié dans le panneau de config options régionales le symbole décimal est bien un point. Je pense que s'il ne l'étatit pas nous aurions une erreur. La je n'ai pas d'erreur mais R,G et B ne sont pas initialisés.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Ne cherchez plus
    Malgré un traçage qui ne me satisfaisait pas j'ai tenté d'initialiser ma structure Rec:Montype.
    Miracle elle est correctement initialisée.
    Ce qui prouve qu'en mettant un point d'arret à S := LstTmp[3]; les valeurs R,G,B ne semblent pas initialisées puisqu'elles retournent 0. Ce serait un problème de Delphi au traçage.

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Quand tu as ton traceur sur S0, tu surlignes listTmp[0] et tu fait [Ctrl] + F7
    Tu devrais voir le résultat qu'il y a dans lstTmp[0].
    Après tu fais la même chose mais en surlignant tout le StrToFloat( ....);
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    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 115
    Par défaut
    Effectivement, j'allais proposer d'utiliser Explode ou une TStringList, pour simplifier l'Algo ...

    Sinon, attention au "." et "," selon les options régionales ...
    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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2011, 10h54
  2. Problème lecture de fichier texte (*.txt)
    Par Tartuffe245 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/03/2010, 15h41
  3. [Lazarus] [Linux] Problème de lecture de fichier texte
    Par ovni76 dans le forum Lazarus
    Réponses: 10
    Dernier message: 07/09/2008, 19h21
  4. Problème lecture gros fichier texte
    Par UnnamedBoy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/02/2008, 11h13
  5. lecture de fichier texte
    Par prorider dans le forum C
    Réponses: 36
    Dernier message: 08/09/2004, 20h55

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