Edition d'une ligne spécifique d'un fichier texte [Résolu]

Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
- - Dernière réponse : ucfoutu
Messages postés
18039
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
Afficher la suite 

Votre réponse

19 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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 ?
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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 ?
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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" ?
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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
Commenter la réponse de Maganor22
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
D'accord je vois bien, on rajoute "Line" devant "Input" au lieu de laisser "Input" seul.

Merci
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mardi 3 mars 2015
Dernière intervention
12 mars 2015
0
Merci
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 !!
Commenter la réponse de Maganor22
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Bien.
Il te reste à libérer cette discussion.
Un clic sur le tag RESOLU au niveau de ton tout premier message.
A bientôt

Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.