Lecture dans un fichier Typé

[Résolu]
Signaler
Messages postés
29
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
3 février 2007
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour,
Je voudrait savoir comment faire pour récupérer des donnés dans un fichier typé....
Par exemple voila ce qu'il y aurait dans "exemple.txt" :

12.45432;45.5664;-1
04.02111;47.0943;1

Comment faire pour récuperer la valeur 12.45432 puis 45.5664 etc....
Je connais les fonctions readLn et WriteLn  Mais elle récupere toute la ligne alors que moi je voudrais récuperer que la valeur jusqu'au point virgule...

Merci d'avance,
Guillaume

6 réponses

Messages postés
40
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
16 décembre 2006
1
Bonjour,


par exemple :

Function Tform1.lirefic(ligne,id:integer):string;
var
   temp : string;
   i : integer;
begin
   with tstringlist.create do
   begin
     loadfromfile('mon_fichier');
     temp := strings[i];
     while (i0) do
        system.delete(temp,1,pos(';',temp));
     if pos(';',temp)>0 then
        result := LeftStr(temp,pos(';',temp)-1)
     else
        result := 'Erreur';
     free;
   end;
end;

A condition que ta chaine finisse par ';' !...

A ton service.

BV94
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Tu récupere ta ligne et tu utilise la fonction ExtractText ci-dessous

AssignFile(fichier, 'ton fichier');
Reset(fichier)
readln(Fichier,LigneLu);
  ExtractText(';', 0); // La tu récupere la chaine '12.45432' que tu convertira
  ExtractText(';', 1); // 45.5664
  ExtractText(';', 2); //-1
closefile(fichier)

function ExtractText(s: string;substr: string;n:integer): string;
var
  i:integer;
begin
  S:= S+substr;
  for i: =1 to n do
  begin
    S:= copy(s,pos(substr,s)+length(substr),length(s)-pos(substr,s)+length(substr));
  end ;
  result: =copy(s,1,pos(substr,s)-1);
end;
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
voir la fonction ChainePos qu'on a elaboré sur delphifr :

s'utilise comme ceci :

T1 := ChainePos(';',S,1);
T2 := ChainePos(';',S,2);

avec de superbe performances meme si on en abuse.
parce que la fonction que donne Pingu, meme si bonne sur le plan du code, afficheras des performances execrable sur les longues chaines et nombreux appels.

function ChainePos(const Sep, Dans: String; const posi: cardinal = 1): String;
   {+e_PosEx}
   { Déclaration PosEX (on la renome e_PosEx pour eviter tout conflit en cas de declaration de StrUtils) }
   function e_PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
   { renvoi la position d'une sous-chaine Substr dans une chaine S à partir de la position Offset }
   var I, X, Len, LenSubStr: Integer;
   begin
     if Offset = 1 then
        Result := Pos(SubStr,S)
     else begin
        I := Offset; LenSubStr := Length(SubStr);
        Len := Length(S)-LenSubStr+1;
        while I <= Len do begin
           if S[I] = SubStr[1] then begin
              X := 1;
              while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do Inc(X);
              if X = LenSubStr then begin
                 Result := I;
                 exit;
              end;
           end;
           Inc(I);
        end;
        Result := 0;
     end;
   end;
   {-e_PosEx}

var I,P1,P2 : integer;
begin
{ initialisation du retour par defaut de la fonction ChainePos }
  Result := '';

{ sortie prématurée avec séparateur en premiere position dans la chaine }
  if (e_posex(Sep,Dans[1]) = 1) and (posi <= 1) then exit;

{ 1ère position de lecture pour la fonction e_posex }
  P1 := 1;
  for I := 1 to Posi-1 do begin
  { recherche position prochain séparateur pour borne à gauche }
      P1 := e_posex(Sep, Dans, P1);
      { sortie prématurée pas de prochain séparateur }
      if P1 = 0 then exit
      { sinon decale la position a position+taille du separateur }
      else P1 := P1 + length(Sep);
  end;

{ Recherche prochain séparateur pour borne à droite }
  P2 := e_posex(Sep, Dans, P1);
  { En cas d'absence, par défaut longueur chaine entrée+1 pour le dernier caractère }
  if P2 = 0 then P2 := length(Dans) + 1;

{ Fin : extraction sous-chaine de position p1, longueur p2-p1 grace a Copy}
  Result := copy(Dans, P1, P2 - P1);
end;
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Tres interessant. Je vais de ce pas modifier ma fonction par celle-ci. (je vais juste la modifier de facon à ce que 0 soit la 1ere occurence).
Merci f0xi !
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
non Pingu!

ne modifie pas l'occurence pour la mettre a Zero.
car elle correspond au Premier mots dans la chaine et non au Zerotieme mots!

donc laisse la a 1 vus que 1 = premier mots trouvé
generalement j'utilise cette fonction avec une autre : CountChar qui permet de compter le nombre de separateurs dans la chaine et donc de savoir combien de mots séparés elle contient.

function CountChar(const S : string; const CharToCount : char) : integer;
var N : integer;
begin
  result := 0;
  N      := Posex(CharToCount,S,1);
  while N <> 0 do begin
    inc(result);
    N := Posex(CharToCount,S,N+1);
  end;
end;

donc a supposé que CountChar nous retourne 5 separateurs, ils doit donc y avoir CountChar+1 mots dans la chaine.

de toute façon ChainePos ne renveras rien si l'occurence est superieure au nombres de mots present.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
ah j'oubliais, CountChar ne fonctionne que si on utiliser des separateurs  qui ne font qu'un octet de longeur.
si on utilise des separateurs plus longs, j'utilise ma fonction CountString, qui elle compte le nombre d'occurence de chaine dans la chaine.

function CountString(const S : string; const StrToCount : string) : integer;
var N : integer;
begin
  result := 0;
  N      := Posex(StrToCount,S,1);
  while N <> 0 do begin
    inc(result);
    N := Posex(StrToCount,S,N+Length(StrToCount));
  end;
end;