La lecture et l’écriture de données dans des fichiers est une étape indispensable d’un programme, tant pour charger des données que pour sauver des résultats. Un format de fichier répandu est le fichier texte (ou ascii), qui est fréquemment utilisé pour stocker des données de toutes sortes. Nous allons apprendre à créer un tel fichier, ainsi qu’à en extraire les données.

 

Ouverture et fermeture du fichier

La fonction fopen permet l’ouverture du fichier.

ID_fichier = fopen(monFichier, permission):

Cette commande ouvre le fichier monFichier avec la permission d’accès spécifiée dans la variable permission. ID_fichier vaut -1 si MATLAB n’arrive pas à lire le fichier.

 

Les permissions

Les permissions sont les suivantes :

Caractère Description
‘r’ Ouvre le fichier en lecture seule (défaut).
‘w’ Ouvre le fichier en écriture, ou en crée un nouveau ; l’ancien contenu est écrasé.
‘wt’ Ouvre le fichier en écriture de texte. Recommandé pour Windows !
‘a’ Ouvre le fichier en écriture, ou en crée un nouveau ; le nouveau contenu est ajouté à la fin du fichier.
‘r+’ Ouvre le fichier pour lire et écrire.
‘w+’ Ouvre le fichier en lecture et écriture, ou en crée un nouveau ; l’ancien contenu est écrasé.
‘a+’ Ouvre le fichier en lecture et écriture, ou en crée un nouveau ; le nouveau contenu est ajouté à la fin du fichier.

 

Exemple:

Dans cette exemple, nous allons ouvrir le fichier mon_fichier.txt en lecture seule.

ID_fichier = fopen('mon_fichier.txt', 'r');
if ID_fichier == -1
  return;
end

....

fclose(ID_fichier);

 

Dès lors que cette fonction est utilisée, il faudra obligatoirement fermer le fichier une fois les opérations effectuées dessus terminées, et ceci avec la fonction fclose :

fclose(ID_fichier);

 

Il se peut que suite à une erreur, on perde cet identifiant et que l’on ne puisse plus faire cette opération. Dans ce cas, on exécutera la ligne :

fclose('all');

 

Ecriture dans un fichier

L’écriture dans les fichiers se fait avec la fonction fprintf. Les paramètres sont: l’identifiant du fichier, le format, puis les données.

fprintf(ID_fichier, formatSpec, var_donnees)

L’argument formatSpec est un texte contenant des caractères et des spécifications de conversion des données. Les spécifications de conversion contrôlent la notation, l’alignement, le nombre de chiffres significatifs, la largeur du champ, ainsi que d’autres aspects d’affichage. Les spécifications de conversion commencent avec le caractère % et contiennent les éléments suivants:

 

  • Flags (optionnel) : ils contrôlent l’alignement de la valeur à écrire
Caractère Description Exemple
Signe moins (-) L’élément est justifié à gauche %-3.4d
Signe plus (+) Affiche toujours le signe (+/-) %+3.4d
Espace Insère un espace devant la valeur % 3.4d
Zéro (0) Met des 0 au lieu des espaces %03.4d

 

  • Longueur et précision (optionnel) : contrôlent la longueur de l’élément à imprimer et sa précision
Caractère Description Exemple
Longueur Le nombre minimum d’éléments à imprimer %5f
Précision Un nombre à virgule (.) spécifiant le nombre de chiffres à imprimer à droite du point. %5.3f

 

  • Caractère de conversion (obligatoire) : spécifie la notation du nombre.
Caractère Description
%c Caractère simple
%d Notation décimale (signée)
%e Notation exponentielle
%E Notation exponentielle avec « E » majuscule
%f Notation à point fixe
%g Le plus compact de  %e et %f
%G Même que %g, mais avec un « E » majuscule
%i Notation décimale (signée)
%o Notation octale (non signée)
%s Chaîne de caractères
%u Notation décimale (non signée)
%x Notation hexadécimale (lettres minuscules a-f)
%y Notation hexadécimale (lettres majuscules A-F)

 

  • Caractères de mise-en-page (optionnels)
Caractère Description
\b Efface le dernier caractère
\f Saut de page
\n Nouvelle ligne
\r Retour à la ligne
\t Tabulation
\\ Backslash
\’ ‘ ou ‘ ‘ Simple apostrophe
%% Pourcent

 

Exemple :

L’exemple ci-dessous crée un fichier log.txt contenant une table des logarithmes :

x = 1:.1:100;
y = [x; log(x)];
fid = fopen('log.txt', 'wt');
fprintf(fid, '%6.2f %12.8f\n', y);
fclose(fid);

 

Le fichier log.txt contient alors :

  1.00   0.00000000
  1.10   0.09531018
  1.20   0.18232156
  1.30   0.26236426
  …
 99.90   4.60416969
100.00   4.60517019

 

Lecture d’un fichier

La lecture d’un fichier peut se faire avec plusieurs fonctions. Le choix de la fonction à utiliser dépend du type de données contenues dans le fichier ou de l’utilisation qu’on souhaite faire des données.

 

fscanf : lecture sous forme formatée

La fonction fscanf est l’équivalent de la fonction fprintf pour la lecture des fichiers.

A = fscanf(ID_fichier, formatSpec)

La fonction lit tout le fichier et converti les données au format spécifié, puis les retourne à la matrice A.

 

[A, count] = fscanf(ID_fichier, formatSpec, size)

Avec le paramètre « size » en plus, la fonction lit le nombre de données spécifiées par celui ci.

Les options pour « size » sont les suivantes :

  • n : Lit au plus n nombres, caractères ou chaînes de caractères.
  • inf : Lit jusqu’au bout du fichier
  • [m,n] : Lit au plus m*n nombres, caractères ou chaînes de caractères. Rempli une matrice d’au plus m lignes, colonne après colonne. n peut être « inf », mais pas m.

Le format est précisé afin que MATLAB recherche les valeurs dans le fichier qui correspondent au format désiré. Si le format correspond, la valeur est conservée dans la matrice de sortie. Les spécifications de conversion correspondent en gros à celles utilisées pour l’écriture des fichiers.

 

  • Flags (optionnels)
Caractère Description Exemple
* Ignore la valeur %*e
(nombre) Longueur maximale du champ %12d
(lettre) Taille de l’objet recevant la valeur. h pour short ou l pour long %hd
%lg

 

  • Caractère de conversion (obligatoire) : spécifie la notation du nombre.
Caractère Description
%c Séquence de caractère
%d Entier (base 10)
%e   %f    %g Notation à virgule flottante
%i Base 10, 8 ou 16 en fonction des données
%o Notation octale (signée)
%s Chaîne de caractères sans espace
%u Notation décimale (non signée)
%x Entier hexadécimale (signé)
[…] Séquence de caractères

 

Exemple :

En reprenant le fichier log.txt:

  1.00   0.00000000
  1.10   0.09531018
  1.20   0.18232156
  1.30   0.26236426
  …
 99.90   4.60416969
100.00   4.60517019

 

Sa lecture est effectuée ainsi :

ID_fichier = fopen('log.txt', 'r');
a = fscanf(ID_fichier, '%g %g', [2 inf]); % sur 2 lignes
a = a'; % transposition en colonnes
fclose(ID_fichier)

 

textread : lecture avec de multiples variables de sortie

La différence de textread par rapport à fscanf est la capacité de celui-ci à extraire de multiples variables en une commande. La fonction est effectuée jusqu’à ce que le fichier soit entièrement lu. textread est utile pour lire des fichiers textes avec un format connu. Il converti des groupes de caractères dans le format désiré. Chaque élément dans le fichier est défini comme une chaîne de caractères sans espace, qui s’étend jusqu’au prochain espace ou caractère de délimitation. Le nombre d’éléments lus est le nombre d’éléments dans le paramètre format.

[A,B,C,…] = textread(‘filename’, ‘format’)

 

Pour contrôler le nombre d’éléments lus, un paramètre supplémentaire, spécifiant le nombre d’extractions, peut être ajouté.

[A,B,C,…] = textread(‘filename’, ‘format’, N)

 

Comme auparavant, les spécifications de conversion sont les suivantes:

Format Description Sortie
literal Ignore le texte correspondant Aucune
%d Entier (signé) Double array
%u Entier Double array
%f Nombre à virgule flottante Double array
%s Chaîne de caractères séparée par un espace ou un délimiteur Cell array
%q Chaîne de caractères entre crochets (ignore les crochets) Cell array
%c Caractères, y compris les espaces Char array
%[…] Lit la plus longue chaîne de caractères contenant les caractères spécifiés dans les crochets Cell array
%[^…] Lit la plus longue chaîne de caractères non vide contenant des caractères qui ne sont pas spécifiés dans les crochets Cell array
%*… Ignore le caractère correspondant Aucune

 

Exemple :

Fichier Contact.DAT, première ligne :

Sally Level1 12.34 45 Yes

 

Lecture de la première ligne du fichier « contact.dat » en format libre :

[noms, types, x, y, reponse] = textread('Contact.DAT', '%s %s %f %d %s', 1)

noms =
'Sally'

types =
'Level1'

x =
12.3400

y =
45

reponse =
'Oui'

 

Lecture de la première ligne du fichier « Contact.DAT » en format fixe et en ignorant le nombre à virgule flottante :

[noms, types, y, reponse] = textread('Contact.DAT', '%9c %5s %*f %5d %3s', 1)

noms =
Sally Lev

types =
'el1'

y =
45

reponse =
'Oui'

 

Lecture de la première ligne du fichier « Contact.DAT » en utilisant la correspondance littérale :

[names, typenum, x, y, answer] = textread('Contact.DAT', '%s Level%d %f %d %s', 1)

names =
'Sally'

typenum =
1

x =
12.3400

y =
45

answer =
'Oui'

 

textscan : lecture avec sortie en tableau de cells

La spécificité de cette fonction est de mettre tout le contenu du fichier dans un seul tableau de cells, et de pouvoir lire le fichier depuis un certain point autre que le début. textscan permet de faire une lecture sous forme formatée, avec de nombreuses options telles que ‘HeaderLines’ permettant de sauter des lignes d’entête, ‘Delimiter’ spécifiant le séparateur entre les différentes données… Lorsque la lecture devient fastidieuse, c’est souvent la fonction à utiliser.

T = textscan(ID_fichier, '%5.2f %10.4f', 'HeaderLines', 1)

 

Lecture d’une ligne:

fgetl, fgets : lecture d’une ligne en gardant ou non le caractère de fin de ligne

ligne = fgetl(ID_fichier); % caractère(s) de fin de ligne non gardé(s) 
ligne = fgets(ID_fichier); % caractère(s) de fin de ligne gardé(s)

 

Se déplacer dans le fichier :

 

ftell : obtenir la position actuelle

position = ftell(ID_fichier);

 

fseek : se positionner par rapport au début, à la fin ou la position actuelle du fichier

fseek(ID_fichier, offset, origine);

 

frewind : revenir au début du fichier

frewind(ID_fichier);

 

feof : vérifier si la fin du fichier est atteinte

fin_atteinte = feof(ID_fichier);

 

Si une erreur s’est produite lors de la lecture ou de l’écriture, la fonction ferror servira à récupérer le message d’erreur et son numéro :

[message, errnum] = ferror(ID_fichier);

 

Remarque:

Suivant le système d’exploitation dans lequel a été/sera écrit le fichier, on pourra trouver les caractères de fin de ligne suivants :

  • Windows : \r\n soit [13 10] ;
  • Unix/Linux ou Mac OS X (et +) : \n soit 10 ;
  • Mac (jusqu’à la version 9) : \r soit 13 ;