Edition d'une ligne spécifique d'un fichier texte

Résolu
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015 - 3 mars 2015 à 13:06
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 4 mars 2015 à 14:59
Bonjour à tous,

Voila, je cherche éditer la ligne 3 de mon fichier texte.

Je m'explique, je suis en création d'un jeu basique en visual basic 6, ( petit jeu de mot nul.. bref ) et dont chaque joueur a son propre compte ainsi que sa propre sauvegarde, jusque la tout est logique..

Toutes les sauvegardes des joueurs sont envoyés sur un ftp, et quand le joueur ré-ouvre le jeu et se connecte, le ftp lui renvoie sa sauvegarde.

Bon j'en viens à mon problème, l'administrateur du jeu ( donc moi ) voudrais pouvoir changer une valeur ( donc une ligne ) de la sauvegarde de ce joueur.

Donc on passe toutes les étapes d'avant qui prend la sauvegarde du ftp etc..
Je veux juste savoir comment récupérer la ligne ( ligne 3 ) puis la modifier avec un autre texte .
Exemple : la ligne 3 qui est l'argent du joueur.

Merci de vos réponses

19 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/03/2015 à 15:35
Bonjour,
Les exemples et discussions relatives aux manipulations de fichiers texte ne manquent pas sur ce forum (un véritable quirielle !).
Qu'as-tu au moins tenté d'écrire en utilisant l'instruction Open (à lire dans ton aide VB6) ?
Intéresse-toi également à la fonction Split (à lire également dans l'aide VB6)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 3/03/2015 à 16:08
Bonjour ucfoutu, merci de ta réponse.

J'ai cette fonction qui permet d'appeler mon fichier et d'aller directement à la ligne que je veux. Il récupère la ligne, mais je veux aussi la remplacer par un autre texte et je n'ai pas réussi à trouver sur le forum en VB6.

Le fonction que j'utilise pour trouver la ligne est la suivante :

i = 0
ligne = 3 'La ligne de l'argent du joueur

Open App.Path & "MON FICHIER.txt" For Input As #1
Do While Not EOF(1)
i = i + 1
Input #1, valeur 'Argent du joueur recherché
If i = ligne Then Exit Do
Loop
Close #1
msgbox "L'argent du joueur est de : " & valeur & " €"

La fonction split est une fonction de comparaison de chaine de caractères si je ne m'abuse, cependant je ne veux pas comparer mais bel et bien remplacer cette valeur initiale.

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2015 à 17:46
La fonction Split n'est pas une fonction de comparaison de valeur.
Nous y viendrons ensuite (après que tu auras traité comme tu as commencé).
On ne peut modifier DIRECTEMENT un fichier texte.
On procède en deux étapes :
Une étape de lecture et une étape d'écriture.
Il te faut donc ouvrir à la fois le fichier en lecture (comme tu l'as fait) et en ouvrir un second (nommes-le comme tu l'entends) en écriture (For Output au lieu de For Input)
Pour chaque ligne lue en lecture ==>> écris-la dans le second fichier, sans la modifier, sauf lorsque i = 3 (et tu écris alors ton remplacement).
Tu fermes ensuite les deux fichiers, renommes le second comme le premier (tu l'écrases donc) et tu détruis le second.
Essayes sur ces bases seul d'abord. Appelles au secours (avec le code tenté) si tu n'y parviens pas.

Nous verrons ensuite (lorsque tu auras réussi d'abord ainsi) comment faire les choses plus simplement en utilisant Split.
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 3/03/2015 à 18:12
D'accord,

Je suis en train de le faire cependant, il n'y a pas moyen de sauter les lignes 1 à 2 au lieu de les réécrires en Output ?
Je t'explique pourquoi je veux éviter de réécrire toutes les lignes car je veux, certes modifier la ligne 3, mais dans mon fichier ce n'est pas la seule ligne qu'il faut que je modifie, et mon fichier comporte une centaines de lignes..

Quelque chose comme :

i = 0
ligne = 4

Open App.Path & "MON FICHIER" For Input As #1
Do While Not EOF(1)
i = i + 1
Input #1, valeur
If i = ligne Then Exit Do
Loop

Open App.Path & "\Espion-" & Text1.Text & "-Save.ini" For Output As #2

Print #2, "NOUVELLE VALEUR"

Close #1
Close #2

Merci de ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2015 à 18:15
Ben ...
1) Si tu fais cela tu n'auras qu'une seule valeur dans ton second fichier : "NOUVELLE VALEUR"
Relis-moi : il te faut tout réécrire dans le second fichier ===>>

2) un fichier lu avec Input doit être écrit avec Write et non Print
==>> à mlain levée :
Open App.Path & "MON FICHIER" For Input As #1 
Open App.Path & "\Espion-" & Text1.Text & "-Save.ini" For Output As #2
Do while not EOF(1)
i = i + 1
Input #1, valeur
if i = ligne then valeur = "NOUVELLE VALEUR"
Write #2, valeur
loop
close #1
Close #2
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 3/03/2015 à 18:50
Ah oui, mais je cherche une solution pour éviter de réécrire le fichier ligne par ligne..

Mais du coup avec la fonction que j'utilise je ne peux pas réécrire les autres lignes car au final ma fonction recherche que la ligne que je lui indique : donc 4, les autres je ne les ai pas, je dois donc ouvrir le fichier puis énumérer les lignes une par une ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2015 à 19:07
1) Je crois te l'avoir dit plus d'une fois, non ?
Tu dois lire TOUT et réécrire TOUT, en ne modifiant que ce qu'il y a à modifier.
C'est ce que fait mon code (que je n'ai même pas essayé).
2) tu parles de "lignes" ... Or input ne se réfère pas à une "ligne", mais à un article.
Résumons : un fichier texte écrit par Write est lu par Input. Un fichier texte écrit par Print est lu par Line Input.
Et ce n'est pas la même chose !
Bref ...
Montre ici quelques lignes de ton fichier texte. Que l'on connaisse sa structure et que l'on sache s'il a été écrit par Write ou par Print.
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 3/03/2015 à 20:01
Excuse moi, j'ai du mal a tout suivre...
Pourtant tu explique très bien ..

Revenons, en fait avant de trouver un solution pour trouver une ligne dans un fichier, j'avais une autre façon d'énumérer mon fichier texte :

J'ai exactement 56 variables mais j'en met que 4 pour l'exemple.

If Dir(App.Path + "\Espion-" & Form16.Text1.Text & "-Save.ini", vbHidden) <> "" Then

Open App.Path & "\Espion-" & Form16.Text1.Text & "-Save.ini" For Input As #1

Dim Var1
Dim Var2
Dim Var3
Dim Var4

Input #2, Var1
Input #2, Var2
Input #2, Var3
Input #2, Var4

Text1.Text = Var1
Text2.Text = Var2
Text3.Text = Var3
Text4.Text = Var4

Close #1

C'est le code que j'ai toujours utilisé jusqu'a aujourd'hui ou j'ai trouvé une solution de trouver une seule ligne :
i = 0
ligne = 3

Open App.Path & "\Espion-" & Text1.Text & "-Save.ini" For Input As #1
Do While Not EOF(1)
i = i + 1
Input #1, valeur
If i = ligne Then Exit Do
Loop
Close #1

Donc je dois oublier la deuxième partie du code ( celle qui trouve une seule ligne ) pour faire ce que je veux ?

Je dois réécrire toutes mes lignes et changer celle que je veux a ce moment la ?

PS : Le code ou tu ouvres les deux fichiers en même temps en Input et Output ne fonctionne pas, car il me dit : Le fichier est déjà ouvert.


Sinon, je viens d'y penser, ce serais pas plus simple de supprimer la ligne 3 et d'écrire la ligne avec la nouvelle valeur après la ligne 2 ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2015 à 20:36
1)
Je dois réécrire toutes mes lignes et changer celle que je veux a ce moment la ?

C'est ce que je m'évertue à te répéter depuis kala kala (expression gabonaise) !
Je réitère malgré tout : pour réécrire/modifier un fichier texte, il faut en lire et réécrire tous les éléments.
21) le code que je t'ai montré plus haut ne peut aboutir au message que tu rapportes que si le second fichier est le premier. Et je t'ai dit plus haut :
Il te faut donc ouvrir à la fois le fichier en lecture (comme tu l'as fait) et en ouvrir un second (nommes-le comme tu l'entends) en écriture (For Output au lieu de For Input)

Tu ne trouves pas que cela commence à devenir un drôle de "dialogue de sourds" ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2015 à 21:26
Enfin quoi ===>>
Ouvre donc un nouveau projet avec deux boutons de commande Command1 et Command2 et ce code
Private Sub Command1_Click()
'juste pour constituer un petit fichier texte
Open "c:\voila.txt" For Output As #1
For i = 1 To 10
Write #1, "a" & i
Next
Close #1
MsgBox "va voir (dans l'explorateur) ce que tu y a écrit, puis ferme-le"
End Sub

Private Sub Command2_Click()
ligne = 3
Open "c:\voila.txt" For Input As #1
Open "c:\voilacopie.txt" For Output As #2
Do While Not EOF(1)
i = i + 1
Input #1, article
If i = ligne Then article = "coucou"
Write #2, article
Loop
Close #1
Close #2
Kill "c:\voila.txt"
Name "c:\voilacopie.txt" As "c:\voila.txt"
MsgBox "va voir (dans l'explorateur) ce qui yest maintenant écrit, puis ferme-le"
End Sub

Clique sur command1 ===>> va voir ce que tu as écrit dans c:\voila puis ferme ce fichier
Clique ensuite sur command2 ===>> a voir la transformation apportée.
Plus clair que cela, impossible !
Ce ne sera que lorsque tu auras assimilé cette étape que je reviendrai avec l'utilisation de Split
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 3/03/2015 à 21:35
Je viens effectivement de tout comprendre, excuse moi encore et je te remercie encore de tes réponses rapides, claires, et de ta patience surtout...

Après une journée de programmation mon cerveau disjoncte et a du mal a assimiler des nouvelles informations :P

Bref, je referais mon code demain et je reecrirais tout mon fichier et je changerais les valeurs des lignes a changer.

Je reviendrais vers toi demain quand j'aurais fini ça, pour que tu m'explique la fonction split si tu veux bien :)

Bonne soirée a toi et encore merci
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
4 mars 2015 à 08:55
Parfait !

Private Sub Command2_Click()
ligne = 3
Open "c:\voila.txt" For Input As #1
Open "c:\voilacopie.txt" For Output As #2
Do While Not EOF(1)
i = i + 1
Input #1, article
If i = ligne Then article = "coucou"
Write #2, article
Loop
Close #1
Close #2
Kill "c:\voila.txt"
Name "c:\voilacopie.txt" As "c:\voila.txt"
MsgBox "va voir (dans l'explorateur) ce qui yest maintenant écrit, puis ferme-le"
End Sub


C'est ce que j'ai essayé de faire hier, sauf que je n'ai pas du tourner le code dans le même sens que toi..
Ça fonctionne parfaitement !

Juste une petite question, tu me dit qu'il faut utiliser "Write #1" au lieu de "Print #1" en Output
Tu peux m'expliquer la différence ?
Car moi quand je met en "Write", toutes mes données de mon fichier texte se retrouvent entourées de guillemets ( "Donnée" )
et avec "Print" aucune guillemet : ( Donnée )

Merci beaucoup ucfoutu
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2015 à 10:21
C'est la raison pour laquelle je te demandais hier comment avait été écrit le fichier d'origine.
pour mémoire :
Résumons : un fichier texte écrit par Write est lu par Input. Un fichier texte écrit par Print est lu par Line Input.
Et ce n'est pas la même chose !
Montre ici quelques lignes de ton fichier texte. Que l'on connaisse sa structure et que l'on sache s'il a été écrit par Write ou par Print.

Que veux-tu finalement ? des données entre guillemets ou sans guillemets ?
Et comment est écrit le fichier d'origine ? montre quelques lignes.
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
Modifié par Maganor22 le 4/03/2015 à 10:38
Je veux les données sans les guillemets.
Mon fichier est écris par "Print" et lu par "Input" comme ceci :

Open App.Path + "\MON FICHIER.txt" For Output As #1

Print #1, Text1.text

close #1


Et je l'ouvre de cette façon :

Dim Var1

Open App.Path & "\MON FICHIER.txt" For Input As #2

Input #2, Var1

Text1.Text = Var1

Close #2
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2015 à 10:53
Alors voilà comment l'écrire, le lire, le modifier.
Observe : j'utilise Line Input et non input :
Private Sub Command1_Click()
'juste pour constituer un petit fichier texte
Open "c:\voila.txt" For Output As #1
For i = 1 To 10
Print #1, "a" & i
Next
Close #1
MsgBox "va voir (dans l'explorateur) ce que tu y a écrit, puis ferme-le"
End Sub

Private Sub Command2_Click()
ligne = 3
Open "c:\voila.txt" For Input As #1
Open "c:\voilacopie.txt" For Output As #2
Do While Not EOF(1)
i = i + 1
Line Input #1, article
If i = ligne Then article = "coucou"
Print #2, article
Loop
Close #1
Close #2
Kill "c:\voila.txt"
Name "c:\voilacopie.txt" As "c:\voila.txt"
MsgBox "va voir (dans l'explorateur) ce qui yest maintenant écrit, puis ferme-le"
End Sub

Quand tu auras assimilé ==>> nous verrons avec Split.
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
4 mars 2015 à 10:56
D'accord je vois bien, on rajoute "Line" devant "Input" au lieu de laisser "Input" seul.

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 4/03/2015 à 11:09
Voilà.
On va maintenant éviter de passer par un second fichier et donc détruire, renommer ...
Procédé : on lit tout en bloc ==>> dans une variable ===>> on ferme ===>>
On éclate la variable dans un array ===>> on modifie dans l'array ==>> on réécrit le tout dans le fichier ===>>
Private Sub Command2_Click()
ligne = 3
Open "c:\voila.txt" For Input As #1
toutlu = Input(LOF(1), #1) ' ====>> on lit tout le fichier d'un seul coup dans toutlu
Close #1
titi = Split(toutlu, vbCrLf) ' =====>> on "éclate" toutlu dans un array
titi(ligne - 1) = "coucou" ' ====>> on modifie le 3ème élément de cet array
Open "c:\voila.txt" For Output As #1
Print #1, Join(titi, vbCrLf); '====>> on écrit par Print le "rassemblement" (par Join)
Close #1
End Sub

Voilà.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Maganor22 Messages postés 22 Date d'inscription mardi 3 mars 2015 Statut Membre Dernière intervention 12 mars 2015
4 mars 2015 à 13:05
C'est parfait ça fonctionne parfaitement !

C'est plus facile cette méthode, on ouvre le fichier en Input, on le lis, on le ferme.
On l'ouvre en Output, on remplace la donnée et on ferme.

Je te remercie beaucoup !!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 mars 2015 à 14:59
Bien.
Il te reste à libérer cette discussion.
Un clic sur le tag RESOLU au niveau de ton tout premier message.
A bientôt

0
Rejoignez-nous