Bonsoir
veuillez me montrer comment lire le contenu d'un fichier text (ligne par ligne), évidement comment l'ouvrir puis le fermer.
Merci d'avance
Bonsoir
veuillez me montrer comment lire le contenu d'un fichier text (ligne par ligne), évidement comment l'ouvrir puis le fermer.
Merci d'avance
Salut !
j'ai tapé ta question danset surprise : il y a plein de réponses ... dont par exemple celle-ci sur ce site !
Allez, un petit effort de lecture ==![]()
Merci pour ta réponse
je vais voir
(Je n'ai de problème avec la lecture)![]()
Pourquoi ne pas passer par un TStingList. C'est particulièrement pratique et cela ne nécessite que très peu d'efforts.
La propriété Strings te permet d'accéder au contenu de chaque ligne de ton fichier texte.
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 uses Classes ...... var AFile: TStringList; I: integer; begin AFile := TStringList.Create; try AFile.LoadFromFile('c:\monFichier.txt'); for I := 0 to Pred(AFile.Count) do showMessage(AFile.Strings[I]); finally AFile.Free; end; end;
La propriété Text te permet d'acceder au contenu complet de ton fichier.
Tu pourrais également non pas utiliser un TStingList mais un TStrings (classe abstraite) qui peut s'avérer très pratique pour certains traitements.
Par exemple, tu charges le contenu de ton fichier texte dans un TMemo afin de l'afficher à l'écran.
Va voir dans l'unité classes et tu découvriras de nombreuses choses autour de cette gestion de listes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure test1(AFile: TStrings); var I: integer; begin for I := 0 to Pred(AFile.Count) do showMessage(AFile.Strings[I]); end; procedure TMaForm.Button2Click(Sender: TObject); begin memo1.Lines.LoadFromFile('c:\MonFichier.txt'); test1(memo1.Lines); end;
Salut,
Pascal, peux-tu nous dire stp, quelle est la différence entre cette variante de boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // La tienne : for I := 0 to Pred(AFile.Count) do // Celle que j'utilise toujours : for i := 0 to AFile.Count - 1 do![]()
Le résultat obtenu est le même donc on peut indifféremment utiliser l'une ou l'autre méthode.
Si j'utilise le Pred, c'est sutout par réflexe et c'est devenu un indicateur visuel lors d'une relecture rapide de mon code.
En tous les cas, réponse très instructive car Pred() au niveau débutant n'est pas trop utilisé.
Merci Pascal![]()
bonjour
merci Pour vos réponses
votre méthode marche bien. Mais j'ai encore un petit problème dans mon programme; lorsque je converti la chaine suivante (enregistré dans le fichier txt par un autre programme VB6)
par la fonction suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part 4,896725E-05
je trouve dans x la valeur 4 (comme s'il ne lit que le premier chiffre)
Code : Sélectionner tout - Visualiser dans une fenêtre à part val(AFile.Strings[i],x,e);
y a t-il une explication
Merci encore
Attention le décimal separator est à priori la virgule.
Donc ajouter en début de procédure
Decimalseparator = ',';
Pour le changement de format, je te conseille un StrToFloat comme ceci
x := StrToFloat(AFile.Strings[i]);
Merci beaucoup Pascal, le problème est résolu avec
(sans avoir ajouter decimal separator)
Code : Sélectionner tout - Visualiser dans une fenêtre à part floattostr
autre chose:
Dans le cas ou le fichier contient de données séparées par des ";" (ou autres) comme suit
existe t-elle un méthode prédéfinie pour les extraire chacune à part (je suis en train de faire un petit programme qui le fait en utilisant les fonctions de chaines de caractères (pos, length,.......) dans le cas contraire
Code : Sélectionner tout - Visualiser dans une fenêtre à part 7,397128 ;-2,091842 ;-2,612865 ;-3,352107
A +
Fais attention sur différent poste (seven, ou autre xp) tu aura des surprises....
Il y en a pas mal, en voici une que j'utilise :
Position = 1 vaut le premier, etc... apres tu peux boucler..
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 function RecupInfoXT(Ligne: String;Position: Integer):String; var I,IndexID : Integer; DebutID: integer; Begin DebutID := 0; IndexID := 1; result := ''; For I := 0 to Length(Ligne) do begin if IndexID = Position then break; if Ligne[i] = ';' then Inc(IndexID) end; DebutID := i; for i := DebutID to Length(Ligne) do begin if Ligne[i] = ';' then Break; result := result+ligne[i]; end; End;
![]()
Merci de répondre
j'ai essayé ta méthode, elle donne de résultat pour position>1, mais pour position =1 elle ne retourne rien (chaine vide peut être).
Mais en attendant une réponse j'ai pensé à cette méthode
peut être elle manque de généralisation (insertion d'un boucle pour les chaine[i]) mais elle donne des bons résultats.
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 tpos[1]:=posex(';',Ligne,1); j:=2; while (posex(';',ligne,tpos[j-1]+1)<>0) do begin tpos[j]:=posex(';',ligne,tpos[j-1]+1); j:=j+1; end; chaine[1]:=copy(ligne,1,tpos[1]-1); chaine[2]:=copy(ligne,tpos[1]+1,tpos[2]-(tpos[1]+1)); chaine[3]:=copy(ligne,tpos[2]+1,tpos[3]-(tpos[2]+1)); chaine[4]:=copy(ligne,tpos[3]+1,length(ligne)-(tpos[3]+1));
c'est la première version
tant qu'il n y a pas une méthode prédéfinie, c'est donc de l'algorithmique à faire.
![]()
J'aurais tendance à vous proposer cette méthode.
Si tes chaînes sont toujours formatées ainsi :
'7,397128 ;-2,091842 ;-2,612865 ;-3,352107 '
Alors utilise encore les TStringList ou TStrings de la façon 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 ValuesExtract(AsT : string; AValues: TStrings); begin AValues.Delimiter := #0; AValues.QuoteChar := ';'; AValues.DelimitedText := Ast; end; procedure test; var AList: TStringList; I: integer; AsT: string; begin AList := TStringList.Create; try AsT := '7,397128 ;-2,091842 ;-2,612865 ;-3,352107 '; ValuesExtract(AsT, AList); for I := 0 to Pred(AList.Count) do if Trim(AList[I]) <> '' then showMessage(Trim(AList[I])); finally AList.Free; end; end;
je peux avoir d'autre formats dans mon fichier, puisqu'il résulte d'un programme de calcul (sous VB6), je peux avoir des nombre sans chiffre après la virgule....Si tes chaînes sont toujours formatées ainsi :
'7,397128 ;-2,091842 ;-2,612865 ;-3,352107 '
ou
Merci pour la réponse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 7,397128 ;-2,091842 ;-2,612865 ;-3,352107 9,207355 ; 0,81449 ; 0,7090379 ; 4,535276E-02 9,987475 ;-6,051562E-02 ; 1,160159 ; 0,6723038
effectivement
Merci beaucoup
salut
j'ai essayé de faire la combinaison pour appliquer cette méthode aux lignes de fichier mais elle se produit une erreur d'exécution. Voici le 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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 procedure TForm1.Button4Click(Sender: TObject); var AList: TStringList; i,J: integer; AsT: string; begin AList := TStringList.Create; AFile := TStringList.Create; Decimalseparator := ','; ///////////////////////////////////////////////////////////// try AFile.LoadFromFile('c:\new1.txt'); for i := 0 to pred(AFile.Count) do begin AsT :=AFile.Strings[i]; try ValuesExtract(AsT, AList); for J := 0 to Pred(AList.Count) do if Trim(AList[J]) <> '' then begin t[J+1]:=strtofloat(Trim(AList[J])); end; list2.AddItem(floattostr(t[1]),list2); list3.AddItem(floattostr(t[2]),list3); list4.AddItem(floattostr(t[3]),list4); list5.AddItem(floattostr(t[4]),list5); finally AList.Free; end; end; finally AFile.Free; end; /////////////////////////////////////////////////////////////// end;
effectivement tu ne crées qu'une seule instance de AList que tu détruis lors de la première boucle. En l'occurrence, lors de la seconde boucle plus aucune instance de AList n'est présente.
Reprend plutôt la structure 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 TForm1.Button4Click(Sender: TObject); var AList: TStringList; I,J: integer; AsT: string; begin Decimalseparator := ','; AFile := TStringList.Create; try AFile.LoadFromFile('c:\new1.txt'); for I := 0 to pred(AFile.Count) do begin AList := TStringList.Create; AsT :=AFile.Strings[I]; try ValuesExtract(AsT, AList); for J := 0 to Pred(AList.Count) do if Trim(AList[J]) <> '' then t[J+1]:=strtofloat(Trim(AList[J])); ...................................... finally AList.Free; end; end; finally AFile.Free; end; end;
Je vous remercie vivement
problème![]()
Partager