E/S de fichiers Lua
La bibliothèque d'E/S de Lua est utilisée pour lire et traiter des fichiers. Elle est divisée en mode simple (comme en C) et en mode complet.
- Le modèle simple dispose d'un fichier d'entrée courant et d'un fichier de sortie courant, et fournit les opérations liées à ces fichiers.
- Le modèle complet utilise des descripteurs de fichier externes pour son implémentation. Sous une forme orientée objet, il définit toutes les opérations sur les fichiers comme des méthodes du descripteur de fichier.
Le mode simple est plus adapté à certaines opérations simples sur les fichiers. Mais lors de l'exécution d'opérations avancées sur les fichiers, le mode simple semble inadéquat. Par exemple, pour des opérations telles que la lecture de plusieurs fichiers en même temps, le mode complet est plus adapté.
L'instruction d'ouverture de fichier est la suivante :
file = io.open (filename [, mode])
Les valeurs de mode sont :
| Mode | Description |
|---|---|
| r | Ouvrir le fichier en mode lecture seule ; le fichier doit exister. |
| w | Ouvrir un fichier en écriture seule. Si le fichier existe, sa longueur est ramenée à 0, c'est-à-dire que son contenu disparaîtra. Si le fichier n'existe pas, le créer. |
| a | Ouvrir un fichier en écriture seule en mode ajout. Si le fichier n'existe pas, il sera créé. Si le fichier existe, les données écrites seront ajoutées à la fin du fichier, c'est-à-dire que le contenu d'origine du fichier sera préservé. (marqueur EOF préservé) |
| r+ | Ouvrir le fichier en lecture et en écriture ; le fichier doit exister. |
| w+ | Ouvrir un fichier en lecture et en écriture. Si le fichier existe, sa longueur est remise à zéro, c'est-à-dire que son contenu disparaîtra. Si le fichier n'existe pas, le créer. |
| a+ | Semblable à a, mais ce fichier est accessible en lecture et en écriture. |
| b | Mode binaire. Si le fichier est un fichier binaire, vous pouvez ajouter b. |
| + | Le signe + indique que le fichier peut être à la fois lu et écrit. |
Mode simple
Le mode simple utilise les E/S standard ou utilise un fichier d'entrée courant et un fichier de sortie courant.
Voici le code du fichier file.lua. Le fichier sur lequel on opère est test.lua (s'il n'existe pas, vous devez le créer). Le code est le suivant :
Exemple
file = io.open("test.lua", "r")
-- Définir le fichier d'entrée par défaut sur test.lua
io.input(file)
-- Afficher la première ligne du fichier
print(io.read())
-- Fermer le fichier ouvert
io.close(file)
-- Ouvrir un fichier en écriture seule en mode ajout
file = io.open("test.lua", "a")
-- Définir le fichier de sortie par défaut sur test.lua
io.output(file)
-- Ajouter un commentaire Lua à la dernière ligne du fichier
io.write("-- test.lua end-of-file comment")
-- Fermer le fichier ouvert
io.close(file)
Après avoir exécuté le code ci-dessus, vous constaterez qu'il affiche les informations de la première ligne du fichier test.lua et ajoute un commentaire Lua à la dernière ligne du fichier. Par exemple, ma sortie ici est :
-- test.lua 文件
Dans l'exemple ci-dessus, nous avons utilisé la méthode io."x". Dans io.read(), nous n'avons pas passé de paramètre. Le paramètre peut être l'un des suivants dans le tableau :
| Mode | Description |
|---|---|
| "*n" | Lire un nombre et le renvoyer. Exemple : file.read("*n") |
| "*a" | Lire tout le fichier à partir de la position actuelle. Exemple : file.read("*a") |
| "*l" (par défaut) | Lire la ligne suivante ; renvoyer nil à la fin du fichier (EOF). Exemple : file.read("*l") |
| nombre | Renvoyer une chaîne du nombre de caractères spécifié, ou renvoyer nil à la fin du fichier (EOF). Exemple : file.read(5) |
Les autres méthodes io incluent :
io.tmpfile():Renvoyer un descripteur de fichier temporaire. Le fichier est ouvert en mode mise à jour et est automatiquement supprimé à la fin du programme.
io.type(file):Vérifier si obj est un descripteur de fichier utilisable.
io.flush():Écrire toutes les données mises en mémoire tampon dans le fichier.
io.lines(nom de fichier facultatif):Renvoyer une fonction d'itération. Chaque appel récupérera une ligne du fichier. À la fin du fichier (EOF), elle renvoie nil, mais ne ferme pas le fichier.
Mode complet
Habituellement, nous devons traiter plusieurs fichiers en même temps. Nous devons utiliser file:function_name au lieu des méthodes io.function_name. L'exemple suivant montre comment traiter le même fichier en même temps :
Exemple
file = io.open("test.lua", "r")
-- Afficher la première ligne du fichier
print(file:read())
-- Fermer le fichier ouvert
file:close()
-- Ouvrir un fichier en écriture seule en mode ajout
file = io.open("test.lua", "a")
-- Ajouter un commentaire Lua à la dernière ligne du fichier
file:write("--test")
-- Fermer le fichier ouvert
file:close()
Après avoir exécuté le code ci-dessus, vous constaterez qu'il affiche les informations de la première ligne du fichier test.lua et ajoute un commentaire Lua à la dernière ligne du fichier. Par exemple, ma sortie ici est :
-- test.lua 文件
Les paramètres de read sont les mêmes qu'en mode simple.
Autres méthodes :
file:seek(whence facultatif, offset facultatif):Définit et récupère la position actuelle dans le fichier. En cas de succès, renvoie la position finale du fichier (en octets) ; en cas d'échec, renvoie nil plus un message d'erreur. Le paramètre whence peut être :
- "set" : commence au début du fichier
- "cur" : commence à la position actuelle [par défaut]
- "end" : commence à la fin du fichier
- offset : la valeur par défaut est 0
file:flush():Écrit toutes les données en mémoire tampon dans le fichier.
io.lines(nom de fichier facultatif):Ouvre le fichier filename spécifié en mode lecture et renvoie une fonction itérateur. Chaque appel récupère une ligne du fichier. À la fin du fichier (EOF), il renvoie nil et ferme automatiquement le fichier.
Lorsqu'il est appelé sans paramètres, io.lines() <=> io.input():lines(); il lit le contenu du périphérique d'entrée par défaut, mais ne ferme pas le fichier à la fin, par exemple :for line in io.lines("main.lua") do print(line) end
L'exemple suivant utilise la méthode seek pour se positionner à la 25e position depuis la fin du fichier, et utilise le paramètre *a de la méthode read, c'est-à-dire lit tout le fichier à partir de la position actuelle (la 25e position depuis la fin).
Exemple
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- Fermer le fichier ouvert
file:close()
Ma sortie ici est :
st.lua 文件末尾--testAutres extensions