Insérer un caractere dans un fichier texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Insérer un caractere dans un fichier texte

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message 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.
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Tu le fais exprès ou quoi???
Quand tu remplaces un e par e*, tu insères un caractère!!!!!!!!!!!!!!!!!!!!!!
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message 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
Dernière modification par Ar-S le lun. 01/sept./2008 15:19, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message 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
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message 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 
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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!
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message 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 
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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