Entrée/sortie
Il existe deux ensembles de fonctions pour accéder aux fichiers et aux périphériques : les fonctions d'entrées/sorties sans tampon et les fonctions d'entrée/sortie standard. Ces fonctions sont identiques à leurs équivalents UNIX. Les fonctions d'entrées/sorties sans tampon sont ainsi appelées car, à quelques exceptions près, elles transfèrent des informations directement entre un programme et un fichier ou un périphérique. En revanche, les fonctions d'entrées/sorties standard maintiennent des tampons à travers lesquels les données doivent passer sur leur trajet entre un programme et un fichier disque. Les fonctions d'entrées/sorties sans tampon sont utilisées par les programmes effectuant leur propre blocage et déblocage des fichiers disque. Les fonctions d'entrées/sorties standard sont utilisées par les programmes ayant besoin d'accéder aux fichiers mais ne veulent pas être dérangés par les détails du blocage et du déblocage des enregistrements de fichiers. La procédure de base pour accéder aux fichiers et aux périphériques est la même pour les entrées/sorties standard et sans tampon : le périphérique ou le fichier doit d'abord être ouvert, c'est-à-dire préparé pour le traitement. Ensuite, les opérations d'entrées/sorties se produisent : puis le périphérique ou le fichier est fermé. Un maximum de onze fichiers et périphériques peuvent être ouverts à la fois pour les entrée/sortie standard et sans tampon. Lorsque cette limite est atteinte, un fichier ou un périphérique ouvert doit être fermé avant qu'un autre puisse être ouvert. Chaque ensemble de fonctions a ses propres fonctions pour effectuer ces opérations. Par exemple, chaque ensemble a ses propres fonctions pour ouvrir un fichier ou un périphérique. Une fois qu'un fichier ou un périphérique a été ouvert, il n'est accessible que par les fonctions du même ensemble que la fonction ayant effectué l'ouverture, et doit être fermé par la fonction appropriée du même ensemble. Il existe des exceptions à ce non-mélange. Il existe deux façons d'ouvrir un fichier ou un périphérique : premièrement, le programme peut l'ouvrir explicitement en lançant un appel de fonction. Deuxièmement, il peut être associé à l'une des entrées standard, sortie standard ou erreur standard de l'un des périphériques logiques, puis ouvert au démarrage du programme.
Périphériques d'entrée standard, de sortie standard et d'erreur standard
Il y a trois périphériques logiques ayant automatiquement été ouverts au démarrage d'un programme : entrée standard, sortie standard et erreur standard. Par défaut, ceux-ci sont associés à la console. L'opérateur, dans le cadre de la ligne de commande démarrant le programme, peut spécifier que ces périphériques logiques doivent être redirigés vers un autre périphérique ou fichier. L'entrée standard est redirigée en saisissant sur la ligne de commande, après le nom du programme, le nom du fichier ou du périphérique, précédé du caractère «<». La sortie standard est redirigée en entrant le nom du fichier ou du périphérique, précédé de «>». Par exemple, supposons que la copie du programme exécutable lit l'entrée standard et l'écrit dans la sortie standard. Ensuite, la commande suivante lit les lignes du clavier et les écrit sur l'écran :
copy |
Ce qui suit va lire à partir du clavier et l'écrire dans le fichier testfile :
copy >testfi1e |
Cela copiera le fichier exmplfil vers la console :
copy <exmplfil |
Et cela copiera exmplfil dans testfile :
copy <exmplfil >testfile |
Le langage de programmation Aztec C passera les paramètres de ligne de commande au programme de l'utilisateur via la fonction main(argc, argv) de l'utilisateur. Le paramètre argc est un entier contenant le nombre de paramètre plus un; le paramètre argv est un pointeur vers un tableau de pointeurs de caractères, dont chacun, à l'exception du premier, pointe vers un paramètre de ligne de commande. Le premier élément de tableau sur certains systèmes pointe vers la commande; sur d'autres systèmes, par exemple, CP/M et CP/M-86, le premier pointeur est nul. Par exemple, si la commande suivante est entrée :
cat arg1 arg2 arg3 |
le programme cat sera activé et l'exécution commencera à partir de la fonction principale de l'utilisateur. Le premier paramètre à main est l'entier 4. Le deuxième paramètre est un pointeur vers un tableau de quatre pointeurs de caractères; sur certains systèmes, le premier élément du tableau pointera vers la chaîne de caractères "cat" et sur d'autres ce sera un pointeur NULL. Les deuxième, troisième et quatrième éléments du tableau seront respectivement des pointeurs vers les chaînes de caractères "arg1", "arg2" et "arg3". La ligne de commande peut contenir à la fois des paramètres à transmettre au programme de l'utilisateur et des spécifications de redirection d'entrées/sorties. Les chaînes de caractères de redirection d'entrées/sorties ne seront pas transmises au programme de l'utilisateur et peuvent apparaître n'importe où sur la ligne de commande après le nom de la commande. Par exemple, la sortie standard du programme cat peut être redirigée vers le fichier outfile par l'une des commandes suivantes; dans chaque cas, les paramètres argc et argv de la fonction principale de cat sont les mêmes que si le spécificateur de redirection n'était pas présent :
cat arg1 arg2 arg3 >outfile cat >outfile arg1 arg2 arg3 cat arg1 >outfile arg2 arg3 |
Entrée/sorties séquentielles
Un programme peut accéder aux fichiers de manière séquentielle et aléatoire. Pour un accès séquentiel, un programme émet simplement l'un des différents appels de lecture ou d'écriture. Le transfert commencera à la position actuelle du fichier et laissera la position actuelle définie sur l'octet suivant le dernier octet transféré. Un fichier peut être ouvert pour un accès en lecture ou en écriture; dans ce cas, sa position actuelle est initialement le premier octet du fichier. Un fichier peut également être ouvert pour ajouter un accès; dans ce cas, sa position actuelle est initialement la fin du fichier. Sur les systèmes ne gardant pas trace du dernier caractère écrit dans un fichier, comme CP/M et Apple DOS, il n'est pas toujours possible de positionner correctement un fichier auquel des données doivent être ajoutées.
Entrée/sortie aléatoires
Deux fonctions sont fournies permettant à un programme de définir la position actuelle d'un fichier ouvert : fseek, pour un fichier ouvert pour les entrées/sorties standard; et lseek, pour un fichier ouvert pour les entrées/sorties sans tampon. Un programme accède à un fichier de manière aléatoire en modifiant d'abord la position actuelle du fichier à l'aide de l'une des fonctions de recherche. Ensuite, le programme émet l'un des différents appels de lecture et d'écriture, accédant séquentiellement au fichier. Un fichier peut être positionné par rapport à son début, sa position actuelle ou sa fin. Le positionnement par rapport au début et à la position actuelle est toujours correctement effectué. Pour les systèmes ne gardant pas trace du dernier caractère écrit dans un fichier, comme CP/M et Apple DOS, le positionnement par rapport à la fin d'un fichier ne peut pas toujours être effectué correctement.
Trouver la fin d'un fichier
Le système d'exploitation UNIX garde la trace du dernier caractère écrit dans un fichier. Puisque les fonctions d'entrées/sorties du Aztec C tentent de faire ressembler un fichier à un fichier UNIX à un programme, lorsqu'un programme demande qu'un fichier soit positionné par rapport à sa fin (c'est-à-dire par rapport au dernier caractère y ayant été écrit), les routines Aztec C doivent essayer de localiser le dernier caractère y ayant été écrit. Cela peut toujours être fait si le système d'exploitation sur lequel s'exécute Aztec C conserve également la trace du dernier caractère écrit dans un fichier. Cependant, CP/M, CP/M-86 et Apple DOS ne gardent trace que du dernier enregistrement écrit dans un fichier. Pour ces systèmes, il n'est pas toujours possible pour les fonctions d'entrées/sorties d'Aztec C de déterminer le dernier caractère écrit dans le fichier, et donc pour ces systèmes, il n'est pas toujours possible de positionner un fichier par rapport à sa fin. Lorsqu'un programme s'exécutant sur l'un des systèmes mentionnés dans le dernier paragraphe demande le positionnement d'un fichier par rapport à sa fin, les fonctions d'entrées/sorties d'Aztec C tentent de trouver le dernier caractère écrit dans le fichier. Ils réussissent toujours si le fichier ne contient que du texte : pour les fichiers contenant des données arbitraires, ils peuvent échouer. Pour localiser le dernier caractère valide dans un fichier sur l'un de ces systèmes, les routines Aztec C utilisent le fait suivant : lorsqu'un fichier est créé sur ces systèmes en utilisant Aztec C, le dernier enregistrement du fichier est complété à la fin avec le caractère spécial indiquant la fin d'un fichier texte. Pour CP/M et CP/M-86, le caractère spécial est Control+Z : pour Apple DOS, c'est un caractère NULL. Si le programme a rempli exactement le dernier enregistrement, il n'aura aucun remplissage. Lorsqu'un programme demande qu'un fichier soit positionné par rapport à sa fin, les routines d'entrées/sorteis Aztec C recherchent le dernier enregistrement du fichier; la fin du fichier est déclarée située à la position suivant le dernier caractère non-fin de fichier. Pour les fichiers de texte, cet algorithme détermine toujours correctement le dernier caractère du fichier, donc l'ajout aux fichiers texte est toujours correctement effectué. Pour les autres fichiers, cet algorithme déterminera toujours correctement le dernier caractère valide du fichier... la plupart du temps. Toutefois, si les derniers caractères valides du fichier sont des caractères de fin de fichier, le fichier sera mal positionné.
Ouverture de fichiers
L'ouverture des fichiers dépend quelque peu du système : les paramètres des fonctions ouvertes sont les mêmes sur les paquets Aztec C pour tous les systèmes, mais certaines dépendances système existent, pour se conformer aux conventions du système. Par exemple, la syntaxe des noms de fichiers et et les zones recherchées pour les fichiers diffèrent d'un système à l'autre.
Ouverture de fichiers sur CP/M, CP/M-86 et les systèmes associés
La chaîne de caractères spécifiant le fichier à ouvrir comporte les champs suivants, devant être dans l'ordre indiqué: (1) un numéro d'utilisateur suivi d'une barre oblique, (2) un identifiant d'unité de disque suivi de deux-points, (3) le nom de fichier, (4) un point suivi d'une extension. Seul le troisième champ est obligatoire. Si un numéro d'utilisateur n'est pas spécifié, le fichier est supposé être sur l'utilisateur actuel. Si l'unité de disque n'est pas spécifié, le fichier est supposé se trouver sur l'unité de disque par défaut. Par exemple, les noms de fichiers suivants sont valides :
Nom de fichier | Description |
---|---|
file.ext | file.ext est sur l'unité de disque par défaut, avec l'utilisateur actuel |
b:file.ext | file.ext est sur l'unité de disque b:, avec l'utilisateur actuel |
15/file.ext | file.ext est sur l'unité de disque par défaut, avec l'utilisateur 15 |
12/c:file.ext | file.ext est sur l'unité de disque c:, avec l'utilisateur 12 |
Un programme peut avoir des fichiers situés dans plusieurs zones utilisateur différentes ouvertes à la fois. Il existe plusieurs fonctions pouvant être utiles aux programmes ayant besoin d'accéder à des fichiers dans diverses zones utilisateur : getusr, renvoyant le numéro d'utilisateur actuel : setusr, définissant le numéro d'utilisateur actuel : et rstusr, réinitialisant le numéro d'utilisateur actuel.
Ouverture de fichiers sur TRSDOS et les systèmes associés
Lors de l'ouverture d'un fichier sur TRSDOS ou des systèmes associés, le nom de fichier a le format standard TRSDOS : c'est-à-dire (1) nom de fichier, (2) suivi d'une barre oblique et d'une extension, (3) suivi d'un point et d'un mot de passe, (4) suivi de deux points et d'un numéro de l'unité de disque. Seul le premier champ est obligatoire. Si un spécificateur d'unité de disque est fourni, le fichier sera recherché et créé si nécessaire sur cette unité de disque. Sinon, suivant la convention TRSDOS, une recherche du fichier sera effectuée sur tous les unités de disques, en commençant par l'unité de disque :0. Si le fichier est trouvé et doit être recréé, il sera recréé sur le même unité de disque.
Accès aux périphériques
Le langage de programmation Aztec C permet aux programmes d'accéder aux périphériques ainsi qu'aux fichiers. Chaque système a ses propres noms de périphériques, le tableau suivant répertorie donc les périphériques et, pour chaque système, son nom. Dans ce tableau, «CPM» fait référence à CP/M, CP/M-86 et aux systèmes associés : le PC DOS inclut également MS DOS; le TRSDOS inclut LDOS et DOSPLUS :
Périphérique | CP/M | PC DOS | Apple DOS | TRSDOS |
---|---|---|---|---|
Clavier | con: | con: | ki: | *ki |
Affichage | con: | con: | do: | *do |
Imprimante | prn: | prn | pr: | *pr |
Imprimante | 1st: | |||
Entrée RS232 | rdr: | *ri | ||
Sortie RS232 | pun: | *ro |
Sur le modèle 4 de TRSDOS, les périphériques créés dynamiquement sont également accessibles.
Mélange des appels d'entrée/sortie standard et sans tampon
Comme mentionné ci-dessus, un programme accède généralement à un fichier ou à un périphérique en utilisant des fonctions d'un ensemble de fonctions ou de l'autre, mais pas les deux. Cependant, il existe des fonctions facilitant ce double accès : si un fichier ou un périphérique est ouvert pour les entrées/sorties standard, la fonction fileno renvoie un descripteur de fichier pouvant être utilisé pour un accès sans tampon au fichier ou au périphérique. Si un fichier ou un périphérique est ouvert pour les entrées/sorties sans tampon, la fonction fdopen le prépare également pour les entrées/sorties standard. La prudence est de rigueur lors de l'accès aux périphériques et aux fichiers avec des fonctions d'entrée/sortie standard et sans tampon.