Utilisation des fichiers

From Base de connaissances eggdrops & TCL
Jump to: navigation, search

En Tcl, et particulièrement lorsqu'on travaille avec un eggdrop, l'utilisation des fichiers pour le stockage de données est très fréquent.

Voici donc quelques exemples appliqués de la manipulation de fichiers.

Ouverture

Un fichier s'ouvre avec la commande open, qui est de la forme:

open /chemin/du/fichier mode
  • /chemin/du/fichier est le chemin soit complet (depuis la racine du serveur) soit relatif (depuis la position de l'eggdrop)
  • mode est le type d'ouverture: r pour lecture, w pour écriture (au début du fichier) et a pour append (ajouter des lignes à la fin du fichier).

La commande open crée une resource qui est ensuite utilisée pour toute opération sur le fichier.

Les modes d'ouverture sont volontairement simplifiés, voir la page open pour plus d'informations

Lecture

Lecture complète d'un fichier

La lecture s'effectue avec la commande read. Voici comment lire tout un fichier et renvoyer les lignes en party_line

set fi [open "monfichier.txt" r]
set line [read -nonewline $fi]
foreach line [split $line "\n"] {
   putlog $line
}
close $fi

Lecture ligne par ligne

Il n'est pas possible de lire une ligne en particulier dans un fichier, la commande seek permettant seulement d'avancer d'un certain nombre d'octets. Mais il est possible de lire un fichier ligne par ligne avec gets, ce qui est utile pour les gros fichiers. Avec un compteur, on peut de plus n'extraire que la ligne désirée.

proc getLine { fichier num } {
   set fi [open "monfichier.txt" r]
   set cpt 0
   while {[eof $fi] != 1 } {
      incr cpt
      set line [gets $fi]
      if { $cpt == $num } {
         putlog $line
      }
   }
   close $fi
}

Notez l'utilisation de eof qui signifie end of file ("fin de fichier") pour contrôler la boucle while.

Ce code n'est bien sûr pas optimisé car tout le fichier est lu même si la ligne désirée est atteinte.

Ecriture

Il existe deux modes d'écriture:

  • write écrase le fichier existant (ou le crée)
  • append ajoute du contenu à la fin du fichier (ou le crée)

Ecriture complète

Pour (ré)écrire complètement un fichier, il suffit de l'ouvrir en mode w et d'insérer le contenu avec puts:

set fi [open "monfichier" w]
puts $fi "une ligne"
puts $fi "Une seconde ligne"
close $fi

Avec ce code, votre fichier sera chaque fois écrasé et contiendra les deux lignes.

Ajouter une ligne

Ajouter une ligne à la fin d'un fichier est tout aussi simple:

set fi [open "monfichier.txt" a]
puts $fi "Une troisième ligne"
close $fi

Si monfichier.txt existait, et est celui précédement utilisé, il contiendra une troisième ligne.

Suppression d'une ligne

Le moyen le plus basique (mais peu optimisé) pour supprimer une ligne est de lire le fichier et de stocker toutes les lignes sauf celle à supprimer, puis de ré-écrire le fichier.

Voici un exemple où nous allons supprimer toutes les lignes commençant par "bla" dans un fichier

set tmp "monfichier.tmp"
set fi [open "monfichier.txt" r]
set fo [open $tmp w]
while { [eof $fi] != 1 } {
   set ligne [gets $fi]
   if { [string first "bla" $ligne] != 0 } {
      puts $fo $ligne
   }
}
close $fi
close $fo
file rename -force $tmp "monfichier.txt"
Attention.png Ici ne seront mis que des exemples basiques, un tutoriel plus avancé sera prochainement créé