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