Page 1 sur 1

Insérer ou supprimer des caractères dans un fichier

Publié : mar. 15/juin/2010 10:15
par Parole De JOJO
Si dans mon fichier c'est écrit "bonjour comment ça va" par exemple, je sais comment placer le pointeur sur un caractère et le remplacer par un autre (avec writedata ou writestring) mais comment insérer un nouveau mot entre deux mots existant, disons d'insérer "mon frère" entre "salut" et "comment". De plus je cherche comment supprimer des caractères, c'est à dire pas seulement les remplacer mais les éliminer complètement.
Je suis sûr qu'il doit y avoir une fonction très simple mais j'ai cherché dans tout le manuel d'aide et je n'ai rien trouve.

Merci d'avance

Re: Insérer ou supprimer des caractères dans un fichier

Publié : mar. 15/juin/2010 10:28
par lepiaf31

Code : Tout sélectionner

Procedure insererChaine(file, string.s, offset.i)
  Protected *buffer, bufferSize.i
  
  If IsFile(file) ;on teste si le fichier est correctement ouvert
    FileSeek(file, offset) ;on se place à l'endroit où l'on veut inserer du texte
    
    bufferSize = Lof(file) - Loc(file) ;taille des données restantes
    *buffer = AllocateMemory(bufferSize)
    ReadData(file, *buffer, bufferSize) ;on lit les données restantes
    
    FileSeek(file, offset) ;on se replace à l'endroit voulu
    WriteString(file, string) ;on écrit le texte à inserer
    WriteData(file, *buffer, bufferSize) ;on reécrit les données qui vont derrière
    FreeMemory(*buffer)
    
    TruncateFile(file) ;on coupe la fin du fichier
    
  EndIf
EndProcedure


;*****TEST*****
;creation d'un fichier
path.s = "C:\Users\Kévin\Desktop\test.txt"
CreateFile(0, path)
WriteString(0, "bonjour comment ça va")

;Insertion du texte voulu
insererChaine(0, " mon frère", 7)

CloseFile(file)

RunProgram(path)
    

Re: Insérer ou supprimer des caractères dans un fichier

Publié : jeu. 17/juin/2010 20:36
par Parole De JOJO
merci beaucoup pour l'exemple detaille
en fait j'ai eu la meme idee mais c'est tres lent car j'utilise des grands fichiers et j'insere plein de trucs a toutes sortes d'endroits.
est ce qu'il n'y a pas une fonction plus simple pour cela?

Re: Insérer ou supprimer des caractères dans un fichier

Publié : jeu. 17/juin/2010 22:16
par Ar-S
Assez long comment ?
Peut-être devrais tu mettre tout le contenu de ton texte en mémoire dans un string$ puis faire les modifs après ?

Re: Insérer ou supprimer des caractères dans un fichier

Publié : sam. 19/juin/2010 22:31
par Parole De JOJO
ce sera difficile
en fait je pensais qu'il existait une fonction directe mais apparement ca n'existe pas

esperons que dans la prochaine version fred y pensera

Re: Insérer ou supprimer des caractères dans un fichier

Publié : sam. 19/juin/2010 23:12
par Ar-S
Parole De JOJO a écrit :en fait j'ai eu la meme idee mais c'est tres lent car j'utilise des grands fichiers et j'insere plein de trucs a toutes sortes d'endroits.
Grands comment ? Quels genre de trucs ?

Re: Insérer ou supprimer des caractères dans un fichier

Publié : dim. 20/juin/2010 3:49
par G-Rom
il faut voir un fichier comme un tableau de char (.c) , ce n'est qu'une suite de .c , se qui forme ton fichier.
il faut convertir ton fichier en tableau ( linked list ) et via des insertelement() tu ajoutes ce que tu veut , ou tu veut , et ce de manière rapide.

ex :

Code : Tout sélectionner

Structure FileData
  lof.i
  filename.s
  List character.c()
EndStructure



Procedure.i LoadFileData(File$)
  
  file = OpenFile(#PB_Any,File$)
  If file
    
    *FileData.FileData = AllocateMemory(SizeOf(FileData))
    *FileData\lof      = Lof(file)
    *FileData\filename = File$
    InitializeStructure(*FileData,FileData)
    
    
    *Buffer = AllocateMemory(Lof(file))
    ReadData(file,*Buffer,Lof(file))
    CloseFile(file)
    
    For it = 0 To *FileData\lof -1
      AddElement(*FileData\character())
      *FileData\character() = PeekC(*Buffer+it)
    Next 
    
    FreeMemory(*Buffer)
    
    ProcedureReturn *FileData
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

Procedure SaveFileData(*FileData.FileData)
  If OpenFile(0,*FileData\filename)
    ForEach *FileData\character()
      WriteCharacter(0,*FileData\character())  
    Next
    CloseFile(0)
  EndIf   
EndProcedure


Procedure InsertStringToFileData(*FileData.FileData,string.s,position.i)

  
  For it = 0 To Len(string)-1
    SelectElement(*FileData\character(),position+it)
    InsertElement(*FileData\character())
    *FileData\character() = Asc(Mid(string,it+1,1))
  Next 

EndProcedure

y a 3 fonction :

LoadFileData(File$) <- charge un fichier et te renvois un pointeur
InsertStringToFileData(*FileData.FileData,string.s,position.i) <- tu ajoutes un string ou tu veut grace au pointeur que tu as eu avec la fct° du dessus.
SaveFileData(*FileData.FileData) <- tu sauvegardes.


Voila , à toi de rajouté sur cette base la suppression de mot ;)
@+