Ecriture fichier

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Ecriture fichier

Message 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 ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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"
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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!

:)
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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 ...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 :wink:

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! :D

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
Dernière modification par nico le mer. 21/avr./2004 17:31, modifié 1 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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 :)
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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 ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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. :)
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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 :)
Répondre