Fonctions et procédures d'entrée/sortie OS-9 Pascal
Les opérations d'entrée/sortie OS-9 Pascal sont basées sur l'utilisation de procédures et de fonctions standard faisant partie de la bibliothèque standard. Étant donné qu'un ordinateur donné peut avoir une variété de périphériques matériels d'entrée et de sortie différents, les fonctions d'entrée/sortie intégrées doivent être non spécifiques et la norme ISO reflète cela. Étant donné que le système d'exploitation OS-9 permet d'accéder à tous les fichiers et périphériques d'entrée/sortie en utilisant essentiellement les mêmes méthodes d'appel, les programmes OS-9 Pascal peuvent lire ou écrire n'importe quel périphérique ou fichier d'entrées/sorties du système. Les fonctionnalités de gestion des entrées/sorties de OS-9 Pascal (ou leur absence) et leur fonctionnement sont souvent cités comme une faille importante dans un langage de programmation par ailleurs superbement conçu. Afin de surmonter ces limitations traditionnelles, la bibliothèque standard OS-9 Pascal comprend des fonctions d'entrées/sorties hautement intelligentes et une grande variété de fonctions supplémentaires (et non standard) afin que les programmes OS-9 Pascal puissent pleinement utiliser les installations d'entrée/sortie de l'ordinateur, y compris les fonctions interactives et les entrées/sorties à accès aléatoire. Les fichiers sont utilisés pour effectuer toutes les entrées/sorties sur les terminaux, les imprimantes, les fichiers disque,..., et en général, les fonctions d'entrées/sorties standard fonctionnent avec n'importe quel périphérique d'entrée/sortie. Ce type d'opération fonctionne bien avec la conception indépendante du périphérique du système d'exploitation OS-9, c'est-à-dire qu'un "fichier" Pascal est analogue à un "chemin" OS-9. Le OS-9 Pascal reconnaît deux catégories d'objets fichier : les fichiers TEXT ("textfiles") et le type FILE structuré. Les fichiers texte sont ce que leur nom implique : du texte sous forme de caractères organisés en lignes terminées par un caractère de fin de ligne. Les fonctions d'entrée/sortie de base et les plus couramment utilisées fonctionnent sur des fichiers texte. Les variables TEXT et les variables de type FILE sont déclarées dans la section de déclaration de variable de programme ou de sous-programme. Dans les descriptions de procédure d'entrée/sortie standard fournies dans les pages suivantes, le nom de chaque procédure est suivi d'une liste de paramètres attendus. Vous pouvez généralement dire à quelle classe d'entrée/sortie la fonction s'applique par la description du premier identificateur de la liste comme suit :
Classe | Description |
---|---|
"text-filename" | Signifie que la fonction doit être utilisée avec des fichiers texte. |
"file-variable" | Signifie que la fonction doit être utilisée avec des types de fichiers structurés. |
"filename" | Signifie que la fonction peut être utilisée avec l'un des types. |
Les procédures utilisant un ou plusieurs paramètres appelés «noms de fichiers externes» acceptent directement un nom de fichier OS-9 standard. Le nom de fichier OS-9 doit être passé sous forme de constante de chaîne de caractères ou de tableau de caractères. Les noms de fichiers entreposés dans un tableau de caractères doivent être terminés par un caractère que OS-9 reconnaîtra comme la fin d'un nom de chemin valide tel qu'un espace ou un caractère de retour chariot (ENTER).
Fichiers d'entrée/sortie standard prédéfinis
Trois noms de fichiers, INPUT, OUTPUT et SYSERR, sont prédéfinis en tant que fichiers texte. Ils ne peuvent pas être redéfinis dans un programme. Les enregistrements de sortie peuvent avoir n'importe quelle longueur et les enregistrements d'entrée peuvent contenir jusqu'à 127 caractères. Ces trois fichiers correspondent aux trois chemins d'entrée/sortie standard OS-9 et peuvent être redirigés lorsque le programme est exécuté au moyen des opérateurs OS-9 Shell "<" ">" et ">>".
Nom | Chemin OS-9 | Attributs |
---|---|---|
INPUT | 0 | Entrée seulement (clavier utilisateur) |
OUTPUT | 1 | Entrée ou sortie (affichage utilisateur) |
SYSERR | 2 | Entrée ou sortie (affichage utilisateur) |
Le fichier prédéfini "SYSERR" est une extension non standard de OS-9 Pascal.
Différences entre les fichiers interactifs et d'entreposage de masse
Il existe des différences importantes entre le traitement des fichiers étant dirigés vers des fichiers de type interactif (SCF) tels que des terminaux, et des fichiers de type d'entreposage de masse (RBF). Lorsque les WRITE sont envoyés à un périphérique de type SCF, le système de support OS-9 Pascal supprimera tous les blancs de fin de la ligne. Ceci est généralement très souhaitable pour réduire le temps nécessaire pour écrire une ligne sur un terminal, et c'est ainsi que vous vous attendez à ce que les entrées/sorties se produisent. Une fonction similaire se produit lorsqu'un fichier de longueur fixe est dirigé vers un périphérique SCF et qu'un GET est émis. Dans ce cas, une fois que le caractère de retour chariot (ENTER) est donné, le reste de l'enregistrement de longueur fixe est rempli de caractères d'espacement, ce qui vous permet de déclarer un fichier comme un tableau de caractères de longueur fixe et de lire les enregistrements dans une manière "utilisateur amicale". La fonction GETCHAR permet de lire des caractères d'entrée uniques et non modifiés. La fonction IOREADY peut être utilisée pour tester si un caractère a été typé et attend d'être lu. Ces deux fonctions sont inestimables pour l'écriture de programmes orientés écran pilotés par menus.
La plus grande différence entre le traitement des périphériques de type RBF et SCF réside dans le fait que les tampons ne sont pas chargés tant qu'ils ne sont pas nécessaires pour les fichiers de type SCF. Pour les fichiers de type RBF, entrée/sortie est traité comme décrit dans la spécification du langage de programmation - le tampon d'un fichier est chargé avec le contenu du premier enregistrement dès que le fichier est ouvert et l'état EOLN et EOF est disponible immédiatement. Pour les fichiers de type SCF, étant donné que les enregistrements ne sont pas chargés dans la mémoire tampon tant qu'ils ne sont pas nécessaires, l'état EOLN et EOF du fichier peut être légèrement différent de celui attendu. La raison des différences dans la gestion des deux types de périphériques de fichiers est de fournir un type de gestion de fichiers plus «naturel». Par exemple, si le tampon d'un périphérique de type SCF était chargé dès que le fichier était ouvert, il serait difficile d'émettre une invite au terminal pour indiquer à l'utilisateur ce qui était attendu pour la saisie - l'utilisateur devrait typer sa première ligne d'entrée avant qu'il ne puisse voir ce qu'il était censé entrer. Heureusement, il n'y a que deux considérations majeures dont vous devez être conscient pour gérer correctement la différence de traitement entre les deux types de périphériques. Tout d'abord, vous devez connaître les différences concernant la signalisation EOLN et EOF. Étant donné que, lorsque le fichier est ouvert pour la première fois pour un périphérique de type SCF, le tampon n'est pas préchargé, il n'est pas possible de définir EOLN ou EOF. Le système ne peut pas dire, bien sûr, si l'utilisateur va appuyer sur le retour chariot (ENTER) ou sur les touches de fin de fichier jusqu'à ce que vous lisiez réellement le premier enregistrement, ce qui n'est pas vrai pour les périphériques de type REF puisque le premier enregistrement est pré-chargé dès que le fichier est ouvert, et le système de support peut facilement déterminer si la condition EOLN ou EOF existe pour le premier enregistrement du fichier. Un problème similaire se produit chaque fois qu'un appel READLN est effectué sur un fichier de type SCF. Le READLN effacera le tampon actuel et définira EOLN sur false, mais encore une fois, l'enregistrement suivant n'est pas réellement lu tant qu'il n'est pas nécessaire, donc EOLN et éventuellement EOF ne peuvent être détectés qu'après la lecture réelle de l'enregistrement suivant. Lorsque READLN est émis par rapport à un fichier de type RBF, la mémoire tampon actuelle est effacée et l'enregistrement suivant est immédiatement chargé à partir du fichier disque - ainsi EOLN et EOF sont immédiatement connus pour l'enregistrement suivant.
La deuxième considération est simplement une méthode de programmation éliminant la plupart des problèmes de traitement découlant des différences de traitement entre les deux types de fichiers. Chaque fois qu'une nouvelle ligne doit être traitée, codez simplement l'instruction :
IF interactive(fi1ename) THEN get(fi1ename);
disant simplement que si le fichier "filename" est un périphérique interactif (c'est-à-dire de type SCF), alors obtenez l'enregistrement suivant. Si "filename" est un périphérique de type RBF, les tampons sont automatiquement préchargés selon les besoins, et l'instruction ne fera pas l'opération GET. Si, cependant, le fichier est un périphérique de type SCF, l'émission de l'appel GET entraînera le chargement immédiat du tampon afin que EOLN et EOF soient correctement définis. Rappelez-vous, n'émettez cet appel que lorsque la ligne suivante doit être traitée, comme immédiatement après l'ouverture du fichier et la première ligne est nécessaire, ou après que EOLN a été détecté pour un enregistrement et READLN a été émis pour effacer le tampon actuel.
Procédures standard d'entrée/sortie
Procedure APPEND(text-filename {,external-filename {open-mode}}) |
La procédure APPEND est identique à RESET décrit ci-dessous sauf qu'il ne peut être appliqué qu'aux fichiers d'enregistrement de longueur variable (c'est-à-dire texte). Seuls les PUT et WRITE seront autorisés, et les nouveaux enregistrements sont automatiquement ajoutés à la fin du fichier texte actuel. Les enregistrements actuellement dans le fichier ne sont pas détruits comme avec REWRITE.
Procedure CLOSE(filename) |
La procédure CLOSE effectue une fermeture explicite du fichier désigné. Tous les fichiers à l'exception des trois fichiers prédéfinis sont toujours fermés implicitement à la sortie du bloc dans lequel ils ont été déclarés. Aucune erreur n'est générée si le fichier est déjà fermé.
Procedure GET(fi1e-variable) Procedure PUT(fi1e-variable) |
La procédure GET fait avancer le pointeur de fichier vers la composante suivant du fichier (exemple lire un enregistrement dans le fichier). La procédure PUT ajoute la valeur de la variable de fichier au fichier (c'est-à-dire ajoute un enregistrement au fichier). Si la fin du fichier est atteinte lors d'un GET, EOF est défini sur true et la valeur des données lues n'est pas définie. Bien que la spécification ISO indique que le pointeur de fichier doit être à la fin du fichier pour que PUT fonctionne, le OS-9 Pascal permet aux enregistrements d'être lus ou écrits dans n'importe quel ordre (voir la procédure standard REPOSITION).
Procedure GETINFO(filename, 32-byte-structure) Procedure PUTINFO(filename, 32-byte-structure) |
Ces procédures lisent ou écrivent une copie de la zone d'options de 32 octets dans le descripteur de chemin OS-9 définissant l'édition des entrées de ligne et contrôle les définitions de caractères. Le deuxième paramètre doit être le nom d'un identificateur d'une taille de 32 octets. Utilisez ces appels avec beaucoup de prudence car leur mauvaise utilisation pourrait produire des résultats étranges.
Procedure IOABORT(filename, logical-value) |
Si logical-value est FALSE, les erreurs d'entrées/sorties non fatales associées au nom de fichier n'interrompent pas l'exécution du programme. Après chaque appel d'entrées/sorties, vous devez utiliser la fonction IORESULT pour vérifier les résultats jusqu'à ce qu'un appel IOABORT soit à nouveau donné avec une valeur TRUE. Si une erreur d'entrée/sortie se produit pour un fichier ayant désactivé son drapeau d'abandon d'entrée/sortie et qu'un numéro d'erreur précédent n'a pas été effacé via un appel à IORESULT, seules les informations d'erreur précédentes sont conservées, la nouvelle erreur est le numéro est perdue.
Procedure OVERPRINT(text-filename) |
La procédure OVERPRINT produit un retour chariot sans saut de ligne.
Procedure PAGE(text-filename) |
La procédure PAGE est similaire à WRITELN sauf qu'un éjection de page (saut de page) est généré, donc la sortie apparaît sur la page physique suivante. Le fonctionnement dépend quelque peu du matériel dans la mesure où le périphérique de sortie doit reconnaître le caractère de saut de page.
Procedure PROMPT(text-filename) |
La procédure PROMPT entraîne le retrait immédiat du tampon de texte actuel sans retour chariot ni caractères de saut de ligne.
Procedure READ({file-variable,} read-parameter-list) Procedure WRITE({file-variable,} write-parameter-list) |
Ces procédures permettent à une ou plusieurs variables d'être lues ou écrites dans un fichier sans qu'il soit nécessaire de manipuler la variable de fichier pour chaque élément à lire ou à écrire. Comme avec les primitives GET et PUT, les enregistrements peuvent être accédés dans un ordre séquentiel ou aléatoire. La liste de paramètres doit être une liste de noms de variables (READ) ou une liste de noms de variables, d'expressions et de directives de mise en forme (WRITE). REMARQUE : Une caractéristique non standard spéciale de WRITE utilisant une sortie formatée est le cas de la directive de format ":w:d" pour les nombres REAL. Si "d" est égal à zéro, le nombre est affiché au format "entier" sans point décimal ni zéros de fin.
Procedure READLN({text-filename,} read-parameter-list) Procedure WRITELN({text-filename,} write-parameter-list) |
Ces procédures permettent à une ou plusieurs variables d'être lues ou écrites dans un fichier texte (séquentiel). Une liste de paramètres identifie le(s) nom(s) de la ou des variables à lire ou à écrire. La liste de paramètres doit être une liste de noms de variables (pour READLN) ou une liste de noms de variables, d'expressions et de directives de mise en forme (WRITELN). REMARQUE: Une caractéristique non standard spéciale de WRITELN utilisant une sortie formatée est le cas de la directive de format «:w:d» pour les nombres REAL. Si "d" est égal à zéro, le nombre est affiché au format "integer" sans point décimal ni zéros de fin.
Procedure REPOSITION(fi1e-variable, record-number) |
La procédure REPOSITION repositionne le pointeur de fichier sur un enregistrement de longueur fixe spécifique dans le fichier spécifié. Pour mettre à jour les enregistrements dans un ordre aléatoire, pour chaque enregistrement, effectuez les étapes suivantes : REPOSITION sur l'enregistrement, GET l'enregistrement, REPOSITION de nouveau sur l'enregistrement, PUT l'enregistrement. Le paramètre numéro d'enregistrement peut être une expression de valeur entière ou réelle ou un nom de variable.
Procedure RESET(file-variable {,external-filename { ,open-mode}} ) Procedure REWRITE(file-variable {,external-filename { ,open-mode}}) |
La procédure RESET repositionne le pointeur de fichier au début du fichier afin qu'il puisse être relu depuis son début, par exemple, le fichier est rembobiné. La procédure REWRITE est similaire sauf que toutes les données sont effacées (et le fichier devient vide) afin qu'il puisse être réécrit. Un deuxième paramètre facultatif (devant être une constante de chaîne de caractères ou un ARRAY OF CHAR) peut être utilisé pour spécifier un nom de fichier OS-9 externe. Si le deuxième paramètre n'est pas donné, le nom du fichier externe utilise par défaut l'identificateur utilisé pour nommer le fichier dans le programme. Si RESET ou REWRITE est utilisé sur un fichier étant déjà ouvert, l'action dépend si un deuxième paramètre est donné ou non; si aucun paramètre n'est fourni, le fichier est rembobiné et le fichier est marqué comme entrée ou sortie uniquement. Si le deuxième paramètre est donné, le fichier courant est fermé et le nom de fichier donné est ouvert et marqué comme entrée ou sortie uniquement. Si le fichier référencé dans un appel REWRITE existe déjà, il sera effectivement supprimé avant son ouverture. Un troisième paramètre facultatif (devant être une expression entière) est utilisé pour déterminer les attributs de création du fichier et le mode d'accès du fichier. Lorsqu'un fichier est créé, les 8 bits de poids faible sont utilisés pour déterminer l'octet d'attribut du fichier. Les 8 bits de poids fort sont utilisés pour déterminer le mode d'accès du fichier lors de l'ouverture initiale du fichier. Si ce paramètre est manquant, une valeur par défaut de $0303 sera utilisée (octet d'attribut de fichier en lecture/écriture utilisateur, lecture/écriture autorisée dans le fichier).
Procedure SEEKEOF(fi1e-variable) |
La procédure SEEKEOF configure le bloc de contrôle de fichier de sorte que la prochaine opération d'écriture ou de placement ajoute des enregistrements à la fin du fichier. Un READ ou GET renverrait une condition de fin de fichier.
Procedure SHORTIO(fi1e-variable, record-length) |
La procédure SHORTIO définit la longueur de l'enregistrement dans le bloc de contrôle de fichier sur la valeur de la variable entière ou de l'expression «record-length». L'opération PUT/GET suivante peut alors écrire/lire un court enregistrement. Une fois l'opération PUT/GET effectuée, la longueur d'enregistrement dans le bloc de contrôle du fichier sera réinitialisée à la longueur déclarée pour le fichier dans le programme source. La procédure SHORTIO est généralement utilisé après l'exécution d'un GET sur le fichier et une erreur «short record» est renvoyée. En exécutant les instructions suivantes :
SHORTIO(fileex,LINELENGTH(fileex)); PUT(fileex);
une fois que le fichier a été correctement positionné (voir REPOSITION), vous pouvez réécrire l'enregistrement court dans le fichier sans obtenir d'erreurs de longueur d'enregistrement et sans allonger la longueur de l'enregistrement court. Vous ne pouvez pas définir la longueur d'enregistrement sur un nombre négatif ou sur un nombre plus grand que la longueur d'enregistrement déclarée avec cette procédure.
Procedure SYSREPORT({text-filename,) integer-value) |
La procédure SYSREPORT est utilisé pour le rapport d'erreur standard automatique. Il recherche dans le fichier PASCALERRS (devant être dans le répertoire d'exécution courant) le numéro d'enregistrement (message d'erreur) passé dans les paramètres entiers. Le premier enregistrement du fichier est l'enregistrement 1 pour cette procédure uniquement. Le texte du message d'erreur est ensuite écrit dans le fichier texte référencé. Si le nom du fichier texte n'est pas indiqué, avec la virgule suivante, le fichier standard "SYSERR" est utilisé. Cette routine vous permet d'ajouter vos propres messages au fichier PASCALERRS et d'avoir une méthode simple pour générer des messages. Le texte du message n'est pas automatiquement forcé dans le fichier texte, vous devrez généralement terminer la séquence de rapport d'erreurs avec un appel PROMPT(text-filename) ou WRITELN(text-filename). Il vous permet d'ajouter des informations supplémentaires au message d'erreur avec les appels WRITE, si nécessaire.
Procedure UPDATE(fi1e-variable {,external-filename {,open-mode}}) |
La procédure UPDATE est identique à RESET et REWRITE décrits ci-dessus, sauf qu'il ne peut pas être appliqué aux fichiers de longueur d'enregistrement variable (c'est-à-dire texte), et le tampon n'est pas chargé avec le premier enregistrement lorsque le fichier est ouvert pour la première fois. Les GET et les PUT seront autorisés tant qu'une série de GET uniquement ou une série de PUT uniquement sera effectuée. Si vous souhaitez effectuer un ou plusieurs GET suivis d'un ou plusieurs PUT, ou vice-versa, vous devez appeler REPOSITION entre les deux types d'appels. Tous les enregistrements actuellement dans le fichier ne sont pas détruits comme avec REWRITE.
Procedure WRITEEOF(fi1e-variable) |
La procédure WRITEEOF définit la marque EOF du fichier sur la position actuelle dans le fichier. Notez que l'émission d'un REWRITE dans un fichier marque automatiquement le fichier comme vide. La procédure WRITEEOF permet de marquer tout numéro d'enregistrement valide dans un fichier d'enregistrement de longueur fixe comme dernier enregistrement du fichier. Tous les enregistrements précédemment écrits au-delà de la position d'enregistrement actuelle sont perdus.
Fonctions d'entrée/sortie
Function EOF{(filename)}:boolean |
La fonction EOF renvoie TRUE si la position actuelle du fichier est à la fin du fichier, FALSE sinon.
Function EOLN{(filename)}: boolean |
La fonction EOLN renvoie TRUE si la position actuelle du fichier pointe vers un caractère de fin de ligne dans la mémoire tampon du fichier. La fonction EOLN ne peut être utilisé qu'avec des fichiers texte.
Function FILESIZE(fi1e-variable): real |
La fonction FILESIZE renvoie le nombre d'enregistrements entiers actuellement dans un fichier d'enregistrement de longueur fixe. La fonction FILESIZE ne fournit pas d'indication si le dernier enregistrement d'un fichier n'est qu'un enregistrement partiel en raison d'une création de fichier incorrecte. Toute tentative d'obtention d'un enregistrement partiel provoquera une erreur.
Function GETCHAR(fi1ename): char |
La fonction GETCHAR renvoie un seul octet binaire à partir du tampon d'entrée si disponible, sinon attend qu'un caractère soit entré. La fonction GETCHAR est très utile pour le menu à une seule touche sélectionné, la lecture de périphériques d'entrée/sortie non standard,...
Function INTERACTIVE(text-filename): boolean |
La fonction INTERACTIVE renvoie TRUE si le fichier est un périphérique interactif (c'est-à-dire SCF), FALSE dans le cas contraire. Il existe plusieurs différences dans la manière dont les entrées/sorties sont gérées pour les périphériques interactifs. Vous souhaiterez peut-être coder votre programme pour gérer correctement les deux cas. Les fichiers d'entrée interactifs ne préchargent pas le tampon de fichier lorsque le fichier est ouvert.
Function IOREADY(fi1ename): boolean |
La fonction IOREADY renvoie TRUE s'il y a au moins un caractère dans le tampon d'entrée OS-9; FALSE sinon. Utile pour détecter si une touche a été enfoncée sur un périphérique interactif. Une fonction d'entrée ultérieure doit être utilisée pour lire réellement les données.
Function IORESULT(fi1ename): integer |
La fonction IORESULT renvoie le résultat du code d'erreur de la dernière opération effectuée sur le fichier (voir IOABORT). Si aucune erreur ne s'est produite depuis le dernier appel IORESULT, zéro est renvoyé. Les numéros d'erreur inférieurs à 100 sont des erreurs Pascal tandis que d'autres sont des erreurs OS-9. Chaque appel à IORESULT renvoie le numéro d'erreur actuel, puis réinitialise le numéro d'erreur actuel à zéro. Si une opération d'entrée/sortie doit renvoyer un numéro d'erreur et constate qu'un numéro d'erreur a déjà été enregistré (c'est-à-dire qu'il n'a pas été effacé par un appel à IORESULT), le numéro précédemment enregistré est conservé et le nouveau numéro d'erreur est perdu.
Function LINELENGTH(filename): integer |
La fonction LINELENGTH renvoie la longueur de l'enregistrement actuellement dans la mémoire tampon. Il s'agit de la longueur du dernier enregistrement lu ou de la longueur actuelle de l'enregistrement étant sur le point d'être écrit.
Function OPENED(fi1ename): boolean |
Cette fonction OPENED renvoie TRUE si le fichier est actuellement ouvert, FALSE sinon.
Function POSITION(fi1e-variable): real |
Cette fonction POSITION renvoie le numéro d'enregistrement de l'enregistrement suivant à lire ou à écrire (c'est-à-dire le pointeur de position actuelle du fichier).