Section courante

A propos

Section administrative du site

Fichiers et entrée/sortie

Cette page décrit l'utilisation des fichiers Pascal, y compris la déclaration des fichiers dans un programme. Il comprend également des informations détaillées sur chacune des procédures et fonctions prédéfinies pour effectuer des entrées et des sorties, ou E/S.

Routines d'entrée/sortie

Le MPW Pascal vous propose trois manières distinctes d'effectuer des entrées et des sorties dans votre programme :

En général, les routines ROM du Macintosh constituent le moyen le plus direct d'accéder à l'écran, au clavier et à la souris du Macintosh. Les routines intégrées de Pascal constituent le moyen le plus simple d'accéder au contenu des fichiers et d'effectuer des opérations d'entrée/sortie avec des périphériques externes. Les routines d'environnement intégré sont utilisées uniquement par les programmes allant s'exécuter sous MPW Shell et utiliser ses fonctionnalités d'entrée/sortie.

La plupart de ce que vous devez savoir sur l'accès au système d'exploitation Macintosh et aux routines Toolbox est contenu dans Inside Macintosh. Consultez les parties suivantes pour plus d'informations :

Le reste de cette page traite des routines d'entrée/sortie fournies avec MPW Pascal. Certains d'entre eux sont intégrés au compilateur lui-même; d'autres sont inclus dans PasLib. Les procédures et fonctions PasLib ont des noms commençant par PL. Chaque fois que vous utilisez l'un d'entre eux, vous devez inclure l'instruction USES PasLibIntf dans votre programme ou unité. Vous devez également lier votre programme ou unité au fichier bibliothèque PasLib.o.

Cette page utilise une notation BNF modifiée au lieu de diagrammes de syntaxe pour afficher la syntaxe des listes de paramètres actuelles pour les procédures et fonctions standard.

Fichiers Pascal

Une variable de fichier Pascal est une variable structurée. Une variable de fichier ressemble à un tableau, dans le sens où elle consiste en une séquence de composants variables distincts, tous du même type. Cependant, le nombre de composantes est indéterminé et on n'y accède pas par indexation mais en utilisant les procédures et fonctions d'entrée/sortie prédéfinies.

Fichiers externes

Les variables de fichier sont utilisées pour entreposer des données en dehors de la mémoire, dans un fichier externe. Un fichier externe est soit un périphérique, soit un fichier de disque nommé. Pour qu'un programme puisse lire ou écrire des informations à l'aide d'un fichier externe, une variable de fichier doit être déclarée puis associée au fichier externe.

Variables de fichier

La caractéristique la plus importante d'une variable de fichier est que ses composantes ne sont généralement pas en mémoire, mais vous pouvez y accéder comme s'ils l'étaient. Les composantes existent en dehors du programme en tant que contenu d'un fichier externe.

Une variable de fichier est déclarée avec d'autres variables, en utilisant un type de fichier. Il existe trois types de fichiers Pascal de base :

Fichiers structurés

Un fichier structuré est constitué de composantes appelés enregistrements logiques. Ces composantes peuvent être de n'importe quel type n'étant pas un type de fichier (ou un type structuré contenant une composante de type de fichier à n'importe quel niveau de structuration). Il n'est pas nécessaire qu'ils soient de type RECORD.

Par exemple, les déclarations :

  1. Var
  2.  IntVals:File of Integer;
  3.  RealVals:File of Real;
  4.  CompVals:File of Record
  5.   I:Integer;
  6.   R:Real;
  7.  End;

créez trois variables de fichier :

Fichiers texte

Le type de fichier texte prédéfini en Pascal peut être utilisé pour entreposer tout type de données, à condition qu'elles soient au format caractère. Par exemple, cette déclaration crée une variable fichier de type Text :

  1. Var NameFile:Text;

Ce type de fichier est le plus efficace pour gérer les lignes de texte. Il transfère les données par blocs entre le périphérique externe et un tampon, à partir duquel votre programme peut accéder efficacement aux données, une ligne ou un caractère ou une valeur à la fois.

Remarque : Dans de nombreux cas, ce n'est pas la manière la plus efficace d'effectuer des entrées/sortie. Par exemple, si vous souhaitez entreposer des valeurs à virgule flottante dans un fichier, l'utilisation d'un fichier de type texte nécessiterait de convertir chaque valeur en son équivalent en caractères ASCII avant de l'entreposer dans le fichier. Chaque fois qu'une valeur est lue dans le fichier, elle doit être reconvertie en sa représentation binaire.

Fichiers non typés

Pour déclarer une variable de fichier comme non typée, utilisez uniquement l'identificateur de type FILE. Par exemple :

  1. Var BlockFile:File;

Pascal transfère les données vers et depuis un tel fichier sans interpréter sa structure interne. Un fichier non typé n'a pas de variable de fenêtre de fichier et il ne peut être utilisé qu'avec les routines Reset, Rewrite, Close, Eof, BlockRead, BlockWrite, ByteRead et ByteWrite. Les opérations sur les fichiers non typés sont décrites à la fin de cette page.

Variables de fichier prédéclarées

Le MPW Pascal considère tous les périphériques, tels que le clavier et l'écran Macintosh, comme des fichiers externes. Il prédéclare deux variables de fichier correspondantes de type texte, appelées entrée et sortie. Sauf redirection spécifique, l'entrée provient du clavier standard du MPW Shell et la sortie va vers la sortie déclarée du MPW Shell.

Au début de chaque exécution du programme, les fichiers d'entrée et de sortie sont automatiquement ouverts pour utilisation sans être déclarés. Les procédures et fonctions pouvant être utilisées avec des fichiers de type texte peuvent les utiliser, directement (en les recevant comme paramètres) ou indirectement (par défaut lorsque le paramètre de variable de fichier est omis), sans les déclarer au préalable. Le programme ne doit pas essayer de fermer ces fichiers.

Remarque : La norme ANSI spécifie que les entrées et les sorties doivent apparaître dans l'entête du programme si elles sont utilisées. De nombreuses versions de Pascal s'appuient sur cela. Si vous écrivez du code pouvant être transporté vers d'autres versions de Pascal, incluez l'entrée et la sortie dans l'entête de votre programme.

Si une entrée est utilisée dans le programme, le fichier d'entrée standard est ouvert automatiquement en tant que fichier en lecture seulement (comme si une réinitialisation avait été effectuée) lorsque l'exécution du programme commence.

Si la sortie est utilisée dans le programme, le fichier de sortie standard est ouvert automatiquement en tant que fichier en écriture seulement (comme si une réécriture avait été effectuée pour celui-ci) lorsque l'exécution du programme commence.

Plusieurs des procédures et fonctions prédéfinies à utiliser avec des fichiers de type texte, décrites plus loin dans cette page, n'ont pas besoin d'avoir une variable de fichier explicitement donnée en paramètre. Dans ces cas, l'entrée et la sortie seront supposées par défaut selon que la procédure ou la fonction est orientée entrée ou orientée sortie.

La variable de fenêtre de fichier

Bien qu'une variable de fichier saisie puisse contenir un nombre illimité d'enregistrements logiques, un seul est accessible à la fois. Chaque enregistrement logique possède un numéro qui correspond à sa position dans le fichier par rapport au premier enregistrement du fichier, étant le numéro d'enregistrement 0. La position de l'enregistrement actuel dans le fichier est appelée position actuelle du fichier. L'accès du programme à l'enregistrement actuel utilise une variable spéciale associée au fichier, appelée variable de fenêtre de fichier.

À tout moment, il n'existe qu'un seul enregistrement logique d'un fichier accessible directement via la variable de fenêtre de fichier. Chaque fois qu'un fichier est ouvert, en utilisant l'une des procédures décrites dans cette page, la position actuelle du fichier est définie sur 0, le début du fichier.

La variable de fichier de fenêtre ne peut pas être utilisée avec des fichiers non typés.

Remarque : Dans certaines conditions, par exemple lorsque la position actuelle du fichier est à la fin du fichier, la valeur de la variable de fichier f est dite indéfinie. C'est une erreur de tenter d'utiliser la valeur de la variable de fenêtre de fichier f^ lorsque la valeur de f n'est pas définie. Cependant, l'affectation à f^ est toujours possible si le fichier peut être écrit.

Ouvrir un fichier

Avant de pouvoir utiliser une variable de fichier, celle-ci doit être ouverte. Trois procédures sont fournies pour ouvrir des fichiers existants et créer et ouvrir de nouveaux fichiers : Reset, Rewrite et Open. Chacune de ces procédures est expliquée en détail plus loin dans cette page.

Un nouveau fichier peut être créé et ouvert :

Chacune de ces procédures définit la position actuelle du fichier à zéro. Vous pouvez également utiliser les procédures de Reset et de Rewrite pour définir la position actuelle d'un fichier déjà ouvert sur zéro. Ces règles sont résumées dans le tableau suivant :

Procédure Type de fichier Effet
Reset Nouveau Une erreur se produit
Reset Existant Ouvre un fichier existant en lecture seule avec un accès séquentiel.
Open Nouveau Crée un nouveau fichier en lecture/écriture avec accès aléatoire.
Open Existant Ouvre un fichier existant en lecture/écriture avec accès aléatoire.
Rewrite Nouveau Crée un nouveau fichier en écriture seule avec accès séquentiel.
Rewrite Existant Ouvre un fichier existant en lecture/écriture avec accès séquentiel ; contenu précédent effacé.

Fermer un fichier

Si vous souhaitez associer une variable de fichier à un autre fichier externe, vous devez d'abord fermer le fichier ouvert, à l'aide de la procédure Close.

Accès séquentiel ou aléatoire

Les fichiers peuvent être consultés de manière séquentielle ou aléatoire. Lorsqu'un fichier est ouvert et consulté de manière séquentielle, le premier enregistrement logique est lu ou écrit, puis la position actuelle du fichier passe à l'enregistrement logique numériquement suivant dans le fichier.

Alternativement, les fichiers ouverts avec Open sont accessibles de manière aléatoire avec la procédure de recherche. La procédure de recherche prend un paramètre dont la valeur est un nombre faisant référence à la séquence d'enregistrements logiques. En utilisant la procédure de recherche, vous pouvez passer d'un enregistrement à un autre, dans n'importe quel ordre, ou accéder à une position d'octet spécifique dans un fichier texte ou un fichier non typé.

La fonction PLFilepos peut être appliquée à n'importe quelle variable de fichier; il renvoie le numéro d'enregistrement de la position actuelle du fichier. Cette fonction est décrite en détail plus loin dans cette page.

Remarque : Les termes fichier aléatoire et fichier séquentiel sont couramment utilisés mais trompeurs. Aléatoire et séquentiel sont deux méthodes pour accéder au fichier, et non deux types de fichiers. N'importe quel fichier est accessible de manière aléatoire ou séquentielle, ou dans les deux sens. Les procédures prédéfinies prenant en charge l'accès aléatoire sont généralement utilisées avec des fichiers non texte, mais ne s'y limitent pas.

Routines pour tous les fichiers

Les procédures et fonctions décrites dans cette section peuvent être appliquées à des fichiers de toutes sortes, typés ou non.

Remarque : Les routines dont les identifiants commencent par PL (comme PLCrunch) sont définies dans le fichier d'interface PaslibIntf.p ; leur code est dans la bibliothèque PasLib.

La procédure Reset

La procédure Reset ouvre un fichier existant pour un accès séquentiel en lecture seule ou «rembobine» un fichier ouvert afin que sa variable de fenêtre contienne le premier enregistrement logique.

Reset(f[,filename]);

Le paramètre est une référence de variable faisant référence à une variable de fichier. Le paramètre filename est une expression facultative avec une valeur de chaîne de caractères. Si le nom de fichier est donné, le fichier ne doit pas déjà être ouvert. Si le nom du fichier n'est pas donné, le fichier doit être ouvert.

La valeur de filename, si elle est utilisée, doit être un chemin d'accès de fichier Macintosh, un nom de fenêtre, un nom de pseudo-périphérique ou un spécificateur de sélection valide.

L'instruction Reset(f), lorsque le fichier spécifié par f est déjà ouvert, provoque le "rembobinage" du fichier. Le fichier doit avoir été initialement ouvert avec Open ou Reset. Si le fichier a été ouvert avec Open, il passe désormais en lecture seule.

Notez que Reset préserve le contenu d'un fichier existant, contrairement à Rewrite, effaçant le contenu actuel de tout fichier sur lequel il est utilisé.

Une erreur se produit et IOResult renvoie une valeur différente de zéro s'il n'existe aucun fichier externe portant le nom spécifié par filename.

Les conditions suivantes sont toujours remplies après l'exécution de Reset(f[, filename]) :

La procédure Rewrite

La procédure Rewrite crée et ouvre un nouveau fichier vide pour un accès en écriture seule ou «rembobine» et efface un fichier ouvert.

Rwrite(f[,filename])

Le paramètre f est une variable de fichier. Si le nom de fichier est donné, le fichier ne peut pas déjà être ouvert ; si c'est le cas, une erreur se produit. Le paramètre filename est une expression facultative avec une valeur de chaîne de caractères. La chaîne de caractères doit être un chemin d'accès Macintosh, un nom de fenêtre, un nom de pseudo-périphérique ou un spécificateur de sélection valide.

Remarque : Rewrite(f) (sans nom de fichier spécifié), lorsque f n'est pas encore ouvert, n'est pas implémenté. Il est réservé à une future extension de MPW Pascal.

Rewrite(f), lorsque le fichier spécifié par f est déjà ouvert, provoque le "rembobinage" du fichier ; c'est-à-dire que la position actuelle du fichier est réinitialisée au début du fichier et tout contenu antérieur du fichier est supprimé. Le fichier doit avoir été ouvert avec Open ou Rewrite. Si le fichier a été initialement ouvert avec Open, il devient désormais en écriture seule. La réinitialisation suivie de la réécriture provoque une erreur.

Rewrite(f, filename) crée un nouveau fichier externe portant le nom filename et associe la variable fichier f à ce fichier externe. Si un fichier externe portant le nom filename existe déjà, il est tronqué (c'est-à-dire que la branche de ressources reste la même bien que la branche de données soit supprimée).

Les conditions suivantes sont toujours remplies après l'exécution de Rewrite(f[,filename]) :

La procédure Open

La procédure d'ouverture ouvre un fichier existant ou crée et ouvre un nouveau fichier pour un accès aléatoire en lecture/écriture, en définissant la variable de fenêtre de fichier sur le premier enregistrement logique. Un fichier existant n'est pas tronqué.

Open(f, filename)

Le paramètre f est une référence de variable faisant référence à une variable de fichier. Le fichier n'est peut-être pas déjà ouvert. Le paramètre filename est une expression avec une valeur de chaîne de caractères, devant être un chemin d'accès de fichier Macintosh, un nom de fenêtre, un nom de pseudo-périphérique ou un spécificateur de sélection valide.

L'instruction Open(f, filename) ouvre un fichier externe existant portant le nom filename et associe la variable de fichier spécifiée par f à ce fichier externe. Si un fichier externe portant le nom filename n'existe pas déjà, un nouveau fichier vide est créé. Le fichier est ouvert en lecture et en écriture.

Les conditions suivantes sont toujours remplies après l'exécution de Open(f, filename) :

La procédure Close

La procédure Close dose un fichier ouvert. Il met fin à l'association entre la variable fichier et le fichier externe, s'il existe.

Close(f)

Le paramètre f est une référence de variable faisant référence à une variable de fichier, devant être ouverte.

L'instruction Close(f) ferme f. Autrement dit, l'association entre f et son fichier externe est rompue et le système d e fichiers marque le fichier externe comme fermé. Toutes les références ultérieures à f ne sont pas valides (sauf pour l'ouvrir à nouveau). En particulier, la valeur de f devient indéfinie.

Si un fichier n'a pas été fermé pendant l'exécution du programme, il est automatiquement fermé à la fin du programme.

Remarque : Les fichiers ayant une portée locale dans une procédure ou un bloc fonctionnel ne sont pas automatiquement fermés lorsque la procédure ou la fonction est terminée.

La fonction Eof

La fonction Eof renvoie une valeur booléenne indiquant si la position actuelle du fichier est ou non la fin du fichier.

Eof[(f)]

Le paramètre f est une référence de variable faisant référence à une variable de fichier. Si f est omis, la fonction est appliquée à l'entrée de fichier prédéfinie. Le fichier doit être ouvert, sinon une erreur se produit.

La fonction Eof renvoie true dans les cas suivants :

Dans tous les autres cas, Eof renvoie false.

La procédure IOResult

IOResult

La routine IOResult renvoie une valeur entière indiquant le résultat de la dernière opération d'entrée/sortie effectuée. Si IOResult renvoie zéro, cela signifie que la dernière opération d'entrée/sortie a réussi. Tout résultat différent de zéro indique que la dernière opération d'entrée/sortie a échoué.

Étant donné que les fichiers de type texte sont mis en mémoire tampon, IOResult n'indique pas le résultat de l'écriture sur un fichier tant que le contenu du tampon n'est pas transféré vers le fichier externe. Un transfert de tampon se produit chaque fois que le tampon est plein ou lorsqu'il y a un appel à PLFlush ou Close. Si le code IOResult est négatif, le numéro indique une erreur Toolbox. Les valeurs de retour d'erreur équivalentes de la ROM du Macintosh définies dans MacOSErr sont documentées dans la page Gestionnaire d'erreurs système de Inside Macintosh.

Si le code IOResult est positif, c'est une erreur ayant été détectée par la bibliothèque de langages sans passer par la Toolbox.

La variable ErrNo

La liste suivante documente les valeurs de la variable ErrNo. Ceci est une liste complète ; tous les ErrNo n'apparaissent pas en Pascal.

Valeur Constante Nom Description
1 EPERM No permission match Cette erreur se produit après une tentative de modification d'un fichier d'une manière interdite sauf à son créateur.
2 ENOENT No such file or directory Cette erreur se produit lorsqu'un fichier dont le nom de fichier est spécifié n'existe pas ou lorsqu'un des répertoires d'un chemin d'accès n'existe pas.
3 ENORSRC Resource not found Une ressource requise n'a pas été trouvée. Cette erreur s'applique aux appels faccess renvoyant des informations de tabulation, de police ou d'enregistrement d'impression.
4 EINTR System service interrupted Un appel système demandé ne peut pas être effectué. Cette erreur peut se produire si une demande de renommage d'un fichier échoue.
5 EIO I/O error Une erreur d'entrée/sortie physique s'est produite. Cette erreur peut dans certains cas être signalée lors d'un appel suivant celui auquel elle s'applique effectivement.
6 ENXIO No such device or address Les entrées/sorties sur un fichier spécial font référence à un sous-périphérique n'existant pas, ou l'entrée/sortie dépasse les limites du périphérique. Cette erreur peut également se produire lorsque, par exemple, aucun disque n'est présent dans un unité de disque.
7 E2BIG Insufficient space for return argument Les données à renvoyer sont trop volumineuses pour l'espace alloué pour les recevoir.
9 E2ADF Badfile number Soit un descripteur de fichier ne fait pas référence à un fichier ouvert, soit une requête de lecture (ou d'écriture) est effectuée sur un fichier ouvert uniquement en écriture (ou lecture).
12 ENOMEM Not enough space Le système a manqué de mémoire pendant l'exécution de l'appel à la bibliothèque.
13 EACCES Permission denied Une tentative a été faite pour accéder à un fichier d'une manière interdite par le système de protection.
14 EFAULT Illegal filename Un nom de fichier ou de volume était trop long ou illégal.
15 ENOTBLK Block device required Cette erreur se produit si un fichier non bloc est utilisé alors qu'un périphérique bloc est requis.
16 EBUSY Device or resource busy Une tentative a été effectuée pour monter un volume déjà monté ou pour supprimer un fichier verrouillé.
17 EEXIST File exists Un dossier existant a été mentionné dans un contexte inapproprié.
18 EXDEV Cross-device link Cette erreur se produit après une tentative de création d'un lien vers un fichier sur un autre périphérique.
19 ENODEV No such device Une tentative a été effectuée pour appliquer un appel système inapproprié à un périphérique; par exemple, lire un périphérique en écriture seule.
20 ENOTDIR Not a directory Un objet n'étant pas un répertoire a été spécifié là où un répertoire est requis, par exemple dans un préfixe de chemin.
21 EISDIR Is a directory Une tentative d'écriture a été effectuée dans un répertoire.
22 EINVAL Invalid parameter Un paramètre non valide a été fourni à une fonction de bibliothèque.
23 ENFILE File table overflow La table des fichiers ouverts du système est pleine, donc temporairement un appel à l'ouverture ne peut pas être accepté.
24 EMFILE Too many apenfiles Le système ne peut pas allouer de mémoire pour enregistrer un autre fichier ouvert.
25 ENOTTY Not a typewriter Cette erreur se produit si le fichier spécifié n'est pas un fichier de caractères.
26 ETXTBSY Text file busy Une tentative a été effectuée pour ouvrir un fichier déjà ouvert en écriture.
27 EFBIG File too large Cette erreur se produit si la taille d'un fichier était supérieure à la taille maximale du fichier.
28 ENOSPC No space left on device Lors d'une écriture dans un fichier, il n'y a plus d'espace libre sur le périphérique.
29 ESPIPE Illegal seek Un lseek n'a pas été émis correctement.
30 EROFS Read-only file system Une tentative de modification d'un fichier ou d'un répertoire a été effectuée sur un périphérique monté pour un accès en lecture seulement.
31 EMLINK Too many links Une tentative de suppression d'un fichier ouvert a été effectuée.
33 EDOM Math arg out of domain of func Cette erreur se produit si le paramètre d'une fonction mathématique est en dehors du domaine de la fonction.
34 ERANGE Math result not representable Cette erreur se produit lorsque la valeur d'une fonction mathématique ne peut pas être représentée avec la précision de la machine.

Remarque : Méfiez-vous d'essayer d'accéder à la valeur de IOResult avec une opération d'entrée/sortie, telle que :

  1. Reset(f,'myflle');
  2. WriteLn('IOResult = ',IOResult);

Dans cet exemple, la valeur de IOResult est définie par l'appel Writeln, et non par l'appel Reset.

Attention : Certaines opérations d'entrées/sorties peuvent définir IOResult en raison d'un appel d'entrées/sorties invisible. Par exemple, l'utilisation de Rewrite pour créer un nouveau fichier renverra un IOResult Eof(-39), même si le fichier a été réécrit correctement.

La procédure Seek

Seek(f,n)

La procédure de recherche vous permet d'accéder à n'importe quel enregistrement logique dans un fichier. Cela fait deux choses :

Le paramètre f est une variable de fichier.

Le paramètre n est une expression avec une valeur d'entier long qui spécifie un numéro d'enregistrement logique dans le fichier. Les enregistrements logiques sont numérotés à partir de zéro. Avec des fichiers non typés ou des fichiers de type texte, n est la position de l'octet depuis le début du fichier.

Par exemple :

  1. Seek(Names, 18);

fait que la variable de fenêtre de fichier associée aux noms de fichiers pointe vers le dix-neuvième enregistrement du fichier.

La valeur de f^ devient la valeur de cet enregistrement logique sauf si n est supérieur au numéro du dernier enregistrement logique du fichier, auquel cas Eof(f) devient true, IOResult est défini sur eofErr(-39) et la valeur de f^ devient indéfini. Ainsi, Seek(f,MaxLongInt) définit toujours la position actuelle du fichier à la fin du fichier. EofErr n'est pas une erreur fatale, vous pouvez donc l'utiliser pour vérifier que la position actuelle du fichier a effectivement été déplacée vers la fin du fichier.

La fonction PLFilePos

PLFilepos(f)

La fonction PLFilepos renvoie une valeur de type LongInt étant le numéro d'enregistrement logique de la position actuelle du fichier. Avec les fichiers non typés ou les fichiers de type texte, il renvoie le nombre d'octets depuis le début du fichier jusqu'à la position actuelle du fichier. Le paramètre f est une référence de variable faisant référence à une variable de fichier. Le fichier doit être ouvert.

La procédure PLCrunch

PLCrunch(f)

La procédure PLCrunch prend en paramètre un fichier ouvert. Il tronque le fichier à la position actuelle.

La procédure PLPurge

PLPurge(f)

La procédure PLPurge supprime le fichier nommé par f. Une erreur se produit si le fichier est ouvert.

La procédure PLRename

PLRename(oldname,newname)

La procédure PLRename vous permet de renommer n'importe quel fichier.

Oldname et newname sont des chaînes de caractères. Oldname est le chemin d'accès Macintosh d'un fichier existant, pouvant être ouvert ; newname est un nouveau chemin d'accès Macintosh. Si un fichier nommé newname existe déjà, une erreur se produit et la valeur de IOResult est définie sur une valeur différente de zéro.

Routines orientées enregistrement

Les procédures décrites dans cette section permettent d'accéder aléatoirement aux enregistrements logiques d'un fichier. La plupart ne peuvent être utilisés qu'avec des fichiers structurés. Get et Put peuvent être utilisés avec des fichiers texte.

La procédure Get

Get(f)

La procédure Get fait deux choses :

Le paramètre f est une référence de variable faisant référence à une variable de fichier. Le fichier doit être ouvert ; si ce n'est pas le cas, une erreur se produit. Si une procédure Get est effectuée alors qu'aucun enregistrement logique suivant n'existe, Eof(f) devient true et la valeur de f^ devient indéfinie.

La procédure Put

Put(f)

La procédure Put fait deux choses :

Le paramètre f est une référence de variable faisant référence à une variable de fichier. Le fichier doit être ouvert et la valeur de f^ ne doit pas être indéfinie. L'instruction Put(f) écrit la valeur de f^ dans le fichier externe à la position actuelle du fichier et avance la position actuelle du fichier jusqu'à l'enregistrement logique suivant. Si Eof(f) est true, Put(f) ajoute la valeur de f^ à la fin du fichier/et Eof(f) reste true.

La procédure Read avec un fichier structuré

La procédure Read est généralement utilisée avec des fichiers de type texte. Lorsqu'il est utilisé avec un fichier structuré, il lit un ou plusieurs enregistrements logiques dans une ou plusieurs variables, en commençant à la position actuelle du fichier et en avançant le pointeur de position actuelle.

Read([f,] V1 [, V2, ..., Vn])

Le paramètre facultatif f est la variable d'un fichier structuré ouvert. Chaque paramètre vn doit être une variable d'un type compatible en termes d'affectation avec les enregistrements logiques de f. Par exemple, si Newvals est un fichier de type File of Real, alors la procédure appelle :

Read(NewVals, Subtotal, Total);

nécessite que Subtotal et Total soient des variables de types auxquelles une valeur de type réel peut être affectée. Si NewVals est une variable de type entier, par exemple, une erreur du compilateur se produit.

La procédure Write avec un fichier structuré

La procédure Write est généralement utilisée avec des fichiers de type Text. Lorsqu'il est utilisé avec un fichier structuré, il écrit la valeur d'une ou plusieurs variables dans un ou plusieurs enregistrements logiques du fichier, en commençant à la position actuelle du fichier et en avançant le pointeur de position actuelle.

Write([f,] P1 [, P2 ... Pn] )

Le paramètre facultatif f est la variable d'un fichier structuré ouvert. Chaque paramètre pn doit être une variable du type compatible en affectation avec les enregistrements logiques off. Par exemple, si NewVals est un fichier de type File of Real, alors l'appel de procédure :

Write(NewVals, SubTotal, Total);

requiert que SubTotal et Total soient des variables de types pouvant être affectées à une valeur de type réel (c'est-à-dire réel ou entier). Si NewVals est une variable de type Extended, par exemple une erreur du compilateur se produit.

Routines orientées texte

Cette section décrit les routines d'entrée et de sortie conçues pour être utilisées avec des variables de fichier de type Text. Les fichiers texte se distinguent des autres types de fichiers (par exemple, File of Char) par l'importance particulière accordée au caractère de fin de ligne. Ce caractère permet à un fichier de type Text d'être traité comme une séquence de lignes, plutôt que comme une séquence de caractères individuels. Toutes les routines orientées texte peuvent également être utilisées pour lire des données à partir du clavier. Une ligne entière peut être lue à partir du fichier dans une variable de type chaîne de caractères à l'aide de la procédure ReadLn, et une ligne entière peut être écrite dans le fichier à l'aide de la procédure WriteLn. Vous pouvez tester le caractère de fin de ligne en utilisant la fonction Eoln décrite plus loin dans cette page.

Remarque : Lorsque la valeur de l'enregistrement logique à la position actuelle d'un fichier est un caractère de fin de ligne, les procédures Read et Readln la lisent comme un caractère d'espace (ASCII 32).

Les procédures Read et Write peuvent être appliquées à n'importe quel fichier saisi. Cependant, les procédures Readln et Writeln dépendent de la présence du caractère Eoln, n'apparaissant que dans les fichiers de type texte.

Remarque : Aucune des procédures et fonctions prédéfinies dans cette section ne nécessite un paramètre de variable de fichier explicite. Si aucun fichier n'est nommé, l'un des fichiers prédéfinis, input ou output, sera assumé par défaut, selon que la procédure ou la fonction est orientée entrée ou orientée sortie. N'oubliez pas que le input et le output sont prédéclarées sous forme de fichiers de type Text.

La procédure Read

Read([f,] V1 [, V2,..., Vn])

La procédure Read lit une ou plusieurs valeurs d'un fichier texte dans une ou plusieurs variables.

Si f est donné, il doit s'agir d'une référence de variable faisant référence à une variable de fichier de type texte. Le fichier doit être ouvert. Si f est omis, il est supposé qu'il s'agit de l'entrée de fichier texte prédéfinie.

Chaque Vn est une référence de variable faisant référence à une variable de l'un des types suivants :

Read avec un élément de tableau suit les règles relatives au type de l'élément. Les autres possibilités sont discutées ci-dessous.

Read avec une variable char

Un Read effectuée avec une variable de type char est considérée comme équivalente à cette instruction composée :

  1. BEGIN
  2.  v:=ff^;
  3.  Get(ff)
  4. END

Dans cet exemple, v est une variable de type char et ff est un File of char. N'oubliez pas que si la position actuelle du fichier se trouve à un caractère de fin de ligne, ff^ contient un caractère espace.

Read avec une variable Integer

Une procédure Read effectuée avec une variable Integer ou de sous-intervalle Integer lit une séquence de caractères formant un nombre entier signé dans l'intervalle de type Integer ou de type LongInt. Si la séquence de caractères est une représentation valide d'un Integer, la valeur Integer est affectée à la variable. Sinon, une erreur se produit.

Lors de la lecture d'un Integer, la séquence de caractères, d'espaces, de tabulations et de caractères de fin de ligne précédant le premier chiffre ou le signe est ignorée. La lecture cesse dès qu'on atteint un caractère (avec les caractères déjà lus) ne faisant pas partie d'un nombre entier signé ; ou quand Eof(f) devient true.

Si un nombre entier signé n'est pas trouvé après avoir ignoré les espaces, tabulations et caractères de fin de ligne précédents, une erreur se produit et IOResult renvoie une valeur de -1025.

Les conditions suivantes sont vraies immédiatement après une lecture à partir d'un fichier texte avec une variable entière :

Read avec une variable réelle

Un Read effectuée sur un fichier texte avec une variable d'un des types réels lit une séquence de caractères formant un nombre signé. Si la séquence de caractères est une représentation valide d'une valeur de type réel, la valeur est affectée à la variable. Sinon, une erreur se produit.

Lorsqu'une valeur de type Real est en cours de lecture, toute séquence d'espaces et de tabulations précédant le premier chiffre ou le signe est ignorée. La lecture cesse dès qu'un caractère est atteint qui (avec les caractères déjà lus) ne fait pas partie d'un nombre signé, ou lorsque Eof(f) devient true.

Si un nombre réel signé n'est pas trouvé après avoir ignoré les espaces et tabulations précédents, NaN est renvoyé et l'exception est Invalid.

Remarque : En plus de la syntaxe Pascal standard, le MPW Pascal considère, par exemple, inf, NaN, NaN(0), NaN(), NaN(39), .369, .369312, 1. et 1.e9 comme étant tous valides et avec des chiffres réels.

Immédiatement après une lecture depuis un fichier texte avec une variable de type réel, les conditions suivantes sont vraies :

Read avec une variable chaîne de caractères

Un Read effectuée avec une variable chaîne de caractères lit une séquence de caractères jusqu'au caractère de fin de ligne suivant, mais non inclus, ou jusqu'à la fin du fichier. La chaîne de caractères résultante est affectée à la variable. C'est une erreur si le nombre de caractères lus dépasse l'attribut size de la variable.

Remarque : Avec une variable chaîne de caractères, Read ne passe pas à la ligne suivante après la lecture ; un caractère de fin de ligne est laissé dans le tampon du fichier. Pour cette raison, vous ne pouvez pas utiliser des appels Read successifs pour lire une séquence de chaînes de caractères; après la première lecture, chaque lecture suivante accédera à la fin de la ligne (au lieu d'un caractère) et lira une chaîne de caractères de longueur zéro. Au lieu de cela, vous devez utiliser Readln pour lire les valeurs de chaîne de caractères; Readln passe au début de la ligne suivante après chaque entrée.

Les conditions suivantes sont vraies immédiatement après une lecture à partir d'un texte avec une variable chaîne de caractères :

La procédure ReadLn

Readln([f,] V1 [ , V2, ..., Vn ] )

La procédure Readln est une extension de Read. Il lit une séquence de caractères jusqu'à ce que le caractère suivant soit le caractère de fin de ligne. Il passe ensuite au début de la ligne suivante dans le champ d'entrée. Étant donné que Readln dépend de la recherche du caractère de fin de ligne, il ne peut être utilisé qu'avec des fichiers de type text.

Les paramètres autorisés avec Readln sont les mêmes que ceux pour Read. De plus, vous pouvez utiliser ReadLn :

Si le premier paramètre ne spécifie pas de fichier ou si aucun paramètre n'est utilisé, Readln lit à partir de l'entrée du fichier standard.

Lorsque Readln est utilisé sans variables d'entrée, il avance la position actuelle du fichier au début de la ligne suivante, s'il y en a une. S'il n'y a pas de ligne suivante, il avance la position actuelle du fichier jusqu'à la fin du fichier.

Les conditions suivantes sont vraies immédiatement après une lecture Readln, quel que soit le type de variable d'entrée utilisée :

La procédure Write

Write([f,] P1 [,P2,...Pn])

La procédure Write écrit une ou plusieurs valeurs dans un fichier texte. Le paramètre f (s'il est donné) est une référence de variable faisant référence à une variable me de type Text. Le fichier doit être ouvert. Si f est omis, la procédure écrit dans la sortie du fichier prédéfini.

Chaque paramètre pn est un paramètre d'écriture. Au moins un paramètre d'écriture doit être présent. La valeur de chaque paramètre d'écriture, pn, est donnée par une expression de sortie, pouvant être de type Char, Inteqer, Real, STRING, PACKED ARRAY OF char ou Boolean.

Outre les expressions complexes, ces expressions de sortie incluent également des variables et des constantes uniques. Les effets de l'utilisation de la procédure d'écriture avec ces différents types sont discutés ci-dessous.

Chaque paramètre Write a le format :

OutExp [: MinWidth [:DecPlaces ]]

OutExp est une expression de sortie. MinWidth et DecPlaces sont des expressions facultatives avec des valeurs entières. Par exemple, dans les déclarations :

  1. Write(NewVals, Total);
  2. Write(NewVals, Total:8:4);

Total est l'expression de sortie. La valeur de la variable de type réel Total est à écrire dans le fichier NewVals. Dans le premier cas, les spécifications facultatives MinWidth et DecPlaces sont omises. Dans le deuxième cas, MinWidth est de huit et DecPlaces de quatre. Le total sera écrit dans un champ large de huit espaces et comportant quatre caractères à droite de la décimale.

MinWidth spécifie la largeur minimale du champ. La largeur minimale doit être supérieure ou égale à zéro. Exactement les caractères de largeur minimale sont écrits (en utilisant des espaces de début si nécessaire), sauf lorsque OutExpr a une valeur qui doit être représentée par plus de caractères MinWidth, auquel cas le nombre exact de caractères requis est écrit. MinWidth peut être utilisé avec un OutExp de n'importe quel type valide dans un paramètre d'écriture.

DecPlaces spécifie le nombre de décimales à utiliser dans la représentation en virgule fixe d'une valeur réelle. Il ne peut être spécifié que si OutExpr a une valeur de type réelle et si MinWidth est également spécifié. S'il est spécifié, il doit être supérieur à zéro. Si DecPlaces n'est pas spécifié et que la valeur est l'un des types réels, une représentation à virgule flottante est écrite. La représentation à virgule flottante est abordée plus loin dans cette page.

Write avec une valeur char

Si Write reçoit une variable de type char et que MinWidth n'est pas spécifié, la valeur de caractère de OutExpr est écrite dans le fichier spécifié. Si MinWidth est inclus, exactement les espaces MinWidth-1 sont écrits, suivis de la valeur de caractère OutExpr. Par exemple :

  1. Write(Names, Initial);
  2. Write(Names, Initial:3);

Dans le premier exemple, le caractère correspondant à la valeur Initial est écrit dans le fichier, sans espaces de début. Dans le deuxième exemple, Initial est écrit précédé de deux espaces.

Write avec une valeur Integer

Si OutExpr est de type Integer, sa représentation décimale est écrite dans le fichier spécifié comme par cet algorithme :

  1. Begin
  2.  For I:=1 To MinWidth-(Length(OutDigits)+1) do Write(ff,' ');
  3.  IF OutExpr<0 THEN
  4.   Write(ff,'-')
  5.  ELSE
  6.   Write(ff,' ');
  7.   Write(ff,OutDigits)
  8. End;

Le paramètre ff représente la variable référencée par f. OutDigits est une valeur de chaîne de caractères contenant la représentation décimale de la valeur absolue de OutExpr, sans zéros non significatifs sauf si la valeur de OutExpr est zéro, auquel cas outDigits contient le caractère unique «0».

Par exemple, si la représentation décimale de la valeur d'OutExpr est 4545 et de MinWidth est égale à huit, l'instruction FOR écrira trois caractères d'espace dans un fichier. Étant donné que outExpr n'est pas inférieur à zéro, la clause IF ne s'exécutera pas et la clause ELSE générera un espace supplémentaire. Enfin, la dernière instruction Write affichera le nombre décimal 4545 dans le fichier.

Voici quelques règles de syntaxe supplémentaires pour l'utilisation de l'écriture avec une valeur entière :

Write avec une valeur de type Real

Si OutExpr a une valeur réelle, sa représentation décimale est écrite dans le fichier spécifié. Cette représentation dépend de la valeur du paramètre DecPlaces (s'il est présent).

Si DecPlaces est présent, une représentation à virgule fixe est écrite. Si DecPlaces est absent, une représentation à virgule flottante est écrite. Les deux cas sont discutés séparément ci-dessous.

Représentation en virgule fixe

Supposons que IntDigits est une valeur de chaîne de caractères contenant la représentation décimale de cette expression :

  1. Trunc(Abs(OutExpr))

IntDigits ne contient pas de zéros non significatifs (sauf si la valeur de outExpr est zéro, auquel cas IntDigits contient le caractère unique 0). Cette expression est la valeur de la partie de outExpr à gauche du point décimal.

Supposons maintenant que FracDigits est une valeur de chaîne de caractères contenant la représentation décimale de cette expression :

Round((Abs(OutExpr)-Trunc(Abs(OutExpr))) * 10DecPlaces)

avec suffisamment de zéros non significatifs pour que la Length(FracDigits) soit égale à DecPlaces.

Ensuite, la représentation à virgule fixe est écrite dans le fichier à l'aide de cet algorithme :

  1. Begin
  2.  If MinWidth>=Length(IntDigits)+Length(FracDigits)+2 Then Write(ff,' ':MinWidth-TotalDigits-3);
  3.  If OutExpr<0 Then Write(ff,'-') 
  4.   Else
  5.  If MinWidth>=Length(IntDigits)+Length(FracDigits)+2 Then Write(ff, ' ');
  6.  Write(ff,IntDigits, '.',FracDigits)
  7. End;

Si la largeur minimale est omise dans le paramètre Write, elle est supposée être égale à dix.

Représentation à virgule flottante

L'algorithme utilisé pour écrire une représentation à virgule flottante fonctionne de cette manière. L'expression Abs(OutExpr) peut être représentée en notation à virgule flottante sous cette forme :

m.n*10e

Dans cette expression, il y a toujours un chiffre de un à neuf, sauf si la valeur de outExpr est zéro. Supposons que IntDigit est une valeur de chaîne de caractères contenant la représentation décimale de m - un seul chiffre. Supposons que FracDigits est une valeur de chaîne de caractères contenant les premiers chiffres MinWidth-9 de la représentation décimale de n arrondi, ou avec des espaces de fin conservés et des zéros de fin ajoutés si nécessaire. Supposons que ExpDigits est une valeur de chaîne de caractères contenant la représentation décimale d'Abs(e) avec suffisamment d'espaces de début pour que Length(ExpDigits) soit égale à quatre. Supposons également que NegExp a la valeur true si e<0 et qu'elle est fausse dans le cas contraire. Compte tenu de ces hypothèses, voici l'algorithme pour écrire une représentation à virgule flottante :

  1. Begin
  2.  If OutExpr<0 Then Write(ff, '-') Else Write(ff,' ');
  3.  Write(ff,IntDigit,'.', FracDigits, 'E');
  4.  IF NeqExp Then Write(ff, '-') Else Write(ff,'+');
  5.  Write(ff,ExpDigits)
  6. End;

Write avec une valeur de chaîne de caractères

Les résultats de l'utilisation de Write avec une variable de chaîne de caractères dépendent de l'attribut de longueur de la chaîne de caractères apparaissant comme OutExpr et du fait que la largeur minimale soit spécifiée ou non.

Voici les règles :

Par exemple, dans la déclaration :

  1. Write(LastName:8);

LastName est une variable chaîne de caractères d'une taille de dix. Si LastName contient une valeur de neuf ou dix caractères, seuls huit seront écrits dans la sortie.

Write avec un Packed Array Of Char

Si OutExpr est un PACKED ARRAY OF char, l'effet est le même que l'écriture d'une chaîne de caractères dont la longueur est le nombre d'enregistrements logiques dans le type.

Write avec une valeur Boolean

Si la valeur de OutExpr est de type Boolean, la chaîne de caractères 'TRUE' (avec un espace entête) ou la chaîne de caractères 'FALSE' est écrite dans le fichier f. La valeur par défaut de MinWidth est cinq. Si MinWidth est supérieur à cinq, des espaces de début sont ajoutés ; si MinWidth est inférieur à cinq, le caractère T ou F est écrit, complété par des espaces comme s'il s'agissait d'une valeur de type STRING[1].

La procédure WriteLn

WriteLn([f,] P1 [, P2,...,Pn])

La procédure WriteLn est une extension de Write. Il effectue les mêmes actions, puis écrit un caractère de fin de ligne dans le fichier de sortie.

Les paramètres sont les mêmes que ceux utilisés avec Write, sauf que les paramètres d'écriture peuvent être entièrement omis; sans eux, WriteLn écrit un caractère de fin de ligne dans la sortie.

La fonction Eoln

Eoln[(f)]

Le paramètre f est une référence de variable qui fait référence à une variable de fichier de type text. Le fichier doit être ouvert. Si f est omis, la fonction est appliquée à l'entrée de fichier prédéfinie.

Eoln renvoie true si le caractère à la position actuelle du fichier est un caractère de fin de ligne. Une erreur se produit si Eoln (f) est appliqué à un fichier non texte ou si f est en écriture seule. Si Eof(f) est vrai, Eoln() n'est pas défini.

La procédure Page

Page[(f)]

La procédure Page envoie un caractère de saut de page (ASCII 12) au fichier désigné par f. Si le paramètre file est omis, le caractère est envoyé à la sortie du fichier prédéfini.

La procédure PLSetVBuf

PLSetVBuf(f,bufptr,style,bufsize)

La procédure PLSetVBuf vous permet de spécifier votre propre tampon à utiliser avec les fichiers de type text.

Le paramètre f est une référence de variable faisant référence à une variable de fichier de type text. Le paramètre buffer est un pointeur vers un PACKED ARRAY OF char à utiliser comme tampon d'entrée/sortie de texte. bufsize est un entier donnant la taille du tampon en octets. Le style est un entier déterminant la manière dont la mise en mémoire tampon est effectuée.

Style Description
_IOFBF Les entrées/sorties sont mises en mémoire tampon.
_IOLBF La sortie est mise en mémoire tampon de ligne ; le tampon est vidé lorsqu'il est plein ou à Eoln.
_IONBF Les entrées/sorties ne sont pas tamponnées ; bufptr et bufsize sont ignorés.

Le système alloue normalement le tampon d'un fichier lorsque la première opération de lecture ou d'écriture est effectuée sur celui-ci. Pour allouer votre propre tampon, appelez PLSetVBuf après l'ouverture du fichier mais avant la première opération de lecture ou d'écriture. Si la valeur de bufptr est NIL, le système alloue un tampon de taille bufsize lors de la première opération de lecture ou d'écriture. Assurez-vous de fermer le fichier avant de libérer son tampon.

La procédure PLFlush

PLFlush(f)

La procédure PLFlush provoque l'écriture dans le fichier du contenu du tampon de sortie courant associé au fichier f de type text.

Les procédures Get et Put avec des fichiers texte

Les procédures Get et Put peuvent être utilisées pour le caractère à la fois d'entrée/sortie. Get avec un fichier texte diffère de Get avec un fichier structuré uniquement en ce sens qu'un caractère n'est pas lu tant qu'un programme n'a pas lu la variable de fenêtre de fichier. Ce comportement de Get permet d'interagir avec les informations saisies au clavier.

Important : Ne mélangez pas Get et Put avec Read et Write. Actuellement, ils ne sont pas compatibles.

Routines pour les fichiers non typés

Les routines suivantes ne peuvent être utilisées que sur des fichiers non typés, c'est-à-dire des variables de type FILE sans type d'enregistrement logique spécifié. Avec Blockread et Blockwrite, un fichier non typé est traité comme une séquence de blocs de 512 octets. Avec Byteread et Bytewrite, il est traité comme une séquence d'octets. Dans les deux cas, les octets du fichier ne sont pas vérifiés mais sont considérés comme des données brutes. Cela peut être utile pour les applications où les données n'ont pas besoin d'être interprétées du tout pendant les opérations d'entrées/sorties.

Les blocs d'un fichier non typé sont considérés comme numérotés séquentiellement en commençant par l'enregistrement logique 0. Le système garde la trace du numéro de bloc actuel ; c'est le bloc 0 immédiatement après l'ouverture du fichier. Chaque fois qu'un bloc est lu, le numéro du bloc actuel est incrémenté. Par défaut, chaque opération d'entrée/sortie commence au numéro de bloc actuel ; cependant, un numéro de bloc arbitraire peut être spécifié.

Un fichier non typé n'a pas de variable de fenêtre de fichier et il ne peut pas être utilisé avec la procédure Get ou Put ni avec aucune des procédures d'entrée/sortie orientées texte. Il ne peut être utilisé qu'avec Reset, Rewrite, Open, Close, Seek, Eof et les quatre fonctions décrites ci-dessous.

Pour utiliser un fichier non typé d'entrée/sortie, un fichier non typé est ouvert avec Open, Reset ou Rewrite ; les fonctions BlockRead, Blockwrite, Byteread et Bytewrite peuvent ensuite être utilisées pour l'entrée et la sortie.

La fonction Blockread

Blockread(f,databuf,count[,blocknum])

La fonction Blockread lit un ou plusieurs blocs de données de 512 octets à partir d'un fichier non typé vers une variable de programme et renvoie un entier représentant le nombre de blocs lus. Ses paramètres sont les suivants :

Une fois le dernier bloc du fichier lu, le numéro de bloc actuel n'est pas spécifié et Eof(f) est true. Sinon, Eof(f) est false et le numéro de bloc actuel est avancé au bloc après le dernier bloc lu. Si Blockread lit moins de blocs BlockNum, il renvoie le nombre réel de blocs lus. Si la fin du fichier se produit pendant la lecture du dernier bloc, le reste du bloc est rempli de zéro octet. Si Eof(f) est true lorsque Blockread est appelé, Blockread renvoie zéro et IOResult renvoie une valeur de eofErr(-39).

La fonction Blockwrite

Blockwrite(f,databuf,count,[blocknum])

La fonction Blockwrite écrit un ou plusieurs blocs de données de 512 octets à partir d'un tampon vers un fichier non typé et renvoie un entier représentant le nombre de blocs écrits.

Si l'espace disque s'épuise pendant le transfert de données, le numéro de bloc actuel n'est pas spécifié. Blockwrite renvoie le nombre réel de blocs écrits et définit IOResult sur une valeur différente de zéro. Sinon, le numéro de bloc actuel est avancé au bloc suivant le dernier bloc écrit.

Les fonctions Byteread et Bytewrite

Byteread(f, databuf, count [, blocknum])
Bytewrite(f, databuf, count[, blocknum])

Les fonctions Byteread et Bytewrite fonctionnent de manière identique à Blockread et Blockwrite, avec quatre différences :

Remarque : Le mélange de fonctions de fichier non typées de bloc et d'octet peut entraîner une confusion à moins que leurs paramètres Blocknum et Bytenum ne soient utilisés pour ajuster la position actuelle du fichier. Une fonction de bloc transfère toujours les 512 octets suivants; après une fonction d'octet, celle-ci peut ne plus être conforme à une limite naturelle de bloc.



Dernière mise à jour : Vendredi, le 28 juin 2024