Les fichiers 1 Introduction
Transcription
Les fichiers 1 Introduction
Delphi Info-Sup tp 6 23 Janvier 2006 Epita Les chiers 1 Introduction Il existe en Delphi quatre méthodes de gestion des chiers. Elles sont décrites dans l'aide Delphi à la rubrique "Routines standard et Entrées/Sorties". 1.1 Les chiers typés Ils sont déclarés de la manière suivante : type nom = le of type ; Ex : type IntFile = le of integer ; C'est tout simplement une suite d'éléments du même type, voir la rubrique de l'aide Delphi "Types chier" pour les détails. Les fonctions de manipulation de base sont : AssignFile : Initialise la variable de type chier en la liant au nom passé en paramètre, à faire avant tout autre appel. Append : Ouvre le chier en positionnant le curseur à la n (typiquement pour une écriture en n de chier). Reset : Ouvre le chier en positionnant le curseur au début (typiquement pour une lecture du chier). Rewrite : Ecrase le chier avant de l'ouvrir, permet de repartir d'un chier vierge. Read et Write : Lit et écrit dans le chier. CloseFile : Ferme le chier. Consultez la rubrique de l'aide Delphi "Routines de gestion des chiers" pour avoir toutes les autres fonctions utiles (les noms sont très explicites). 1.2 Les chiers sans type Ce sont les mêmes que les précédents à la diérence que vous ne leur donnez pas de type, il s'agit en fait d'une interface Delphi pour les chiers "bas niveau" que nous verrons plus loin. On ne peut pas utiliser Read et Write sur ces chiers (ces procédures nécessitent de connaître le type des 1 Delphi Info-Sup tp 6 23 Janvier 2006 Epita variables lues ou écrites), on utilise BlockRead et BlockWrite pour faire des écritures par blocs. 1.3 Les chiers textes Ils sont similaires aux chiers typés sauf qu'ils permettent de lire et d'écrire des données en mode texte, c'est à dire de la même manière qu'on lit et écrit sur la console. Il sont déclarés de type "Text" (Ex : var F : Text ; ). On utilise les même fonctions que pour les chiers typés avec en plus ReadLn et WriteLn et diverses autres décrites dans la rubrique "routines de chiers texte". C'est probablement ceux-là que vous utiliserez le plus en Delphi car ce sont les plus simple d'utilisation et qu'ils sont lisibles avec n'importe quel logiciel de format texte (très pratique pour du débogage). Il existe deux variables globales dénies dans tout programme qui sont "Input" et "Output", elles représentent respectivement l'entrée et la sortie standard du programme (dans notre cas, la console). 1.4 Les chiers "bas niveau" Pour ces chiers, on utilise les appels système de l'OS (Windows en l'occurrence) et non une interface Delphi. On manipule donc un descripteur de chier de type entier qui correspond au handle assigné au chier par l'OS. Pour ceux-ci on utilise FileOpen, FileClose, FileRead et FileWrite. 1.5 Les autres fonctions Il existe bien sûr des fonctions qui permettent de manipuler des chiers sans les ouvrir ni les lire, pour les plus utiles : ChDir : Change le répertoire courant. CreateDir : Crée un répertoire. DeleteFile : Supprime un chier. RemoveDir : Supprime un répertoire. RenameFile : Renomme un chier. FileExists : Teste l'existence d'un chier. 2 Delphi Info-Sup tp 6 23 Janvier 2006 Epita 2 Quelques exos de routine 2.1 Exercice 1 : Vous devez crée une fonction PutFile. procedure PutFile(filename:string; msg:string); Cette fonction écrit la chaîne msg dans le chier lename. 2.2 Exercice 2 : Vous devez crée une fonction CreateFileSize. procedure CreateFileSize(filename:string; size:integer); Cette fonction doit cree le chier lename de taille size. Il peut contenir ce que vous voulez. 2.3 Exercice 3 : Vous devez crée une fonction MergeFile. procedure MergeFile(f1:string; f2:string); Cette fonction doit concatener le chier f2 au chier f1. 2.4 Exercice 4 : Vous devez crée une fonction Checksum. function Checksum(filename:string):integer; Cette fonction doit additionner tous les octets contenus dans le chier lename. 3 Delphi Info-Sup tp 6 23 Janvier 2006 Epita 3 Quelques commandes Unix 3.1 cat La fonction cat ache le chier passé en paramètre sur la sortie standard. Vous devrez gérer l'option '-n' qui permet de numéroter les lignes. On utilisera pour cela le prototype : function cat(lename :string ; number :Boolean) :Boolean ; On numérotera les lignes si 'number' est vrai. La fonction retourne vrai si tout c'est bien passé, faux si il y a eu une erreur (le chier n'existe pas, est illisible...). 3.2 head La fonction head ache les premières lignes du chier sur la sortie standard. Vous devrez gérer l'option '-N' (où N est un nombre) qui permet de spécier le nombre de ligne voulues (10 sinon). On utilisera : function head(lename :string ; nb :integer) :Boolean ; Si nb est strictement supérieur à 0, on achera le nombre de ligne donné, 10 sinon. 3.3 tail Pareil que head mais pour acher les dernières lignes du chier. 3.4 more La fonction more permet de naviguer dans un chier aché sur la sortie standard. Nous en ferons une version très épurée vu qu'il ne sera possible que d'acher le chier ligne par ligne en appuyant sur la touche entrée. Prototype : function more(lename :string) :Boolean ; 3.5 rm La fonction rm supprime le chier passé en paramètre. Vous devrez gérer l'option '-r' qui permet de supprimer un répertoire. Prototype : function rm(lename :string ; dir :Boolean) :Boolean ; Si dir est vrai, le chier est un répertoire. 4 Delphi Info-Sup tp 6 23 Janvier 2006 Epita 3.6 mv La fonction mv déplace le chier source vers le chier destination. Prototype : function mv(src :string ; dst :string) :Boolean ; 3.7 cp La fonction cp copie le chier source vers le chier destination. Vous devrez gérer l'option '-r' qui permet de copier un répertoire. Prototype : function cp(src :string ; dst :string ; dir :Boolean) :Boolean ; Si dir est vrai, le chier est un répertoire. 3.8 BONUS : le micro-shell Vous devez interfacer tout ca de manière à faire un programme de gestion de chiers, l'utilisateur n'aura qu'à taper les commandes voulues ligne par ligne. Vous ajouterez la commande cd qui permet de changer de répertoire ainsi que la commande pwd qui permet de connaître le répertoire courant. Vous aurez le bon goût d'acher un prompt avant chaque commande ('> ' dans l'exemple). Exemple (on suppose que tous les chiers existent) : > cat -n toto.txt 1 Le fichier 'toto.txt' 2 contient deux lignes. > head -1 toto.txt Le fichier 'toto.txt' > tail -1 toto.txt contient deux lignes. > cp toto.txt chiche/foo.txt > cd chiche > pwd C:\chiche 5 Delphi Info-Sup tp 6 23 Janvier 2006 Epita 4 La stéganographie (MIAM) 4.1 Introduction La stéganographie consiste à cacher un message dans un objet anodin. Le premier cas fut durant l'ère de l'Egypte ancienne. Pour transmettre des messages ils rasaient la crane des esclaves, écrivaient un message, laissaient repousser ses poils cranien et envoyaient l'esclave au destinataire du message. Le destinataire n'avait qu'à le raser pour prendre acte du message. On vous propose de faire la meme chose : camouer un message et lire un message dans une image. 4.2 Le format PPM Le format PPM est un format de chier pour stocker une image. Une image est un tableau de pixels à deux dimensions. Un pixel est un enregistrement indiquant l'intensité de chaque couleur de base. Les couleurs de base sont : le rouge, le vert et le bleu (RGB). Chaque intensité de couleur est un nombre compris entre 0 et 255. Au nal, un pixel est un triplet de valeurs entre 0 et 255. Un chier PPM est structuré comme suit : Le premier et le deuxieme octet sont respectivement 80 et 54. Le troisième octet est un 10. Les octets suivants jusqu'à l'espace (32 en ascii) est la largeur de l'image en codage ASCII (http ://www.asciitable.com). Par exemple une image de largeur 100, on aura la séquence d'octets suivants '1' '0' '0' soit 49 48 48. Arrive donc l'espace. Ensuite la hauteur de l'image. Un retour à la ligne (10). La profondeur de l'image (ne vous posez pas de questions ca sera toujours 255, plus précisement 50, 53, 53). Un retour à la ligne. L'image en elle même, donnée ligne par ligne. Pour lire un pixel il faut lire 3 octets le premier étant la valeur de la composante rouge le second pour le vert et le troisième pour le bleu. Par exemple, imaginons une image de 3 pixels de largeur, 1 de hauteur, le premier pixel est en vert pur, le second en bleu et le troisième en rouge pur. On aura donc le chier suivant : 6 Delphi Info-Sup tp 6 23 Janvier 2006 Epita 80|54|10|51|32|49|10|50|53|53|10|0|255|0|0|0|255|255|0|0 4.3 Le codage de l'information Pour camouer notre message on utilisera le principe suivant : étant donné que l'oeil ne fait la trop la dierence entre un rouge 117 ou un rouge 132 (essayez avec paint si vous n'êtes pas convaincu), on a alors un peu de marge sur chaque octets pour coder de l'information. Un octet est équivalent à 8 bits. On utilisera les bits de poids faibles pour eviter une deformation trop agrate l'image. On choisira de coder un octet sur un pixel de la facon suivante : 3 bits du pixel rouge 3 bits du pixel vert 2 bits du pixel bleu Par exemple un pixel (r = 42, g = 42, b = 42), qui sera codé en binaire (r = 00101010, g = 00101010, b = 00101010), pour coder un 'N', on "eace" les bits qui vont coder pour le 'N' : (r = 00101000, g = 00101000, b = 00101000). Le code de 'N' est 116 (soit 01001110). Le pixel devient alors (r = 00101010, g = 00101011, b = 00101010) ou en décimal (42, 43, 42). Un message est donc une suite de pixel et on s'arrête de décoder lorsque on rencontre le caractère de code 0. 4.4 Votre mission - Ecrire le type TImage qui contiendra une image (largeur, hauteur, tableau de pixels) - Ecrire une fonction qui charge une image depuis un chier dans la structure. (attention au codage de la longueur et la largeur) - Ecrire une fonction qui écrit dans un chier une image (même remarque que precedement). - Ecrire une fonction qui prend en paramètre un pixel et retourne le caractère codé - Ecrire une fonction qui prend en paramètre un tableau de pixel et qui retourne une chaine de carateres contenant le message codé. - Ecrire une fonction qui prend en parametre un pixel et un caratère, et code le caractere dans le pixel - Ecrire une fonction qui prend en paramètre un tableau de pixels et une 7 Delphi Info-Sup tp 6 23 Janvier 2006 Epita chaine de caractères. Cette fonction doit coder la chaîne de carateres dans le tableau de pixel Des images contenant des messages codés sont disponibles sur http ://wcube.epita.fr/ laadad_n 8