OVH Cloud OVH Cloud

ecrire à la ligne dans un fichier texte.

6 réponses
Avatar
Shewy du 80 !!
Bonjour à tous
Je dois écrire dans un fichier texte. Chose que je sais faire, mais
apparement pas assz bien !

En fait je dois écire à la ligne mes champs. JE n'y parviens pas.

LE résultat de mon fichier doit etre :
-------------------------------------
Nom
Pass
------------------------------------
avec aucun caractere visible ni devant ni derriere (puique je recupere les
chaines de cararcteres)

Voici mon code actu. Que dois-je modifier ??

------------------------------------
Private Sub cbCREAT_Click()

Dim nom As String
Dim pass As String
Dim NumFich As Integer
Dim NomFich As String
Dim I As Integer
Dim ligne_info As String

nom = InputBox("Nom", "Nom de connexion ?")
pass = InputBox("Password", "Votre mot de passe ?")

NumFich = FreeFile
NomFich = App.Path & "\logmail.txt"

Open NomFich For Output As NumFich
For I = 1 To 3
While Not EOF(1)
If I = 1 Then
ligne_info = nom
Put NumFich, I, ligne_info
End If
If I = 2 Then
ligne_info = pass
Put NumFich, I, ligne_info
End If
If I = 3 Then
Close NumFich
Exit Sub
End If
I = I + 1
Wend
Next

Close NumFich

End Sub

6 réponses

Avatar
ng
Salut,

Une ouverture en OutPut provoque l'ecrasement du fichier s'il existait, je
ne vois donc pas l'utilité de EOF.

J'écrirai simplement ceci :

Private Sub cbCREAT_Click()
Dim nom As String
Dim pass As String
Dim NumFich As Integer
Dim NomFich as String

nom = InputBox("Nom", "Nom de connexion ?")
pass = InputBox("Password", "Votre mot de passe ?")

NumFich = FreeFile

'//attention à cela, ce n'est pas toujours vrai !
'//je te conseille d'utiliser une variable globale sAppChe par exemple
'// et de mettre ceci au démarrage de l'appli :
'//If Right$(App.Path, 1) = "" Then sAppChe = App.Path Else sAppChe App.Path & ""
'//Il suffirait alors de l'utiliser ainsi :
'//NomFich = sAppChe & "logmail.txt"

NomFich = App.Path & "logmail.txt"


Open NomFich For Output As #NumFich
print #NumFich, nom
print #NumFich, pass
Close #NumFich

End Sub

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
"Shewy du 80 !!" <not> a écrit dans le message de
news:
Bonjour à tous
Je dois écrire dans un fichier texte. Chose que je sais faire, mais
apparement pas assz bien !

En fait je dois écire à la ligne mes champs. JE n'y parviens pas.

LE résultat de mon fichier doit etre :
-------------------------------------
Nom
Pass
------------------------------------
avec aucun caractere visible ni devant ni derriere (puique je recupere les
chaines de cararcteres)

Voici mon code actu. Que dois-je modifier ??

------------------------------------
Private Sub cbCREAT_Click()

Dim nom As String
Dim pass As String
Dim NumFich As Integer
Dim NomFich As String
Dim I As Integer
Dim ligne_info As String

nom = InputBox("Nom", "Nom de connexion ?")
pass = InputBox("Password", "Votre mot de passe ?")

NumFich = FreeFile
NomFich = App.Path & "logmail.txt"

Open NomFich For Output As NumFich
For I = 1 To 3
While Not EOF(1)
If I = 1 Then
ligne_info = nom
Put NumFich, I, ligne_info
End If
If I = 2 Then
ligne_info = pass
Put NumFich, I, ligne_info
End If
If I = 3 Then
Close NumFich
Exit Sub
End If
I = I + 1
Wend
Next

Close NumFich

End Sub






Avatar
François Picalausa
Hello,

Essaye ceci:

Dim FreeFileNumber As Integer

FreeFileNumber = FreeFile

Open "MonFichier" For Binary As FreeFileNumber
Put FreeFileNumber, , Nom & vbCrLf
Put FreeFileNumber, , pass & vbCrLf
Close FreeFileNumber

Sinon, concernant ton code:
Open NomFich For Output As NumFich


Output est lent en écriture, ou du moins, plu lent que Binary

While Not EOF(1)


Qu'est ce que ce EOF(1)?
A quoi correspond le 1?

If I = 1 Then



Au lieu d'utiliser un for, ne pourrais-tu pas faire des écritures
séquencielles?

If I = 3 Then
Close NumFich
Exit Sub
End If


Quel besoin de l'inclure dans la boucle While Wend?

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Shewy du 80 !!" <not> a écrit dans le message de
news:
Bonjour à tous
Je dois écrire dans un fichier texte. Chose que je sais faire, mais
apparement pas assz bien !

En fait je dois écire à la ligne mes champs. JE n'y parviens pas.

LE résultat de mon fichier doit etre :
-------------------------------------
Nom
Pass
------------------------------------
avec aucun caractere visible ni devant ni derriere (puique je
recupere les chaines de cararcteres)

Voici mon code actu. Que dois-je modifier ??

------------------------------------
Private Sub cbCREAT_Click()

Dim nom As String
Dim pass As String
Dim NumFich As Integer
Dim NomFich As String
Dim I As Integer
Dim ligne_info As String

nom = InputBox("Nom", "Nom de connexion ?")
pass = InputBox("Password", "Votre mot de passe ?")

NumFich = FreeFile
NomFich = App.Path & "logmail.txt"

Open NomFich For Output As NumFich
For I = 1 To 3
While Not EOF(1)
If I = 1 Then
ligne_info = nom
Put NumFich, I, ligne_info
End If
If I = 2 Then
ligne_info = pass
Put NumFich, I, ligne_info
End If
If I = 3 Then
Close NumFich
Exit Sub
End If
I = I + 1
Wend
Next

Close NumFich

End Sub


Avatar
Shewy du 80 !!
Nikel !!!!
J'étais partit loin .... trrop loin !!
Je pensais que pour écrire à la ligne, il fallait envoyé un caractere de
retour à la ligne !
au moins maintenant je sais !!

Merci à toi de ta rapide réponse.

Bonne prog' à toi l'ami

--

"ng" a écrit dans le message de
news:
Salut,

Une ouverture en OutPut provoque l'ecrasement du fichier s'il existait, je
ne vois donc pas l'utilité de EOF.

J'écrirai simplement ceci :

Private Sub cbCREAT_Click()
Dim nom As String
Dim pass As String
Dim NumFich As Integer
Dim NomFich as String

nom = InputBox("Nom", "Nom de connexion ?")
pass = InputBox("Password", "Votre mot de passe ?")

NumFich = FreeFile

'//attention à cela, ce n'est pas toujours vrai !
'//je te conseille d'utiliser une variable globale sAppChe par exemple
'// et de mettre ceci au démarrage de l'appli :
'//If Right$(App.Path, 1) = "" Then sAppChe = App.Path Else sAppChe > App.Path & ""
'//Il suffirait alors de l'utiliser ainsi :
'//NomFich = sAppChe & "logmail.txt"

NomFich = App.Path & "logmail.txt"


Open NomFich For Output As #NumFich
print #NumFich, nom
print #NumFich, pass
Close #NumFich

End Sub

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
"Shewy du 80 !!" <not> a écrit dans le message de
news:
> Bonjour à tous
> Je dois écrire dans un fichier texte. Chose que je sais faire, mais
> apparement pas assz bien !
>
> En fait je dois écire à la ligne mes champs. JE n'y parviens pas.
>
> LE résultat de mon fichier doit etre :
> -------------------------------------
> Nom
> Pass
> ------------------------------------
> avec aucun caractere visible ni devant ni derriere (puique je recupere


les
> chaines de cararcteres)
>
> Voici mon code actu. Que dois-je modifier ??
>
> ------------------------------------
> Private Sub cbCREAT_Click()
>
> Dim nom As String
> Dim pass As String
> Dim NumFich As Integer
> Dim NomFich As String
> Dim I As Integer
> Dim ligne_info As String
>
> nom = InputBox("Nom", "Nom de connexion ?")
> pass = InputBox("Password", "Votre mot de passe ?")
>
> NumFich = FreeFile
> NomFich = App.Path & "logmail.txt"
>
> Open NomFich For Output As NumFich
> For I = 1 To 3
> While Not EOF(1)
> If I = 1 Then
> ligne_info = nom
> Put NumFich, I, ligne_info
> End If
> If I = 2 Then
> ligne_info = pass
> Put NumFich, I, ligne_info
> End If
> If I = 3 Then
> Close NumFich
> Exit Sub
> End If
> I = I + 1
> Wend
> Next
>
> Close NumFich
>
> End Sub
>
>
>
>




Avatar
ng
Salut,

Je pensais que pour écrire à la ligne, il fallait envoyé un caractere de
retour à la ligne !


L'instruction Print place automatiquement les caractères de retour à la
ligne (CR & LF). Pour ne pas aller à la ligne en utilise Print #NumFich,
strChaine; <= avec un ; à la fin

On on a donc Print #NumFich, strChaine qui équivaut à Print #NumFich,
strChaine & vbCrLf;


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
"Shewy du 80 !!" <not> a écrit dans le message de
news:
Nikel !!!!
J'étais partit loin .... trrop loin !!
Je pensais que pour écrire à la ligne, il fallait envoyé un caractere de
retour à la ligne !
au moins maintenant je sais !!

Merci à toi de ta rapide réponse.

Bonne prog' à toi l'ami

--

"ng" a écrit dans le message de
news:
> Salut,
>
> Une ouverture en OutPut provoque l'ecrasement du fichier s'il existait,


je
> ne vois donc pas l'utilité de EOF.
>
> J'écrirai simplement ceci :
>
> Private Sub cbCREAT_Click()
> Dim nom As String
> Dim pass As String
> Dim NumFich As Integer
> Dim NomFich as String
>
> nom = InputBox("Nom", "Nom de connexion ?")
> pass = InputBox("Password", "Votre mot de passe ?")
>
> NumFich = FreeFile
>
> '//attention à cela, ce n'est pas toujours vrai !
> '//je te conseille d'utiliser une variable globale sAppChe par exemple
> '// et de mettre ceci au démarrage de l'appli :
> '//If Right$(App.Path, 1) = "" Then sAppChe = App.Path Else sAppChe > > App.Path & ""
> '//Il suffirait alors de l'utiliser ainsi :
> '//NomFich = sAppChe & "logmail.txt"
>
> NomFich = App.Path & "logmail.txt"
>
>
> Open NomFich For Output As #NumFich
> print #NumFich, nom
> print #NumFich, pass
> Close #NumFich
>
> End Sub
>
> --
> Nicolas G.
> FAQ VB : http://faq.vb.free.fr
> API Guide : http://www.allapi.net
> Google Groups : http://groups.google.fr/
> MZ-Tools : http://www.mztools.com/
> "Shewy du 80 !!" <not> a écrit dans le message de
> news:
> > Bonjour à tous
> > Je dois écrire dans un fichier texte. Chose que je sais faire, mais
> > apparement pas assz bien !
> >
> > En fait je dois écire à la ligne mes champs. JE n'y parviens pas.
> >
> > LE résultat de mon fichier doit etre :
> > -------------------------------------
> > Nom
> > Pass
> > ------------------------------------
> > avec aucun caractere visible ni devant ni derriere (puique je recupere
les
> > chaines de cararcteres)
> >
> > Voici mon code actu. Que dois-je modifier ??
> >
> > ------------------------------------
> > Private Sub cbCREAT_Click()
> >
> > Dim nom As String
> > Dim pass As String
> > Dim NumFich As Integer
> > Dim NomFich As String
> > Dim I As Integer
> > Dim ligne_info As String
> >
> > nom = InputBox("Nom", "Nom de connexion ?")
> > pass = InputBox("Password", "Votre mot de passe ?")
> >
> > NumFich = FreeFile
> > NomFich = App.Path & "logmail.txt"
> >
> > Open NomFich For Output As NumFich
> > For I = 1 To 3
> > While Not EOF(1)
> > If I = 1 Then
> > ligne_info = nom
> > Put NumFich, I, ligne_info
> > End If
> > If I = 2 Then
> > ligne_info = pass
> > Put NumFich, I, ligne_info
> > End If
> > If I = 3 Then
> > Close NumFich
> > Exit Sub
> > End If
> > I = I + 1
> > Wend
> > Next
> >
> > Close NumFich
> >
> > End Sub
> >
> >
> >
> >
>
>




Avatar
Patrice Henrio
Je ne suis pas sûr que pour lire ou écrire deux données, le mode binary soit
d'une telle rapidité que l'on puisse faire la différence avec Output.

Dans le même ordre d'idée, les boucles sont, je pense, plus rapides qu'une
suite de If then else. Ici le vrai problème c'est que c'est une mauvaise
utilisation d'une boucle. On utilise une boucle si on fait plusieurs fois la
même action. A la rigueur on peut accepter une action distincte à l'entrée
ou à la sortie.

Je n'utilise FreeFile que lorsque je ne peux pas faire autrement, c'est à
die si j'ai beaucoup de fichiers ouverts et que je ne sais plus où j'en
suis. dans le cas de fichiers ouvert et fermés immédiatement j'utilise le
numéro de fichier (#1 ici).

Par contre d'accord avec ng pour dire que le while wend est tout a fait
inutile et même contradictoire avec la boucle : on utilise l'un ou l'autre.
Si l'on est sûr de ce que l'on doit trouver dans le fichier séquentiel, une
boucle est mieux, mais à condition qu'il y ait suffisamment de passages pour
le justifier.

Donc cela donne ce que proposait ng (sauf pour freefile).


"François Picalausa" a écrit dans le message de
news:%
Hello,

Essaye ceci:

Dim FreeFileNumber As Integer

FreeFileNumber = FreeFile

Open "MonFichier" For Binary As FreeFileNumber
Put FreeFileNumber, , Nom & vbCrLf
Put FreeFileNumber, , pass & vbCrLf
Close FreeFileNumber

Sinon, concernant ton code:
> Open NomFich For Output As NumFich
Output est lent en écriture, ou du moins, plu lent que Binary

> While Not EOF(1)
Qu'est ce que ce EOF(1)?
A quoi correspond le 1?

> If I = 1 Then

Au lieu d'utiliser un for, ne pourrais-tu pas faire des écritures
séquencielles?

> If I = 3 Then
> Close NumFich
> Exit Sub
> End If
Quel besoin de l'inclure dans la boucle While Wend?

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Shewy du 80 !!" <not> a écrit dans le message de
news:
> Bonjour à tous
> Je dois écrire dans un fichier texte. Chose que je sais faire, mais
> apparement pas assz bien !
>
> En fait je dois écire à la ligne mes champs. JE n'y parviens pas.
>
> LE résultat de mon fichier doit etre :
> -------------------------------------
> Nom
> Pass
> ------------------------------------
> avec aucun caractere visible ni devant ni derriere (puique je
> recupere les chaines de cararcteres)
>
> Voici mon code actu. Que dois-je modifier ??
>
> ------------------------------------
> Private Sub cbCREAT_Click()
>
> Dim nom As String
> Dim pass As String
> Dim NumFich As Integer
> Dim NomFich As String
> Dim I As Integer
> Dim ligne_info As String
>
> nom = InputBox("Nom", "Nom de connexion ?")
> pass = InputBox("Password", "Votre mot de passe ?")
>
> NumFich = FreeFile
> NomFich = App.Path & "logmail.txt"
>
> Open NomFich For Output As NumFich
> For I = 1 To 3
> While Not EOF(1)
> If I = 1 Then
> ligne_info = nom
> Put NumFich, I, ligne_info
> End If
> If I = 2 Then
> ligne_info = pass
> Put NumFich, I, ligne_info
> End If
> If I = 3 Then
> Close NumFich
> Exit Sub
> End If
> I = I + 1
> Wend
> Next
>
> Close NumFich
>
> End Sub




Avatar
François Picalausa
Hello!

"Patrice Henrio" a écrit dans le
message de news:
Je ne suis pas sûr que pour lire ou écrire deux données, le mode
binary soit d'une telle rapidité que l'on puisse faire la différence
avec Output.



Voici les résultats d'un benchmark avec CStopWatch de
http://www.mvps.org/vb/
Option Explicit

Private Const FilePath As String = "e:mydatatest.txt"

Sub Main()
Const LOOPS = 10

Dim i As Long

Dim tLoop As Long
Dim t1 As Long
Dim t2 As Long

Dim StopWatch As CStopWatch

Set StopWatch = New CStopWatch

StopWatch.Reset
For i = 1 To LOOPS
Next i
tLoop = StopWatch.Elapsed

StopWatch.Reset
For i = 1 To LOOPS
WriteForOutput
Next i
t1 = StopWatch.Elapsed

StopWatch.Reset
For i = 1 To LOOPS
WriteForBinary
Next i
t2 = StopWatch.Elapsed

MsgBox "Résultats :" & vbCrLf & "Output : " & t1 - tLoop & vbCrLf &
"Binary : " & t2 - tLoop
End Sub

Private Sub WriteForOutput()
Dim FFN As Integer

FFN = FreeFile

Open FilePath For Output As FFN
Print #FFN, "Line1"
Print #FFN, "Line2"
Close FFN
End Sub


Private Sub WriteForBinary()
Dim FFN As Integer

FFN = FreeFile

Open FilePath For Binary As FFN
Put FFN, , "Line1" & vbCrLf
Put FFN, , "Line2" & vbCrLf
Close FFN
End Sub


Pour ce test là, j'ai les résultats suivants (compilé bien entendu):
'---------------------------
'Projet1
'---------------------------
'Résultats:
'
'Output : 6
'
'Binary : 2
'---------------------------
'OK
'---------------------------
Mais en moyenne, binary ne va que 2 fois plus vite que output.

Dans le même ordre d'idée, les boucles sont, je pense, plus rapides
qu'une suite de If then else. Ici le vrai problème c'est que c'est
une mauvaise utilisation d'une boucle. On utilise une boucle si on
fait plusieurs fois la même action. A la rigueur on peut accepter une
action distincte à l'entrée ou à la sortie.



C'est pour ça que dans mon code elles n'apparaissaient plus :-)
Tout à fait d'accord avec toi!

Je n'utilise FreeFile que lorsque je ne peux pas faire autrement,
c'est à die si j'ai beaucoup de fichiers ouverts et que je ne sais
plus où j'en suis. dans le cas de fichiers ouvert et fermés
immédiatement j'utilise le numéro de fichier (#1 ici).



C'est pourtant nettement plus facile pour la réutilisation.
Et suppose que l'utilisateur effectue une action imprévue et fasse ouvrir un
fichier alors qu'un autre est ouvert sous le même numéro?
Tu ne peux jamais dire à l'utilisateur "Ne faites pas de conneries!", donc
il vaut mieux prévoir que le code a probablement des imperfections et éviter
le bug éventuel, aussi improbable soit-il.

Par contre d'accord avec ng pour dire que le while wend est tout a
fait inutile



on est trois :-)
Par contre, je n'ai toujours pas compris cette histoire de EOF(1)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net