sauver/restaurer une map dans un fichier

 

ulis, 2006-01-29. Deux procédures pour sauvegarder/restaurer une map dans/depuis un fichier.

2006-01-30, ajout d'un flag de compression à la sauvegarde et d'une décompression automatique à la restauration.

2006-02-02. v2 : adaptation à la compression v2.


Pourquoi

Pour garder ou échanger ses maps.


Comment

En écrivant/relisant la liste de chaînes de caractère que constitue une map dans/depuis un fichier.


Utilisation

  # create a file from a map
  map2file map file {compress 0}
  # map : la map
  # file : le nom du fichier
  # compress : indicateur de compression. Sa valeur par défaut est ''faux''.

  # create a map from a file
  file2map file
  # file : le nom du fichier

La procédure de sauvegarde

  # create a file from a map

  proc map2file {map file {compress 0}} \
  {
    # v2
    if {$compress} { set map [compress $map] }
    set rc [catch \
    {
      set fp [open $file w]
      if {[string first * $map] > -1} \
      {
        # compressed map
        fconfigure $fp -translation binary
        puts -nonewline $fp "UCM\0"
        puts -nonewline $fp [join $map \0]
      } \
      else \
      { puts -nonewline $fp [join $map \n] }
      close $fp
    } err]
    if {$rc == 1} { return -code error "map2file: $err" }
  }

La procédure de restauration

  # create a map from a file

  proc file2map {file} \
  {
    # v2
    set rc [catch \
    {
      set fp [open $file r]
      fconfigure $fp -translation binary
      set raw [read $fp]
      if {[string range $raw 0 3] == "UCM\0"} \
      {
        set map [uncompress [lrange [split $raw \0] 1 end]]
      } \
      else \
      {
        close $fp
        set fp [open $file r]
        set map [split [read $fp] \n]
      }
      close $fp
    } err]
    if {$rc == 1} { return -code error "file2map: $err" }
    if {[lindex $map end] == ""} { set map [lrange $map 0 end-1] }
    return $map
  }

Démo

  package require Tk

  set map \
  {
    0
    0feeeeeeeeeeeed0
    ffdddddddccccced
    eeddddcccccccccd
    edddccccccbbbbcd
    eddcccccbbbbbbcd
    edccccbbbbbbbbcd
    edcccbbbbbbbbbcd
    edcccbbbbbbbbbcd
    ecccbbbbbbbbbbbd
    ecccbbbbbbbbbbbd
    eccbbbbbbbbbbbbd
    eccbbbbbbbbbbbbd
    eccbbbbbbbbbbbbd
    eccccbbbbbbbbbbd
    edccccccbbbbbbcd
    0eddddddddddddd0
  }
  map2file $map box.map

  set map [file2map box.map]

Voir aussi


Discussion


Catégorie Exemple | Catégorie Traitement d'image