Vous êtes sur la page 1sur 29

Laboratoire de Physique des

Matériaux et des Composants à


Semi-conducteurs
Faculté des Sciences (LPMCS)
Département de Physique

Langages de calcul scientifique - Programmation Fortran


Léçon N° 3 Les entrées sorties, fichiers

Dr Komi SODOGA
antoinekomisodoga@gmail.com, UL
1er mars 2024

1 / 29
Plan

1 I- Introduction
Syntaxe générale
Entrées-sorties standards

2 II- Les formats

3 III- Les fichiers


III-1. Introduction
III.2- Ouverture d’un fichier
III.3- Lecture /écriture
Le module intrinsèque ISO− FORTRAN− FENV

2 / 29
I- Introduction

I- Introduction
De quoi s’agit-il ?
Les ordres d’entrée/sortie permettent de transférer des informations entre la mémoire
centrale et les unités périphériques (terminal, clavier, disque, imprimante, . . .)
Les opérations d’entrée/sortie engendrent des conversions caractères alpha-
numériques/binaires

3 / 29
I- Introduction Syntaxe générale

I- Introduction

Syntaxe générale

Lecture
read(périphérique, format [,options]) liste

read format, liste

Écriture
write(périphérique, format [,options]) liste

print format, liste

Remarques :
o les deuxièmes formes de syntaxe correspondent à l’entrée et la sortie dites
standard, c’est-à-dire l’écran !
o <options> reprend l’ensemble des arguments qui permettent une gestion des
erreurs, un contrôle du changement de ligne, . . .
4 / 29
I- Introduction Entrées-sorties standards

Entrées-sorties standards

Écriture en format libre


print *, ‘Energie totale = ‘, Etot, ‘ eV’
write(*,*) ‘Energie totale = ‘, Etot, ‘ eV’
Le * associé au format indique à l’instruction d’écriture de formater automatiquement les
données.
Le * associé au périphérique (write) correspond à la sortie standard.

Lecture en format libre


read *, title, nb, x
read(*,*) title, nb, x
Le * signifie que la conversion des données vers leur représentation machine doit se faire
automatiquement.
Les données d’entrée doivent être séparées
o par des espaces
o ou des virgules
o ou des fins de ligne (à éviter)
Les chaı̂nes de caractères se notent entre apostrophes (’) ou entre guillemets (”)

5 / 29
I- Introduction Entrées-sorties standards

Saisie de données au clavier


Au lieu de répéter <n> fois une même valeur <val>, utiliser la notation <n>*<val>.
Tant que la liste des variables n’est pas pas épuisée, la lecture des données peut se poursuivre
sur plusieurs lignes.
Mais on peut arrêter la lecture de l’enregistrement avant d’avoir épuisé la liste par la saisie
du caractère / de fin d’enregistrement.
Il est aussi possible de sauter une variable au sein de la liste en saisissant deux virgules
successivement. Exemple :

6 / 29
II- Les formats

II- Les formats

Motivations
Le format libre est utilisé pour les échanges avec le terminal, en phase de test ou pour accéder
à des fichiers manipulés toujours sur la même machine.
Mais, pour des échanges de données plus massifs avec des fichiers ou de données dont le
format peut être imposé par des applications externes, il est souvent nécessaire de préciser
les règles de conversion en entrée ou en sortie grâce à une spécification de format.
L’utilisation des formats permet :
o Lecture : s’adapter à des données existantes non adaptées à un format libre
o Écriture : présenter des résultats comme l’on souhaite !
Le format se présente comme une liste de descripteurs : Exemple (i3,f5.3)
Deux manières de donner le format d’entrée/sortie :
o dans une instruction, dotée d’une étiquette
write(*,1000) liste
. . .
1000 format <liste_descripteur>
o dans l’instruction d’entrée/sortie elle-même
write(*,’<liste_descripteur>’) liste
7 / 29
II- Les formats

Descripteur des entiers Iw


w : nombre de caractères
Lecture :
o w caractères sont lus, y compris le signe éventuel et des espaces (interprétés
comme zéro) devant : Exemple read(*,’(i3,i4)’) n,p
au clavier n p
⊔42 , ⊔ ⊔ 23 −→ 42 23
⊔12 , 4547 −→ 12 4547
⊔ − 3 , ⊔ ⊔ −456 −→ -3 -4
Exemple 1 à reproduire
Écriture :
write(*,’(i3,i4)’) n,p n p affichage
o Impression de la valeur entière 5 23 −→ ⊔ ⊔ 5 ⊔ ⊔23
justifiée à droite dans les w ca-
ractères, avec le signe éventuel et -122 45 −→ ∗ ∗ ∗ ⊔ ⊔45
des blancs pour compléter.
-23 4521 −→ −234521
Exemple 2 à reproduire

8 / 29
II- Les formats

Descripteur des réels (sans exposant)


Syntaxe : fw.d
Valeur
w : nombre de caractères interprétée Format Ecriture
(chiffres, point décimal, 4.86 f4.1 ⊔4.9
signe, blancs)
d : nombre de chiffre -5.23 f5.2 -5.23
décimaux
4.25 f10.2 ⊔ ⊔ ⊔ ⊔ ⊔ ⊔ 4.25
Exemple 3 à reproduire

Descripteur des réels (avec exposant)


Syntaxe :Ew .d
w : nombre de caractères (chiffres, point décimal, signe, exposant, blancs)
d : nombre de chiffre décimaux ( Attention : w ≥ d + 6)
Remarques : Valeur
o Gw .d =⇒ choix automatique interprétée Format Ecriture
entre Fw .d et Ew .d 0.0123456 e13.6 ⊔0.123456E − 01
o Exposant à plus de deux
chiffres : Ew .dEe avec e nombre -47.678 e12.4 ⊔ − 0.4768E + 02
de chiffres de l’exposant
4.25 e12.3 ⊔ ⊔ ⊔ ⊔ 0.425E 01
Exemple 4 à reproduire
9 / 29
II- Les formats

Descripteur des logiques


Syntaxe : Lw
w − 1 blancs suivis de la lettre T pour Test
une valeur .true. ou F pour une valeur .True. −→ ⊔⊔⊔⊔T
.false.
write(*,’(l5)’) test .False. −→ ⊔⊔⊔⊔F
Exemple 5 à reproduire

Descripteur pour chaı̂ne de caractères


Syntaxe : : Aw Chaı̂ne Format Ecriture
Si w > long. de chaı̂ne : blancs ajoutés ’Charles’ a Charles

Si w < longueur de chaı̂ne : seuls les w ’Christ’ a7 ⊔Christ


premiers caractères sont écrits
Exemple 5 suite à reproduire ’Yvette’ a4 no
Si w est absent : la longueur de chaı̂ne fixe la longueur du
champ de sortie
Chaı̂ne de char. dans le format : reprod. telle quelle
Résultat
integer :: i=9
write(*,’(‘valeur de i=’, i2)’) i Valeur de i= 9

10 / 29
II- Les formats

II- Les formats

Descripteurs de mise en page


Introduction des espaces : nX
o ignore (lecture) ou saute (écriture) les n caractères qui suivent :
Exemple x = 2.5 et y = 8.25
write(*,’(f6.2,3x,f5.3)’) x,y
donne comme résultat ⊔ ⊔ 2.50 ⊔ ⊔ ⊔ 8.250

Positionnement dans le tampon : Tc


o permet de se positionner au caractère de rang c :
Exemple si n = 5 et p = 23, alors :
write(*,’(t10,’n=’,i4,t20,’p=’, i3)’) n,p
donne comme résultat
⊔ ⊔ ⊔ ⊔ ⊔ ⊔ ⊔ ⊔ ⊔ ⊔ n = ⊔ ⊔ ⊔5 ⊔ ⊔ ⊔ ⊔p = ⊔23

11 / 29
II- Les formats

Les formats : Remarques


Erreurs de descripteurs
• Erreur non détectée par le compilateur
(Ex : valeur entière décrite par le descripteur F)
Écriture sans retour à la ligne :
write(*,’(i4,i5,$)’) n,p
write(*,’(i4,i5)’ , advance= ’ no ’) n,p
Descripteur de changement de ligne :
write(*,’(i4,/,i5)’) n,p
Répétition d’un descripteur : Si x = 132 et y = 456, alors
write(*,’(2i4)’) n,p
donne comme résultat ⊔132 ⊔ 456
Exemple à reproduire

12 / 29
III- Les fichiers III-1. Introduction

III- Les fichiers

Outre les entrées–sorties standard qui s’opèrent via le terminal, fortran peut contrôler des
flux de données en lecture ou en écriture associés à des fichiers externes (external files),
hébergés par des périphériques (disques, CD, clef USB, ...).
Ces fichiers externes doivent être connectés à des unités logiques (logical unit) à l’aide de
l’instruction OPEN. L’instruction CLOSE permet de fermer le fichier et donc de libérer l’unité
logique préalablement connectée.
Une unité logique choisie par l’utilisateur est désignée par un entier posi- tif ou nul,
généralement entre 1 et 100, en évitant 0, 5 et 6, habituellement dédiées aux unités standard.
Quelques caractéristiques des fichiers :
• Stockage des données (enregistrements) sur le disque
• Généralement, on donne une extension .dat, .txt, .out,. . .
• Fichier est dit
o Formaté si les données sont stockées sous forme de caractères
alphanumériques
o Non formaté si les données sont stockées sous forme binaire
• Accessibilité :
o Séquentiel : lecture de tous les enregistrements précédents
o Direct : Ordre de lecture/écriture indique l’enregistrement à traiter
13 / 29
III- Les fichiers III.2- Ouverture d’un fichier

III- Les fichiers

Ouverture et création d’un fichier (1)


Exploiter un fichier au sein d’un programme nécessite son ouverture.

En Fortran, on utilise l’instruction open.

open(10,file=’result.dat’) !Forme compacte


open(10,file=’result.dat’,status=’old’) !Forme avec option
L’instruction open permet :
o de connecter le nom de fichier à un numéro d’unité logique (numéro repris par
la suite pour toute opération de lecture/écriture)
o de spécifier le mode désiré : lecture, écriture ou les deux
o d’indiquer le mode de transfert (avec ou sans formatage)
o d’indiquer le mode d’accès (séquentiel ou direct)
o de gérer les erreurs d’ouverture

14 / 29
III- Les fichiers III.2- Ouverture d’un fichier

III- Les fichiers

Les fichiers : ouverture et création d’un fichier (2)


Syntaxe complète :
open([unit=]<num unite> [,file=<nom_fichier>] [,status=<état>] &
[,access=<accès>] [,iostat=<result>] [,err=étiquette] &
[,form=<format>] [,action=<action>] [,position=<pos>] &
[,recl=<long_enreg>])

num unite : numéro d’unité logique (constante ou variable entière) qui désigne le fichier
dans la suite du programme

nom fichier : chaı̂ne ou variable de type CHARACTER spécifiant le nom du fichier

Status ou état : UNKNOWN (défaut), OLD, NEW, SCRATCH ou REPLACE

accès : SEQUENTIAL (défaut) ou DIRECT

result : variable entière qui contiendra le code erreur éventuel (valeur nulle si aucune erreur)

15 / 29
III- Les fichiers III.2- Ouverture d’un fichier

III- Les fichiers

Les fichiers : ouverture et création d’un fichier (3)


open([unit=]<num unite> [,file=<nom_fichier>] [,status=<état>] &
[,access=<accès>] [,iostat=<result>] [,err=étiquette] &
[,form=<format>] [,action=<action>] [,position=<pos>] &
[,recl=<long_enreg>])

étiquette :étiquette de renvoie à l’instruction à exécuter en cas d’erreur

format : FORMATTED (défaut) ou UNFORMATTED spécifiant le mode d’écriture, ca-


ractères ASCII ou binaire.

action : READWRITE (défaut), READ ou WRITE

position (uniquement pour fichier séquentiel) : ASIS (défaut – pas de modification de position
si fichier déjà connecté, REWIND (début de fichier), APPEND (fin de fichier)

long enreg (obligatoire si accès direct) : constante entière donnant la longueur en bytes de
l’enregistrement

16 / 29
III- Les fichiers III.3- Lecture /écriture

Lecture
Syntaxe de base :
read([unit=]<num_unite>, [fmt=]<liste_descripteurs>) <liste>
Exemple :
read(10,‘(2g15.6)’) x,y
read(10,*) x,y
read(numfich,fmt=*) x,y,chaine
read(unit=20,fmt=‘(a)’) chaine
Gestion des erreurs :
• Le paramètre iostat
• Les paramètres end,err,eor
read(10,‘(2g15.6)’,iostat=ierr) x,y
read(10,‘(2g15.6)’,end=999,eor=888) x,y
o ierr est nul : aucune er-
Paramètre Evènement
reur end fin de fichier
o ierr = entier < 0 : er-
reur de fin de fichier ou err erreur (autre que fin de
fin d’enregistrement fichier ou enregistrement)
o ierr = entier > 0 : toute
autre erreur (enregistre- eor fin d’enregistrement
ment insuffisant, fichier
devenu inaccessible,etc )
17 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Ecriture
Syntaxe de base
write([unit=]<num_unite>, [fmt=]<liste_descripteurs>) <liste>
Par exemple :
write(10,‘(2g15.6)’) x,y
write(10,*) x,y
write(numfich,fmt=*) x,y,chaine
write(unit=20,fmt=‘(a)’) chaine
Gestion des erreurs avec les paramètres iostat et err (voir lecture)

Les opérations de positionnement


Remonter au début du fichier :
rewind([unit=]<num_unite> [,iostat=<result>] [,err=étiquette])
Remonter d’un enregistrement dans le fichier :
backspace([unit=]<num_unite> [,iostat=<result>] [,err=étiquette])
18 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

lecture/écriture non formatée


open(10,file=‘result.dat’,form=‘unformatted’)
. . .
write(10,*) x,y
. . .
read(10,*) x,y
. . .
Utilisation des lectures/écritures non formatées pour des fichiers destinés à être
relus par l’ordinateur.
Avantages :
• Gain de place sur le disque
• Gain de temps (pas besoin de conversion binaire ⇐⇒ alphanumérique)
• Maintien de la précision des variables numériques (sauf troncature)
Désavantage :
• Lecture/écriture sur un même type de machine

19 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Lecture/écriture en accès direct


Dès l’ouverture du fichier, on spécifie la longueur en octets de chaque
enregistrement (par exemple, 4 pour un réel simple précision ou longueur de la
chaı̂ne) avec l’argument recl.
open(10,file=‘result.dat’,access=‘direct’,recl=4)
Les read et write peuvent accéder à chaque enregistrement directement avec
l’argument rec qui spécifie le numéro de l’enregistrement
write(10,rec=n) x
...
read(10,rec=n) x
Tous les enregistrements doivent être de même taille !

20 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Namelist
On peut regrouper les variables que l’on désire lire ou écrire au sein d’une liste
à laquelle on donne un nom.

Ce regroupement s’effectue au moyen de l’instruction NAMELIST

Syntaxe NAMELIST/nom_liste/liste_variables
o nom liste est le nom de la NAMELIST
o liste variables est une liste de variables précédemment déclarées
Au niveau de l’instruction READ/WRITE la namelist remplace le format ainsi
que la liste de variables qui, dans ce contexte, devient inutile.
Syntaxe : READ(Unite, nom_liste) ou READ(Unite, nom_liste)

Dans l’instruction READ/WRITE, la namelist est indiquée à l’aide du pa-


ramètre NML= (à la place de FMT=).
L’utilisation des NAMELIST est un moyen très com- mode d’effectuer des
entrées-sorties sans avoir à définir de format
21 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Namelist
Exemple 1
INTEGER :: i, j, k
INTEGER :: t(3)
CHARACTER(len=11) :: ch

NAMELIST/LISTE/i,j,k,t,ch
...
READ (UNIT=1, NML=liste )
WRITE(UNIT=2, NML=liste )
Exemple 2
integer :: n
real,dimension(2) :: x
character(len=5) :: text

namelist /TRUC/ n,x,text


...........
read(*, nml=TRUC)
x=x+n*2
open(unit=10,file = "apostrophe")
write(10, nml=TRUC) 22 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Fermeture
L’instruction CLOSE permet de déconnecter une unité logique d’un fichier.
Elle libère l’unité logique pour une nouvelle connexion

Syntaxe
CLOSE ([UNIT=]<entier >, ERR=<étiquette >,&
IOSTAT=<iostat >, STATUS=<stat >)

Les arguments de CLOSE sont tous optionnels sauf l’unité logique et ont la
même signification que dans l’instruction OPEN, sauf STATUS qui désigne ici
le devenir du fichier après déconnexion et peut valoir :
o ’KEEP’ (par défaut) pour conserver un fichier préexistant ;
o ’DELETE’ pour détruire le fichier à la déconnexion.

23 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

L’instruction INQUIRE
L’instruction INQUIRE permet de s’enquérir de nombreux paramètres caractérisant
un flux d’entrée–sortie, notamment :
o si une unité logique est libre OPENED,
o si un fichier existe EXIST,
o quelle est la taille d’un enregistrement binaire IOLENTGH,
Elle permet aussi de restituer les paramètres avec lesquels s’est effectuée une ou-
verture de fichier : ACCESS, ACTION, DIRECT, FORM, FORMATTED, READ,
READWRITE, STREAM, SEQUENTIAL, UNFORMATTED, WRITE ; ces mots-clefs
désignent des variables de sortie de type entier ou chaı̂ne de caractère (’YES’ ou ’NO’)
Le flux interrogé peut être défini :
o soit par un nom de fichier (seule solution si le fichier n’a pas été ouvert) ;
o soit par une unité logique ;
o soit par une liste de sortie.

24 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

L’instruction INQUIRE
Par exemple, avant de connecter un fichier à une unité logique via l’instruction OPEN,
on peut rechercher un numéro d’unité logique disponible et s’assurer que le fichier
existe
LOGICAL :: pris, present
INTEGER :: n = 1, nmax = 99

DO n = 1, nmax
INQUIRE(UNIT=n, OPENED=pris)
IF (.not. pris) EXIT
END DO

INQUIRE(FILE=’fichier’, EXIST=present)
IF(present) THEN
OPEN(UNIT=n, FILE=’fichier’, ...)
...
ELSE
...
END IF 25 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

L’instruction INQUIRE
D’autre part, l’instruction INQUIRE permet d’évaluer la taille de l’enregistrement que
créerait l’écriture non-formatée d’une liste.

Elle permet ainsi de connaı̂tre la longueur d’un enregistrement d’un fichier non-
formaté en accès direct avant de le connecter à une unité logique, de façon à rendre
l’instruction d’ouverture du fichier indépendante de la machine.

Exemple
INTEGER :: long, iunit
INQUIRE(IOLENGTH=long) <liste d’expressions>
...
OPEN(iunit, FILE = ..., ACCESS=’direct’, FORM=’unformatted’, &
RECL=long)

26 / 29
III- Les fichiers III.3- Lecture /écriture

III- Les fichiers

Instructions de positionnement dans les fichiers


Il existe des instructions permettant, sans effectuer de transfert de données, de
modifier la position courante dans un fichier d’accès séquentiel :

REWIND([UNIT=]<entier > [, ERR=<étiquette >]&


[, IOSTAT=<iostat >]) positionne en début de fichier ;

BACKSPACE([UNIT=]<entier > [, ERR=<étiquette >]&


[, IOSTAT=<iostat >]) positionne avant l’enregistrement courant si
on est dans un enregistrement ou avant le précédent enregistrement si on
est entre deux enregistrements (cette instruction permet la relecture d’un
enregistrement) ;

ENDFILE([UNIT=]<entier > [, ERR=<étiquette >] &


[, IOSTAT=<iostat>]) écrit une marque de fin de fichier à la posi-
tion courante et positionne juste après cette marque de fin de fichier

27 / 29
III- Les fichiers Le module intrinsèque ISO− FORTRAN− FENV

III- Les fichiers

Le module intrinsèque ISO− FORTRAN− FENV


A partir de fortran 2003, il existe un module intrinsèque ISO_FORTRAN_ENV qui définit des
constantes nommées permettant de désigner de façon portable des paramètres concernant
les entrées sorties
Les numéros des unités logiques préconnectées aux flux standard :
o INPUT_UNIT, qui désigne l’entrée standard ( permettant des redirections
d’entrée via < fichier) ;
o OUTPUT_UNIT, qui désigne la sortie standard (permettant des redirections de
sortie via > fichier) ;
o ERROR_UNIT, qui désigne la sortie d’erreur standard (permettant des
redirections d’erreur standard via > fichier).
Sous unix, ces numéros valent en général 5, 6 et 0 respectivement.
Si les unités d’entrée et de sortie standard peuvent être désignées par * de façon plus rapide
que INPUT_UNIT et OUTPUT_UNIT, l’utilisation de ERROR_UNIT est nécessaire pour désigner
la sortie d’erreur de façon indépendante du compilateur.

28 / 29
III- Les fichiers Le module intrinsèque ISO− FORTRAN− FENV

III- Les fichiers

Le module intrinsèque ISO− FORTRAN− FENV


Exemple de programme avec ISO_FORTRAN_ENV
PROGRAM unites_standard ! emploi du module ISO_FORTRAN_ENV (fortran 2003)
USE,INTRINSIC :: ISO_FORTRAN_ENV, ONLY: error_unit, input_unit, output_unit
IMPLICIT NONE
INTEGER :: i
WRITE(*,*) "entrer un entier"
! lecture sur l’entrée standard: redirection par < fichier
READ(input_unit, *) i
WRITE(*,*) "i vaut ", i
! écriture sur la sortie standard: redirection par > fichier
WRITE(output_unit,*) "message sur la sortie standard"
! écriture sur la sortie standard d’erreur : redirection par > fichier
WRITE(error_unit,*) "message d’erreur"
END PROGRAM unites_standard

FILE_STORAGE_UNIT qui désigne l’unité de mesure en bits (en général 8) des tailles d’enre-
gistrement (RECL !) dans les opérations OPEN !et INQUIRE !.
Les entiers suivants rendus par IOSTAT= ! dans les cas d’échec d’opérations d’entrées/sorties
pour OPEN !) :
o IOSTAT_END qui désigne la fin de fichier ;
o IOSTAT_EOR qui désigne la fin d’enregistrement (End Of Record) ;
29 / 29

Vous aimerez peut-être aussi