Lire et écrire un fichier

Lire et écrire un fichier sont des tâches de base indispensables dans de nombreux programmes Lua.

Lecture d’un fichier

Lecture du fichier en une seule fois (mode slurp) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function readFile(path)
  local file = io.open(path, "r")
  if not file then
    return
  end

  local slurp = file:read("*a")
  file:close()

  print(slurp)
end

readFile("/tmp/dat")

Lecture ligne par ligne :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function readFile(path)
  local file = io.open(path, "r")
  if not file then
    return
  end

  for line in file:lines() do
    print(line)
  end

  file:close()
end

readFile("/tmp/dat")

Écriture dans un fichier

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function writeStringInFile(path, str)
  -- Attention : ce mode écrase le fichier existant
  local file = io.open(path, "w")
  if not file then
    return
  end

  file:write(str)
  file:close()
end

writeStringInFile("/tmp/dat", "Hello world!\n")

seek()

seek() permet de déplacer le curseur de lecture/écriture dans un fichier.

Par exemple :

1
2
3
4
local file = io.open("test.lua", "r")
file:seek("end", -25)
print(file:read("*a"))
file:close()

seek() accepte deux paramètres :

  • whence : "set", "cur" (par défaut), ou "end"
  • offset : un entier indiquant la position relative à whence

Les modes d’ouverture

Mode Description
"r" Lecture seule (défaut)
"w" Écriture seule (efface le fichier existant)
"a" Ajout à la fin du fichier
"r+" Lecture et écriture (fichier existant)
"w+" Lecture/écriture (écrase le fichier ou en crée un nouveau)
"a+" Lecture et ajout (ouvre un fichier ou le crée)

Modes de lecture de read()

Mode Description
"*n" Lit un nombre
"*a" Lit tout le contenu depuis la position actuelle
"*l" Lit une ligne
nombre Lit le nombre spécifié d’octets

Autres fonctions utiles

  • io.tmpfile() : Crée un fichier temporaire (automatiquement supprimé à la fin du programme)
  • io.type(fichier) : Renvoie "file", "closed file" ou nil
  • io.flush() : Vide le tampon de sortie par défaut
  • io.lines([fichier]) : Itère ligne par ligne (et ferme automatiquement le fichier si un nom est fourni)