Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Novice] Ecrire une ligne en fin d'un fichier texte

15 réponses
Avatar
Dom
Bonjour à tous,

Je débute sous VB et rencontre un petit "soucis".
Au sein d'un fichier texte, je souhaiterai ecrire une ligne vide à la suite
de la dernière ligne du fichier (un retour charriot en fait).
J'ai tenté de ré écrire le fichier texte en mettant en tampon (buffer) le
fichier initial puis en re écrivant le fichier final en l'alimentant du
contenu du buffer + 1 ligne vierge. Mais ca marche pas !
J'imagine pourtant que ce ne doit pas être très compliqué. Quelqu'un
pourrait il me donner un exemple ?
1000 mercis à vous.

Dom

10 réponses

1 2
Avatar
Zoury
Salut Dom! :O)

voici un exemple (non testé)
'***
' Module1
Option Explicit

Private Sub Main()

Dim hFile As Long
Dim sFile As String

hFile = FreeFile ' obtiens un handle libre
Open "c:mon_fichier.txt" For Binary As #hFile
Seek #hFile, LOF(hFile) ' amène le pointeur à la fin du fichier
Put #hFile, , vbNewLine & "blablablabla" ' on rajoute notre texte
Close #hFile

End Sub
'***


tu peux aussi utiliser ma classe CFile qui est conçu pour te faciliter la
vie.. :
'***
' Module1
Option Explicit

Private Sub Main()

Dim f As CFile
Set f = New CFile

Call f.OpenFile("c:mon_fichier.txt")
Call f.AppendLine("blablablabla")
Call f.SaveFile

End Sub
'***
elle est disponible ici :
http://groups.google.com/groups?selm=uKyYolctDHA.2464%40TK2MSFTNGP12.phx.gbl


si tu utilise le FileSystemObject, lit ceci :
http://faq.vb.free.fr/index.php?question6
et utilise une des techniques mentionnées ci-haut ;O)

--
Cordialement
Yanick Lefebvre
MVP pour Visual Basic
Avatar
Dom
Re bonsoir,

Après tests et recherche, je pense que mon soucis viens de mon incapacité à
mettre ds une variable de type buffer l'ensemble des lignes d'un fichier.
Comment donc, lire toutes les lignes d'un fichier jusque sa fin pour ensuite
les mettre ds un tampon avant d'envisager l'écriture de ce tampon ds un
autre fichier texte ?
Merci encore

Dom
Avatar
scraper
Bonjour Dom
(dans news:%)
tu nous disais :

Re bonsoir,

Après tests et recherche, je pense que mon soucis viens de mon
incapacité à mettre ds une variable de type buffer l'ensemble des
lignes d'un fichier. Comment donc, lire toutes les lignes d'un
fichier jusque sa fin pour ensuite les mettre ds un tampon avant
d'envisager l'écriture de ce tampon ds un autre fichier texte ?
Merci encore



vois ici, tu as un exemple qui devrait te convenir ??

http://groups.google.fr/groups?qìrire+fichier+binaire+VB&hl=fr&lr=&selm=%23VeHM1vCDHA.2172%40TK2MSFTNGP12.phx.gbl&rnum=2






--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Jean-Marc
"Dom" a écrit dans le message de
news:%
Re bonsoir,

Après tests et recherche, je pense que mon soucis viens de mon incapacité


à
mettre ds une variable de type buffer l'ensemble des lignes d'un fichier.
Comment donc, lire toutes les lignes d'un fichier jusque sa fin pour


ensuite
les mettre ds un tampon avant d'envisager l'écriture de ce tampon ds un
autre fichier texte ?
Merci encore



Hello,

alors quand on débute, il faut commencer simple.

Pour ouvrir un fichier en LECTURE (non binaire):
=> Open "fichier.txt" for INPUT as #f
Pour ouvrir un fichier en ECRITURE (non binaire):
=> Open "fichier.txt" for OUTPUT as #f

Note: en OUTPUT, si le fichier existe déjà, il va
être détruit.
Enfin,
Pour ouvrir un fichier en AJOUT (non binaire):
=> Open "fichier.txt" for APPEND as #f

Ce mode est intéressant pour ouvrir le fichier
en écriture, et ajouter des données à la suite
du contenu pré existant (c'est le sens de APPEND).

Finalement,
pour lire tout un fichier texte, voici une façon
simple à comprendre. Surement pas la façon la plus
performante, mais tout à fait ok dans 99,9% des cas,
et en tout cas didactique, ce qui est le point qui
nous intéresse ici.

L'exemple suivant va ouvrir un fichier TEXTE,
lire le contenu entier dans un Buffer (ligne par ligne)
puis écrire le buffer complet dans un autre fichier,
en une fois.

' --
Private Sub LireFichier()
Dim f As Integer
Dim s As String
Dim Buffer As String

f = FreeFile
Open "c:essai.txt" For Input As #f
While Not EOF(f)
Line Input #f, s
Buffer = Buffer & s
Wend
Close #f

f = FreeFile
Open "c:essai2.txt" For Output As #f
Print #f, Buffer
Close #f
End Sub

Bien entendu, il faut lire la documentation:
- Touche F1 sur n'import quel mot clé
- Depuis l'IDE, Help .. Index
- Sur le Net, dans MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconprogrammersguide.asp


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
ng
Salut,

Regarde ces exemples peut être :

Private Sub Form_Load()

'//EXEMPLE 1 : Gestion par ligne

Dim k As Integer, strBuffer As String, tblLines() As String

k = FreeFile
Open "c:fichier.txt" For Binary As #k
'//Préparation du buffer
strBuffer = String$(LOF(k), vbNullChar)
'//remplissage à partir du fichier
Get #k, , strBuffer
Close #k

'//séparation en ligne dans un tableau
tblLines = Split(strBuffer, vbCrLf): strBuffer = ""

For k = 0 To UBound(tblLines)
'//énumération des lignes
MsgBox tblLines(k)
Next

'//Si on veut ajouter une ligne :
ReDim Preserve tblLines(UBound(tblLines) + 1)

'//Valeur de la nouvelle ligne, on peut laisser "" pour une ligne vide
tblLines(UBound(tblLines)) = "Ma nouvelle ligne"

'//Ecriture des modifs ds le fichier :

k = FreeFile
Open "c:fichier.txt" For Output As #k
Print #k, Join(tblLines, vbCrLf);
Close #k

Erase tblLines
End Sub





Private Sub Form_Load()

'//EXEMPLE 2 : Ajout direct dans le buffer

Dim k As Integer, strBuffer As String

k = FreeFile
Open "c:fichier.txt" For Binary As #k
'//Préparation du buffer
strBuffer = String$(LOF(k), vbNullChar)
'//remplissage à partir du fichier
Get #k, , strBuffer
Close #k


'//Si on veut ajouter une ligne :
strBuffer = strBuffer & vbCrLf & "Ma nouvelle ligne"

'//Ecriture des modifs ds le fichier :

k = FreeFile
Open "c:fichier.txt" For Output As #k
Print #k, strBuffer;
Close #k

strBuffer = ""
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/

Dom wrote:
Bonjour à tous,

Je débute sous VB et rencontre un petit "soucis".
Au sein d'un fichier texte, je souhaiterai ecrire une ligne vide à la
suite de la dernière ligne du fichier (un retour charriot en fait).
J'ai tenté de ré écrire le fichier texte en mettant en tampon
(buffer) le fichier initial puis en re écrivant le fichier final en
l'alimentant du contenu du buffer + 1 ligne vierge. Mais ca marche
pas !
J'imagine pourtant que ce ne doit pas être très compliqué. Quelqu'un
pourrait il me donner un exemple ?
1000 mercis à vous.

Dom


Avatar
scraper
Bonjour Jean-Marc
(dans news:4170cb70$0$13095$)
tu nous disais :

Hello,

alors quand on débute, il faut commencer simple.



oui

Pour ouvrir un fichier en LECTURE (non binaire):
=> Open "fichier.txt" for INPUT as #f
Pour ouvrir un fichier en ECRITURE (non binaire):
=> Open "fichier.txt" for OUTPUT as #f

Note: en OUTPUT, si le fichier existe déjà, il va
être détruit.



et en binaire ?

si je veux que le fichier que j'ouvre soit détruit (enfin, sa vieille
version ?)
ça fonctionne aussi ?

merci


--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Jean-Marc
"scraper" a écrit dans le message de
news:%
Bonjour Jean-Marc
(dans news:4170cb70$0$13095$)
tu nous disais :



> Pour ouvrir un fichier en ECRITURE (non binaire):
> => Open "fichier.txt" for OUTPUT as #f
>
> Note: en OUTPUT, si le fichier existe déjà, il va
> être détruit.

et en binaire ?



Pour les accès binaires, c'est un peu plus subtil.
Quand on ouvre en binaire, si le fichier existe, il
n'est pas détruit.
Le mode binaire est Read/Write.

si je veux que le fichier que j'ouvre soit détruit (enfin, sa vieille
version ?)
ça fonctionne aussi ?



Non, il faut faire différemment.

=> Voir la doc du Statement Open pour plus de détails.

Remarque enfin: Quand on ouvre en OUTPUT, le fichier
n'est pas à proprement détruit. Simplement, si il
existait, il est "remis à 0". Si on fait:

Open "c:test" for Output as #f
Close #f

Le fichier "C:test" n'est pas effacé, simplement il
va rester avec une taille de 0 octets.

Pour manipuler des fichiers TEXTE, le mode de prédilection
est vraiment INPUT, OUTPUT et APPEND. Ormis pour des raisons
de performances, il n'y a pas ou peu de raisons d'utiliser des
accès binaires (pour des fichiers TEXTE). Je ne dis pas
qu'il ne faut pas le faire; Simplement, je trouve qu'il est
plus naturel d'utiliser Input, Output et Append.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
scraper
Bonjour Jean-Marc
(dans news:4170f132$0$19548$)
tu nous disais :

Pour les accès binaires, c'est un peu plus subtil.
Quand on ouvre en binaire, si le fichier existe, il
n'est pas détruit.
Le mode binaire est Read/Write.



oui

Non, il faut faire différemment.

=> Voir la doc du Statement Open pour plus de détails.



OK, j'irai voir ... merci

Remarque enfin: Quand on ouvre en OUTPUT, le fichier
n'est pas à proprement détruit. Simplement, si il
existait, il est "remis à 0". Si on fait:

Open "c:test" for Output as #f
Close #f

Le fichier "C:test" n'est pas effacé, simplement il
va rester avec une taille de 0 octets.

Pour manipuler des fichiers TEXTE, le mode de prédilection
est vraiment INPUT, OUTPUT et APPEND. Ormis pour des raisons
de performances, il n'y a pas ou peu de raisons d'utiliser des
accès binaires (pour des fichiers TEXTE). Je ne dis pas
qu'il ne faut pas le faire; Simplement, je trouve qu'il est
plus naturel d'utiliser Input, Output et Append.



je comprends, et te remercie de ces précisions ....
en fait, c'est pour recopier le contenu de valeurs binaires du Registre dans
un fichier txt ?
je sais pas, vu le format spécifique des clés binaires, si ça conviendrait,
en output ?
sinon, effectivement, la procédure me conviendrait relativement ...

bon, je vais me documenter et essayer :-)

merci



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Zoury
Salut! :O)

alors quand on débute, il faut commencer simple.



f = FreeFile
Open "c:essai.txt" For Input As #f
While Not EOF(f)
Line Input #f, s
Buffer = Buffer & s
Wend
Close #f



amha, débuter n'est pas une excuse valable pour sacrifier temps et
mémoire... il me semble que même la méthode Intput$() est plus performante
que la boucle ci-haut. La vitesse d'exécution de ta fonction est inversement
proportionnelle à la taille du fichier et cela est dû à la manière dont VB
exécute la concaténation de chaine de caractères (Buffer = Buffer & s)..

j'avais posté ce message à l'époque si ça vous intéresse :
http://groups.google.com/groups?threadm=OR%24rp4eJDHA.336%40tk2msftngp13.phx.gbl


--
Cordialement
Yanick Lefebvre
MVP pour Visual Basic
Avatar
Patrice Henrio
amha, Yannick a voulu parler du temps d'exécution plutôt que de la vitesse
... ce dernier est proportionnel à la taille du fichier, ce qui en
programmation est considéré comme rapide (temps d'exécution dépendant
polynomialement des données).
Par contre le reste de son intervention est tout à fait adapté.

"Zoury" a écrit dans le message de news:
%
Salut! :O)

alors quand on débute, il faut commencer simple.



f = FreeFile
Open "c:essai.txt" For Input As #f
While Not EOF(f)
Line Input #f, s
Buffer = Buffer & s
Wend
Close #f



amha, débuter n'est pas une excuse valable pour sacrifier temps et
mémoire... il me semble que même la méthode Intput$() est plus performante
que la boucle ci-haut. La vitesse d'exécution de ta fonction est
inversement proportionnelle à la taille du fichier et cela est dû à la
manière dont VB exécute la concaténation de chaine de caractères (Buffer =
Buffer & s)..

j'avais posté ce message à l'époque si ça vous intéresse :
http://groups.google.com/groups?threadm=OR%24rp4eJDHA.336%40tk2msftngp13.phx.gbl


--
Cordialement
Yanick Lefebvre
MVP pour Visual Basic



1 2