Page 1 sur 2
Insérer un caractere dans un fichier texte
Publié : lun. 01/sept./2008 9:54
par coxco
Salut
Voila j'aimerais modifié un fichier texte, en insérant un caractère supplémentaire à un emplacement donné.
Je sais pas si c'est clair.
par exemple dès qu'à la lecture de la lettre 'e' il insère un caractère supplémentaire '*' .
Le fichier de départ serait :
aaaeeeerrrrppppp
Le fichier modifié serait :
aaae*e*e*e*rrrrppppp
J'avais pensé à copier le fichier en entier dans un tableau et
de le recopier, mais ne peux t'on pas insérer un caractère autrement ?
Merci
Publié : lun. 01/sept./2008 10:39
par djes
Regarde dans l'aide (touche F1 dans l'éditeur). Va dans la bibliothèque string (qui sert au traitement des chaînes de caractères) ; parcours une fois toutes les fonctions, ça peut toujours servir. Celle qui t'intéresse est "ReplaceString". L'exemple donné est suffisamment éloquent, je pense.
Publié : lun. 01/sept./2008 10:41
par Atomo
Il me semble que la seul possibilitée est de copier le contenu du fichier texte dans un nouveau fichier puis faire les modif pendant la copie/écriture.
Publié : lun. 01/sept./2008 11:08
par coxco
Oui pour findstring j'avais vu mais cela ne répond pas à ma question
Merci atomo
Il me semblait que je n'avais pas le choix
Merci
Publié : lun. 01/sept./2008 12:29
par djes
Si c'est vraiment un fichier texte, tu lis ligne par ligne ton fichier avec readstring(), ensuite tu remplaces la chaîne recherchée avec replacestring(), et tu écris avec writestring().
Sinon tu peux lire octet par octet (pour l'ascii-8 uniquement). C'est toi qui voit.
Publié : lun. 01/sept./2008 13:48
par coxco
Merci Djes
mais en fait je ne veux pas remplaçer un caractère je veux en insérer un dans le fichier à un endroit donné, sans pour autant passer par un tableau.
Mais merci quand même
Publié : lun. 01/sept./2008 13:53
par djes
Tu le fais exprès ou quoi???
Quand tu remplaces un e par e*, tu insères un caractère!!!!!!!!!!!!!!!!!!!!!!
Publié : lun. 01/sept./2008 14:21
par coxco
Ok merci Djes
mais en fait je me suis peut être mal expliqué, c'est par forcément
remplacer un e par un e* cela peut être n'importe quel caractère
Publié : lun. 01/sept./2008 15:09
par Ar-S
Voilà comment je procèderai
- tu copies en mémoire le contenu de ton string (nom : string$)
- tu comptes la totalité des caractères Nbr=len(string$)
Code : Tout sélectionner
string$="cacao de poulet mariné"
Nbr=Len(string$)
Position=1
For i = 1 To Nbr
car$=Mid(string$,Position,1) ; Lit le caractere se trouvant à 'Position'
car$=car$+"*" ; ajout du caractère '*' aprés le caractere trouvé
Position=Position+1 ; la position passe au caractere suivant
Debug car$ ; On test
Next
MessageRequester ("fin","fin")
End
Publié : lun. 01/sept./2008 15:15
par case
pour insérer 1 octet dans un fichier tu dois décaler tout ce qui suit de 1 octet et donc réécrire tout ce qui suit sur le disque. puisque tu dois tout déplacer physiquement
si ton fichier fait 5 octets par exemple 5 lettres de l'alphabet ABCDF
elles sont ecrite a un emplacement (x) sur le disque
par exemple
A(1)B(2)C(3)D(4)F(5)
si tu veux inserer un E entre le D et le F tu vas devoir réécrire le fichier pour avoir
A(1)B(2)C(3)D(4)E(5)F(6)
le plus simple est encore de créer un fichier temporaire dans le même répertoire et de lire le fichier original jusqu'à la position souhaitée en le réécrivant dans le fichier temporaire, ajouter le caractère et continuer de copier le contenu du fichier original dans le fichier temporaire. jusqu'à ce que ce soit la fin du fichier .
effacer le fichier original ou le renommer en ajoutant une extension, par exemple .bak
renommer le fichier temporaire avec le nom du fichier original
Publié : lun. 01/sept./2008 15:50
par coxco
Merci pour vos idées
Je vais tester tout ça
Une autre question comment tester si un nombre a une décimal
Exemple
Code : Tout sélectionner
dim test(2)
test(1)=15.75
test(2)=18
for x=1 to 2
if test(x)= ; ???? comment fait on pour savoir si le nombre a des décimal
; seulement si la nombre a des décimals
debug test(x)
endif
next
Publié : lun. 01/sept./2008 15:53
par djes
coxco a écrit :Ok merci Djes
mais en fait je me suis peut être mal expliqué, c'est par forcément
remplacer un e par un e* cela peut être n'importe quel caractère
Ok, excuse-moi, c'est ton exemple qui m'a induit en erreur, vu que tu remplaçais tous les "e" par des "e*".
Pour insérer un caractère, il faut d'abord que tu saches où l'insérer. Ensuite tu ouvres tes deux fichiers, et tu lis/écris au fur et à mesure jusqu'au point d'insertion. Là tu écris ton caractère, puis tu recommences jusqu'à la fin, et là tu fermes tes deux fichiers. C'est aussi simple que ça!
Un exemple :
Code : Tout sélectionner
If Not OpenFile(0, "source.txt")
If Not CreateFile(1, "destination.txt")
While Not Eof(0)
char.b = ReadByte(0)
If Loc(0) = 1000
WriteString(1, "ici")
EndIf
WriteByte(1, char)
Wend
CloseFile(1)
Else
MessageRequester("Erreur", "Impossible d'ouvrir le fichier destination")
EndIf
CloseFile(0)
Else
MessageRequester("Erreur", "Impossible d'ouvrir le fichier source")
EndIf
Tu peux aussi bidouiller deux fichiers avec truncatefile(). Y'a plein de solutions!
Publié : lun. 01/sept./2008 15:56
par djes
coxco a écrit :Merci pour vos idées
Je vais tester tout ça
Une autre question comment tester si un nombre a une décimal
Exemple
Code : Tout sélectionner
dim test(2)
test(1)=15.75
test(2)=18
for x=1 to 2
if test(x)= ; ???? comment fait on pour savoir si le nombre a des décimal
; seulement si la nombre a des décimals
debug test(x)
endif
next
Tu soustrais la valeur entière (en te servant de abs()), et s'il reste quelque chose (<>0), c'est qu'il y a des décimales.
Publié : lun. 01/sept./2008 16:05
par coxco
Ok Merci djes, ton code va m'aider
par contre je suis neuneu mais j'ai testé ça mais cela ne m'affiche pas
les chiffres après la virgule
pourquoi donc ?
AH J'AI TROUVE JE DECOUVRE QUE LE STR SUPPRIME LES VIRGULES
Comment Faut il faire alors ?
Code : Tout sélectionner
Dim test.d(2)
test.d(1)=15.75
test.d(2)=18
Debug "test "+Str(test.d(1)); Pas de chiffre après la virgule ?
MessageRequester("",Str(test.d(1))) ; Pas de chiffre après la virgule ?
For x=1 To 2
Debug Abs(test(x))-test(x)<>0
If Abs(test(x))-test(x)<>0 ; Forcément cela ne marche pas
Debug test(x)
EndIf
Next
Publié : lun. 01/sept./2008 16:20
par djes
coxco a écrit :Ok Merci djes, ton code va m'aider
par contre je suis neuneu mais j'ai testé ça mais cela ne m'affiche pas
les chiffres après la virgule
pourquoi donc ?
AH J'AI TROUVE JE DECOUVRE QUE LE STR SUPPRIME LES VIRGULES
Comment Faut il faire alors ?
Code : Tout sélectionner
Dim test.d(2)
test.d(1)=15.75
test.d(2)=18
Debug "test "+Str(test.d(1)); Pas de chiffre après la virgule ?
MessageRequester("",Str(test.d(1))) ; Pas de chiffre après la virgule ?
For x=1 To 2
Debug Abs(test(x))-test(x)<>0
If Abs(test(x))-test(x)<>0 ; Forcément cela ne marche pas
Debug test(x)
EndIf
Next
Voici un code qui fonctionnera mieux
Code : Tout sélectionner
Dim test.f(2)
test(1)=15.75
test(2)=18
Debug "test "+Str(test(1)); Pas de chiffre après la virgule ?
MessageRequester("",Str(test(1))) ; Pas de chiffre après la virgule ?
For x=1 To 2
Debug x
;Debug (test(x)-Int(test(x)))
If (test(x)-Int(test(x)))<>0 ; Forcément cela ne marche pas
Debug "-> des décimales"
Else
Debug "-> pas de décimales"
EndIf
Next