6 Fonctions d'entrées sorties

Nous avons déjà vu lors des sessions précédentes que si une instruction se termine par une virgule ou un retour à la ligne alors le résultat de son évaluation est affiché dans la fenêtre Scilab. L'affichage n'aura par contre pas lieu si l'instruction est terminée par un point virgule ou si l'instruction fait partie du corps d'une fonction.

Pour afficher explicitement la valeur d'une variable ou d'une expression on peut utiliser les fonctions disp ou print. Le premier argument de la fonction print permet de contrôler où se fera l'affichage. On peut indiquer un nom ou un descripteur de fichier (voir la commande file) ou bien utiliser %io(2) qui permet l'affichage dans la fenêtre Scilab :


\begin{sessioncmd}
\par -->a=%%pi \sleftarrow{\normalfont le résultat de l'affec...
...font On force l'affichage de \verb+a+}
a =
\par 3.1415927
\par\end{sessioncmd}

Il est possible de contrôler le format utilisé pour l'affichage des nombres par les fonctions disp et print au moyen de la fonction format. On notera aussi qu'il est possible de sauver les variables de l'environnement courant au moyen de la commande save. On recharge alors les variables dans l'environnement courant avec la commande load. Les commandes save et load utilisent un format binaire machine indépendant. Les sauvegardes se font donc sans pertes de précisions et sont portables.

Pour contrôler plus finement le formatage des entrées sorties plusieurs fonctions sont disponibles dans Scilab. Les fonctions write et read sont basées sur des formatages Fortran. Les descripteurs de fichiers acceptés par ses deux fonctions sont obtenus au moyen de la commande file. Les sorties et entrées dans la fenêtre Scilab étant obtenus par les descripteurs %io(2) et %io(1).

Nous ne nous étendrons pas plus sur ces fonctions et nous allons plutôt décrire ici les fonctions Scilab qui émulent les fonction d'entrées sorties que l'on utilise en C. Ces fonctions permettent l'écriture et la lecture formatée ou binaire sur des fichiers, sur les sorties et entrées standard de la fenêtre Scilab et sur des chaînes de caractères.


Tableau 4: Quelques fonctions d'entrées sorties
mprintf Écriture sur la sortie standard
mfprintf Écriture dans un fichier
msprintf Écriture dans une matrice de chaînes de caractères
mscanf Lecture sur l'entrée standard
mfscanf Lecture dans un fichier
msscanf Lecture dans une matrice de chaînes de caractères
fprintfMat Écriture formatée d'une matrice dans un fichier
fscanfMat Lecture formatée d'une matrice dans un fichier
mgetl lecture des lignes d'un fichier dans une matrice de chaînes
mgetl lecture des lignes d'un fichier dans une matrice de chaînes
mputl Écriture des lignes d'une matrice de chaînes dans un fichier
mopen ouverture d'un fichier
mclose fermeture d'un fichier


La fonction mopen interface la fonction C,fopen et sa syntaxe est la suivante :

[fd,err]=mopen(filename , mode, swap )
filename est une chaîne décrivant un nom de fichier. L'argument mode est une chaîne d'au plus trois caractères (dont la valeur par défaut est 'rb') qui permet de préciser si le fichier doit être ouvert en lecture ('r'), en écriture ('w'), en complétion ('a') ou en lecture/écriture ('r+'). L'ajout du caractère 'b' précise que le fichier est un fichier binaire.

Les fonctions d'écriture et de lecture formatées sont proches des fonctions de noms voisins présentes dans la librairie C. La spécification des formats par exemple suit la spécification des formats des fonctions C. L'aspect vectoriel qui est une caractéristique de Scilab est intégré aux fonctions de lecture écriture. Pour l' écriture, les formats sont utilisés sur les lignes des arguments vectoriels donnés et pour la lecture on peut préciser le nombre de fois où il faut utiliser le format (voire l'utiliser jusqu'à atteindre une fin de fichier). L'exemple suivant illustre cela :


\begin{sessioncmd}
\par -->mprintf('%%d',1:4) \sleftarrow{\normalfont le format ...
...r le format choisi }
ans =
\par 7.989D-07
\par -->mclose(fd);
\end{sessioncmd}

Nous donnons maintenant un autre exemple de lecture formatée avec des données de type chaîne de caractères et nombres mélangées. On cherche à lire au moyen de la fonction mfscanf le fichier mfscanf.dat dont le contenu est :


// un exemple avec lecture d' un fichier avec separateur de type '[ ]*,[ ]*' 
// -------------------------------------------------------------------------
Agen                          , 47000 , 56
Aigues Juntes                 , 09000 , 78
Aiguilhe                      , 43000 , 78
Ainac                         , 04000 , 56
Ajaccio                       , 20000 , 23
Ajoux                         , 07000 , 34
Albi                          , 81000 , 23
Alencon                       , 61000 , 12


\begin{sessioncmd}
\par -->fd=mopen('mfscanf.dat','r');
-->mgetl(fd,2); \sleftar...
...00. 34. !
! 81000. 23. !
! 61000. 12. !
\par -->mclose(fd);
\par\end{sessioncmd}

Pour permettre une écriture binaire qui soit machine indépendante les fonctions Scilab que nous verrons dans la suite écrivent les nombres dans les fichiers au format little endian. Ce mode par défaut peut-être supprimé au moyen du paramètre swap en lui donnant la valeur 0. Dans ce dernier cas les lectures écritures se font avec le mode natif de la machine utilisée.

La fonction mopen retourne un descripteur de fichier fd et éventuellement un indicateur d'erreur.

La fonction mclose permet de fermer un fichier qui a été précédemment ouvert par une commande mopen et de libérer ainsi le descripteur du fichier ouvert (Le nombre de fichiers que l'on eut ouvrir simultanément est limité). On notera qu'il est possible de fermer tous les fichiers ouverts avec l'instruction mclose(file()).

Les fonctions décrites dans la table 5 permettent la lecture écriture de données binaires. Les fonctions mget et mput utilisent le mode de lecture (petit ou grand ``endian'') qui est précisé lors de l'ouverture d'un fichier avec mopen. Mais il est toujours possible de forcer une lecture en petit ou grand ``endian'' en utilisant un paramètre adéquat.


Tableau 5: Quelques fonctions d'entrées sorties binaires
mget Lecture de données binaires
mput Écriture de données binaires
mgetstr Lecture d'une chaîne de caractères
mputstr Écriture d'une chaîne de caractères
mtell retourne la position courante dans un fichier
mseek déplace la position courante dans un fichier
meof test de fin de fichier


On pourra se reporter aux fonctions Scilab contenues dans le répertoire SCI/macros/sound où des fonctions de lecture écriture de fichier de sons constituent d'excellent exemples d'utilisation des fonctions de la table 5. Nous donnons simplement ici un exemple sommaire de lecture écriture d'une matrice dans un format binaire.


\begin{sessioncmd}
\par -->x=testmatrix('magic',4);
-->fd=mopen('save.dat','wb')...
... 13. !
! 5. 11. 10. 8. !
! 9. 7. 6. 12. !
! 4. 14. 15. 1. !
\par\end{sessioncmd}