Page 1 sur 1
Ecriture fichier
Publié : lun. 19/avr./2004 21:47
par LavaLava
Pour l'ajout de données dans un fichier, je n'ai pas trouvé de commande d'ouverture en mode 'insertion'.
A moins qu'il existe une autre methode ?
Publié : lun. 19/avr./2004 22:44
par nico
Il suffit de déplacer le pointeur d'écriture:
Code : Tout sélectionner
#Fichier=0
Resultat = OpenFile(#Fichier, "C:\texte.txt")
While Eof(#Fichier)=0
chaine$=chaine$+ReadString()+Chr(13)+Chr(10)
Wend
;Debug Len(chaine$)
FileSeek(Len(chaine$))
WriteStringN("nico")
CloseFile(#Fichier)
End
Publié : mar. 20/avr./2004 15:52
par LavaLava
Merci, mais c'est déjà ce que je fais ...
Cad transférer le contenu du fichier dans une variable, l'editer puis la resauver dans un fichier.
Mais comme je manipule des fichier de 150/200 ko je suis obligé d'utiliser plusieur variable est c'est trés lourd !
Ce que je cherche c'est par exemple :
Contenue du fichier est :
"Lundi
Mardi
Jeudi"
Ouvrir le fichier en mode 'Insertion'
Mettre le pointeur sur le 'J'
Ecrire "Mercredi"
Fermer le fichier
Résultat et contenue du fichier :
"Lundi
Mardi
Mercedi
Jeudi"
Publié : mar. 20/avr./2004 19:04
par nico
LavaLava,
Si tu pouvais donner un petit bout de code pour l'insertion d'une chaine (pour un petit fichier), j'aimerais comprendre comment tu fais!

Publié : mar. 20/avr./2004 21:41
par LavaLava
Cet exemple est purement d'école et n'a aucune réalité.
Voila ce que je fait en ce moment :
Dim Jour$(10)
I=0
If OpenFile(0, "C:\texte.txt")
While Eof(0)=0
I=I+1
Jour$(I)=ReadString()
Wend
CloseFile(0)
Jour$(4)=Jour$(3)
Jour$(3)="Mercredi"
If CreateFile(0,C:\texte.txt")
For J=1 to I+1
WriteSringN( Jour$(J) )
Next J
CloseFile(0)
Endif
Endif
Et voila ce que j'aurais aimé faire et qui existe dans d'autres langages ...
If OpenFile(0, "C:\texte.txt",#MODE_INSERTION)
Repeat
Jour$=ReadString()
Until Jour$="Mardi" CloseFile(0)
; Le pointeur est sur le "J" de Jeudi
WriteSringN( "Mercredi" )
; On insére "Mercredi" en décalant se qui suit, Cad "Jeudi"
CloseFile(0)
Endif
En réalité je gére un répertoire de nom, et ce probléme se pose quand je veux rajouter un nom...
Publié : mar. 20/avr./2004 22:04
par nico
Tu as posté un code en sachant que jour$(3) correspondait à jeudi mais tu n'est pas censé savoir ce que contient la chaine !!???
Sinon de mon coté, j'ai pondu ça:
Je n'utilise qu'un seul fichier puisque comme je rajoute une ligne, il n'y a pas de problème de retrouver d'anciennes chaines en fin de fichier.
dis moi si ça t'aide?
Code : Tout sélectionner
;Cette procédure insère une nouvelle chaîne en dessous des lignes contenant le mot spécifié
;Exemple pour le mot recherché "mercredi":
;---------Avant------------
;Lundi, je bulle
;et mardi pareil
;sinon mercredi à la plage
;vendredi, repos bien mérité
;---------Après------------
;Lundi, je bulle
;et mardi pareil
;sinon mercredi à la plage
;jeudi retour à la plage, ça roule
;vendredi, repos bien mérité
;--------------------------
Procedure Inser_Ligne(Fichier.s,Mot_a_Trouve.s,Chaine_Ajoutee.s)
#Fichier=0
If OpenFile(#Fichier, Fichier)
While Eof(#Fichier)=0
chaine$=ReadString()
Pos = FindString(chaine$, Mot_a_Trouve, 1)
If Pos > 0
chaine$=chaine$+Chr(13)+Chr(10)+Chaine_Ajoutee
EndIf
chaine1$=chaine1$+chaine$+Chr(13)+Chr(10)
Wend
FileSeek(0)
WriteString(chaine1$)
CloseFile(#Fichier)
Else
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
If Inser_Ligne("C:\texte.txt","mercredi","jeudi retour à la plage, ça roule")
MessageRequester("Info","opération réussi")
EndIf
End
Publié : mar. 20/avr./2004 22:41
par LavaLava
Nico, je te remercie pour ton aide, mais je crois que l'on ne sais pas compris ...
Je n'ai pas de probléme pour réaliser ce que je veux, mais je trouve que c'est trés lourd comme code !
D'ou ce post dans la rubrique 'Suggestions et améliorations'.
De plus, s'il est vrai que ta routine fonctionne bien, que va t'il se passer si le fichier fait plus de 65536 octets ?
Elle ne marchera plus car c'est la taille maxi d'une variable Sting !
Ce qui est mon cas et m'oblige à utiliser plusieur variables.
Par contre, j'ai bien apprecié ton emploi du temps de la semaine ... Ne serais tu pas aussi du Sud ...
Publié : mar. 20/avr./2004 23:49
par nico
Lors de mon premier post, je n'avais pas saisi le problème d'insertion alors j'ai essayé de voir comment faire.
Sinon j'ai modifié le code, il n'y a plus de problème de longueur de string , de plus je n'utilise plus qu'une seule petite chaine
J'ai compris que tu n'avais pas besoin d'un code mais j'aimerais bien que tu l'essayes, juste pour savoir si ça fonctionne bien (dans un cas réel)!
Merci
Je ne suis pas originaire du Sud mais de l'Ouest, de la Vendée précisément.
et pour ce qui est de l'emploi du temps, comme tu peux le voir sur mon avatar, je suis un doux rêveur!
Voici le code:
[EDIT du 21/04/04] ->Le code à été modifié
Code : Tout sélectionner
;Cette procédure insère une nouvelle chaîne en dessous des lignes contenant le mot spécifié
;Exemple pour le mot recherché "mercredi" dans le fichier suivant:
;---------Avant------------
;Lundi, je bulle
;et mardi pareil
;sinon mercredi à la plage
;vendredi, repos bien mérité
;---------Après------------
;Lundi, je bulle
;et mardi pareil
;sinon mercredi à la plage
;jeudi retour à la plage, ça roule
;vendredi, repos bien mérité
;--------------------------
Procedure Inser_Ligne(Fichier.s,Mot_a_Trouve.s,Chaine_Ajoutee.s)
#Fichier=0
#Fichier1=1
;Ici on cré un fichier temporaire sous le même répertoire
For a= Len(Fichier) To 1 Step -1
If Mid(Fichier, a, 1) ="\"
Fichier2.s=Mid(Fichier, 1,a)+"Temporaire.temp"
;Debug Fichier2
Break
EndIf
Next a
If CopyFile(Fichier,Fichier2)
If OpenFile(#Fichier1, Fichier2)
If CreateFile(#Fichier, Fichier)
While Eof(#Fichier1)=0
UseFile(#Fichier1)
chaine$=ReadString()
Pos = FindString(chaine$, Mot_a_Trouve, 1)
If Pos > 0
chaine$=chaine$+Chr(13)+Chr(10)+Chaine_Ajoutee
EndIf
UseFile(#Fichier)
WriteStringN(chaine$)
Wend
CloseFile(#Fichier)
retour.b=#True
EndIf
CloseFile(#Fichier1)
EndIf
EndIf
ProcedureReturn retour
EndProcedure
If Inser_Ligne("C:\test.txt","mercredi","jeudi retour à la plage, ça roule")
MessageRequester("Info","opération réussi")
EndIf
End
Publié : mer. 21/avr./2004 5:47
par cederavic
pour les grandes chaine, il faut utiliser les pointeur

ceci dit, c'est vrai que des fonctions genre InsertString() et InsertStringN() serait la bienvenue

Publié : mer. 21/avr./2004 11:14
par LavaLava
La nuit porte conseil ....
Et on à eut la méme idée ... J'ai pissé à peut prêt les mémé ligne de code !
Je n'ai pas testé ton code mais je l'ai etudié attentivement et il doit tourner.
J'ai adapté et commenté quelques détails :
[
CopyFile(Fichier,Fichier_Sauvegarde)
If OpenFile(#Fichier1, Fichier_Sauvegarde)
; FileSeek(0) ; N'a pas d'utilté c'est inherent à l'ouverture d'un fichier
If CreateFile(#Fichier, Fichier) ; Le createFile permet d'initialiser le fichier
While Eof(#Fichier1)=0
UseFile(#Fichier1)
chaine$=ReadString()+Chr(13)+Chr(10)
Pos = FindString(chaine$, Mot_a_Trouve, 1)
If Pos > 0
chaine$=chaine$+Chaine_Ajoutee ; +Chr(13)+Chr(10) n(est pas utile
EndIf
UseFile(#Fichier)
WriteStringN(chaine$) ; le WriteStringN sert bien !
Wend
CloseFile(#Fichier)
Else
retour=#False
EndIf
Else
retour=#False
CloseFile(#Fichier1) ; le close doit être avant le Endif
EndIf
ProcedureReturn retour
EndProcedure
]
Une question bête, puisque je ne connais pas la réponse : Dans un post, comment fait on pour définir une zone de code ?
Pour finir, je trouve les InsertString() de cederavic plutôt bien trouvé ! Alors à quand leur intégration dans PB ?
Publié : mer. 21/avr./2004 17:30
par nico
Pour définir une zone de code, tu sélectionnes ton texte puis tu cliques sur Code situé juste au dessous du Combobox Taille!
Bien entendu, je suis toujours pour de nouvelles fonctions, ne serait-ce pour la portabilité!
Suite à ton message, j'ai modifié le code.

Publié : mer. 21/avr./2004 20:06
par LavaLava
Bordel de pompe à chiot ! J'ai appuyé 36 fois sur ce bouton ...
mais avant d'écrire le texte et forcément ça marche moins bien. J'ai du trop joué avec la logique floue avant de venir ici, cé agaçant !
A tout cas merci.
Publié : mer. 21/avr./2004 20:13
par cederavic
sinon, tu click sur Code pour ouvrir la balise, tu tape (enfin souvent colle lol) ton code et tu reclick sur Code* pour fermé la balise
