Académique Documents
Professionnel Documents
Culture Documents
Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr
2
Entrées-sorties standard :
format libre
● En lecture :
READ *, var [, var_2, …, var_n]
➢ Diverses formes possibles suivant le type :
entiers 43 +25 -2
réels 1. 1e-2 -2.4E25
booléens .TRUE. T false
➢ En cas d'erreur (entrée au clavier d'un type incorrect ou
plus fort) : arrêt de l'exécution.
➢ Informations lues séparées par des espaces, des
virgules, ou placées dans des lignes différentes.
➢ Si après l'instruction READ *, i, j, k on entre au clavier
2, ,4 alors i et k vaudront 2 et 4, mais j restera inchangé.
3
Entrées-sorties standard :
format libre
● En écriture :
PRINT *, var [, var_2, …, var_n]
4
E/S dans les fichiers :
Accès séquentiel / direct
● Vocabulaire
➢ Enregistrement : bloc élémentaire de
données traité lors d'une opération de lecture
ou d'écriture
➢ Fichier : suite d'enregistrements
● Il existe deux types de fichiers qui se distinguent
par le mode d'accès
➢ accès séquentiel : accès aux enregistrements
l'un après l'autre, à partir du premier
➢ accès direct : accès direct à n'importe quel
enregistrement (comme dans un tableau)
En 2A005 et dans la suite, on utilisera
toujours l'accès séquentiel (le plus courant).
5
E/S dans les fichiers :
Forme non formatée / formatée
● Forme de l'information dans le fichier
➢ Forme non formatée : l'information est
stockée dans le fichier sous la même forme
qu'elle est stockée en mémoire
fichier binaire illisible en utilisant un
éditeur de texte (gedit par exemple).
➢ Forme formatée : l'information de la
mémoire est convertie et stockée sous forme
de caractères
fichier texte (ou ASCII) lisible par un
humain et éditable à l'aide de gedit.
Remarque
➢ Le format libre est une forme formatée.
6
E/S dans les fichiers :
Forme non formatée / formatée
Quand utiliser l'une ou l'autre de ces
formes ?
● Forme formatée (texte ou ASCII) :
➢ Pour les E/S standard (clavier et écran)
➢ Pour les fichiers avec de petites quantités de données
● Forme non formatée (binaire) :
➢ Pour les grandes quantités de données (typiquement
en mécanique les champs de vitesse, de température, de
déformation, ...)
- plus rapide à lire/écrire (pas de conversion en caractères)
- fichiers généralement plus compacts (ex. : -56301 est
représenté sur 4 octets contre 6 octets sous forme ASCII)
- données plus précises pour les réels (pas de perte de
précision lors de la conversion en chaîne de caractères)
➢ Mais parfois perte de compatibilité entre machines 7
(exemple : machine 32 bits machine 64 bits)
Lire/écrire
dans un fichier texte (1)
● 1ère étape : ouverture du fichier
➢ Sur le disque, le fichier est désigné par son
chemin et son nom (partie UNIX)
➢ Dans le programme F90, le fichier est désigné
par un numéro, le numéro d'unité logique
➢ « Ouvrir » un fichier, c'est attribuer
(temporairement) à un fichier du disque un
numéro d'unité logique
➢ OPEN (UNIT = num, FILE = nom_fichier)
Exemple : on veut lire/écrire dans un fichier
nommé donnees.dat dans le répertoire courant
OPEN (UNIT = 10, FILE = ''donnees.dat'')
8
Lire/écrire
dans un fichier texte (2)
● 2ème étape : lecture/écriture des données
➢ une fois l'ouverture effectuée, on utilise
uniquement le numéro d'unité logique
➢ l'instruction READ *, liste utilisée pour les E/S
standard devient pour les fichiers
READ (UNIT = num, FMT = format) liste
➢ l'instruction PRINT *, liste devient quant à elle
WRITE (UNIT = num, FMT = format) liste
(si num ou UNIT=num est remplacé par * ⇒ E/S standard). E/S standard).
Exemples
READ (UNIT = 10, FMT = *) n, tab
WRITE (UNIT = 10, FMT = '(100E12.4)') mat(i,:)
9
Lire/écrire
dans un fichier texte (3)
● 3ème étape : fermeture du fichier
➢ finalise l'écriture éventuelle sur le disque (utile
si le programme s’interrompt accidentellement
par la suite)
➢ libère le numéro d'unité logique, qui peut
ensuite être réutilisé, associé au même fichier
ou à un autre
➢ CLOSE (UNIT = num)
Exemples
CLOSE (UNIT = 10)
INTEGER :: num_u = 10
...
CLOSE (UNIT = num_u)
10
Lire/écrire
dans un fichier texte (4)
● Exemple : lecture de nombres dans un fichier
nombres.dat et écriture de leurs carrés dans un
fichier carres.dat
Problème : le programme ne sait pas combien il y a de
nombres à lire dans le fichier nombres.dat !
PROGRAM carres
IMPLICIT NONE
● Mot-clé
REAL :: r IOSTAT = ios
INTEGER :: ios
➢ en sortie, l'entier
OPEN (UNIT = 10, FILE = "nombres.dat") ios vaut 0 si l'E/S
OPEN (UNIT = 11, FILE = "carres.dat") s'est bien déroulée
DO
READ (UNIT = 10, FMT = *, IOSTAT = ios) r ➢ READ fin de fichier :
IF (ios /= 0) EXIT ios devient <0
WRITE (UNIT = 11, FMT = *) r**2
END DO
➢ Existe aussi pour
CLOSE (UNIT = 10) ; CLOSE (UNIT = 11) les autres fonctions
END PROGRAM carres d'E/S 11
OPEN : syntaxe (plus) générale
14
Les formats (2)
● Spécifier un format, c'est décider comment une
valeur doit être traduite en chaîne de caractères
Exemple : ici on veut 5 entiers (I) sur 4 caractères
DO i = 1, 5 ; PRINT ''(5I4)'', tab(i, :) ; END DO
donne
18
Programmation
pour le calcul scientifique
Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr
Cours 9b : Modularité
Structure d'un module
MODULE nom_module
[ USE nom_autre_module ]
Visibles dans ce module et
dans les unités utilisatrices
de ce module
IMPLICIT NONE
[ ! Définitions de types ]
[ ! Déclarations de constantes / (de
variables) ]
Il est conseillé de se limiter
à des déclarations de
[ CONTAINS constantes (PARAMETER),
et de déclarer les variables
! Procédures ] dans les procédures ou
dans le programme
END MODULE nom_module principal.
2
Module et fichiers
3
Exemple
Fichier unique
programme.f90
MODULE lecture ● Le module est
IMPLICIT NONE
placé AVANT le
CONTAINS
INTEGER FUNCTION lire_entier(maximum) programme
INTEGER, INTENT(IN) :: maximum principal
DO
READ *, lire_entier
IF (lire_entier <= maximum) EXIT ● La compilation
END DO se fait de la
END FUNCTION lire_entier manière
END MODULE lecture
habituelle
PROGRAM exemple_lecture g95 -o prog
USE lecture programme.f90
IMPLICIT NONE
INTEGER :: n
n = lire_entier(100); PRINT *, "n = ", n
4
END PROGRAM exemple_lecture
Exemple
Module dans un fichier séparé
lecture_entier.f90 main.f90
MODULE lecture
IMPLICIT NONE PROGRAM exemple_lecture
CONTAINS USE lecture
INTEGER FUNCTION lire_entier(maximum) IMPLICIT NONE
INTEGER, INTENT(IN) :: maximum INTEGER :: n
DO
READ *, lire_entier n = lire_entier(100);
IF (lire_entier <= maximum) EXIT PRINT *, "n = ", n
END DO END PROGRAM exemple_lecture
END FUNCTION lire_entier
END MODULE lecture
5
Compilation séparée