[Précédent (date)] [Suivant (date)] [Précédent (sujet)] [Suivant (sujet)] [Index par date] [Index par sujet]

Re: ecrire dans un fichier avec un script TCL



Tcl ne sait pas ecrire dans les fichiers il ne sait qu'ecrire dans un canal.de plus il ne dispose que de 3 operateurs sur les flux : read gets (lecture) puts (ecriture)
ce qu'il est possible par contre c'est de 
1)charger l'integralite du fichier et d'ecrire a la position souhaitee puis de reecrire sur le fichier ( cas pour un fichier pas trop important ).
ex : 
  #chargement de la totalite du fichier
  set fid [open $nomfichier r]
  set donnees [read $fid]
  close $fid
  #deplacement au point voulu
  set p $position-debut
  # attention aux espaces
  set f [expr $p + [string length $ajout]]
  set donnees "[string range $donnee 0 $p]$ajout[string range  $donnee $f end]"
  #peut etre utilise plusieurs fois
  #ecrasement de l'ancienne version du fichier
  set fid [open $nomfichier w]
  puts $fid $donnee
2)utilisation d'un fichier temporaire
et traiter ligne par ligne on ne traitera que le point voulu
on recopiera le fichier temporaire sur le fichier
ex :
  set tmp [open tempfile.tmp w]
  set fid [open $nomfichier r]
  set p $position-debut

  set i 0 # compteur de position
  #tant qu'il reste des donnes dans le fichier
  while {[gets $fid line] >= 0} {
    set lens [string length $line]
    if {$i <= $p && [expr $i + $lens] >= $p} {
      set f [expr $p - $i + [string length $ajout]]
      #on alterera la ligne
      set line "[string range $line 0 [expr $p - $i]]$ajout[string range $line $f end]"
    }
    #on ecrit dans le fichier temporaire
    puts $tmp $line
  }
  close $tmp
  close $fid
  #on recopie le fichier temporaire sur le fichier
  exec cp tempfile.tmp $nomfichier 
  # sous windows exec copy tempfile.tmp $nomfichier 
  #on supprime le fichier temporaire
  exec rm tempfile.tmp 
  # sous windows exec del tempfile.tmp

entre [] optionnel 
$fid :canal peut etre l'entree standard ou une socket ou ...
read : lit tout d'un coup ou un nombre specifie de caracteres
     read $fid [$nb_caracteres]
gets : lit une ligne et eventuellement la mets dans une variable
     gets $fid [$var]
puts : ecrit vers le canal par defaut la sortie standard (stdout)
     -nonewline : si on ne veut pas avoir de retour a
     la ligne entre 2 ecritures
     puts [-nonewline][$fid] $donnees 

si vous avez des questions ou si vous avez un moyen d'ecrire directement dans le fichier vous pouvewz m'ecrire a
[email protected]