FAQ Fortran
FAQ FortranConsultez toutes les FAQ
Nombre d'auteurs : 1, nombre de questions : 70, dernière mise à jour : 23 juillet 2021
- Comment est écrit le contenu d'un fichier ?
- Comment lire ou écrire dans un fichier ?
- Comment Fortran accède-t-il au contenu d'un fichier ?
- Comment ouvrir un fichier ?
- Comment fermer un fichier ?
- Comment protéger un fichier en écriture ?
- Comment tester l'existance d'un fichier ?
- Comment écrire directement à la fin d'un fichier ?
- Comment repérer la fin d'un fichier ?
Il existe deux types de fichiers : les fichiers ASCII et les fichiers binaires. Les fichiers ASCII sont des fichiers dans lesquels ce qui est écrit est formaté et lisible par quelqu'un, par exemple un fichier texte. Comme leurs noms l'indique les fichiers binaires sont écrits en langage binaire et ne sont pas directement lisible par quelqu'un. Il doit se servir d'un programme pour les lire et formater ce qu'ils contiennent.
En Fortran, on peut créer soit des fichiers formatés (ASCII) soit des fichiers binaires et lire ou écrire sur ces deux types de fichiers. Pour cela on spécifie lors de l'ouverture du fichier de quel type il est avec l'option form.
! ouverture d'un fichier binaire
open
(11, file="fichier_binaire"
, form="unformatted"
)
! ouverture d'un fichier ASCII
open
(11, file="fichier_ASCII"
, form="formatted"
)
Par défaut, si l'on ne précise pas l'option form dans l'instruction open les fichiers sont formatés (ASCII).
On utilise les instructions read et write en spécifiant le numéro logique attribué au fichier sur lequel on veut écrire. La syntaxe de lecture va dépendre de l'accès (direct ou séquentiel) et du type de contenu des fichiers (ASCII ou binaire) :
! pour lire sur un fichier séquentiel formaté
write
( "où"
, "comment"
)
! pour écrire sur un fichier séquentiel formaté
read
( "où"
, "comment"
)
! on associe le fichier toto au numéro logique 11
open
(11,file="toto"
,form="formatted"
,access="sequential"
)
! on lit un entier sur toto
read
(11,*)entier
! on écrit un entier sur toto
write
(11,*)999,entier
! pour lire/écrire sur un fichier binaire on ne précise pas le format
open
(11,file="fichier_binaire"
,form="unformatted"
)
write
(11)entier
read
(11)entier
! pour lire/écrire sur un fichier à accès direct on précise l'enregistrement à lire
opent(11,file="fichier_direct"
,form="unformatted"
,access="direct"
)
write
(11,rec=3)entier
read
(11,rec=10)entier
Chaque ligne d'un fichier s'appelle un enregistrement. En Fortran il existe deux moyens d'accéder au contenu d'un enregistrement : un accès direct ou un accès séquentiel. Dans un accès direct, on lit ou écrit directement l'emplacement que l'on veut. Dans un accès séquentiel, il est nécessaire de lire tous les emplacements qui précèdent celui que l'on souhaite lire.
De façon imagée, on peut assimiler une lecture à accès séquentiel à la lecture d'une cassette vidéo (il faut lire le début de la cassette avant de lire la partie qui nous intéresse) ; on peut assimiler une lecture à accès direct à la lecture d'un CD ou DVD sur lequel on lit directement la musique ou le chapitre que l'on souhaite.
Les enregistrement des fichiers à accès direct ont une taille fixe qui est déterminée à l'ouverture du fichier. Celle des fichiers à accès séquentiel peut varier d'un enregistrement à l'autre. Si la taille des enregistrements varie beaucoup d'une ligne à l'autre, il s'ensuit qu'un fichier séquentiel est généralement plus léger qu'un fichier direct.
On précise le type d'accès aux enregistrements du fichier par l'option acces de l'instruction open. Dans le cas d'un accès direct il faut également préciser la longueur des enregistrements par l'option recl qui est un entier correspondant au nombre de caractères pour les fichiers ASCII.
! ouverture d'un fichier à accès direct avec 100 caractères par enregistrement (=lignes)
open
(11, file="fichier_direct"
, acces="direct"
, recl=100)
! ouverture d'un fichier à accès séquentiel
open
(11, file="fichier_sequentiel"
, acces="sequential"
)
Pour agir sur un fichier depuis un proramme Fortran on lui attribue un numéro logique. Pour cela, on utilise l'instruction open. Le numéro logique définit le chemin qui permettra d'accéder au fichier pour le lire ou écrire dedans.
Les numéros logiques inférieurs à 10 sont réservés, on ne les utilise pas.
! syntaxe minimale
open
( numero , file="nom du fichier"
)
! exemples
open
( 11, file="monfichier"
)
open
( 23, file=fichier) ! où fichier est une variable chaine de caractère
open
( i, file="monfichier) ! où i est un entier ou une exepression arithmétique
Par défaut les fichiers sont des fichiers ASCII (formatés) et à accès séquentiel. Voici une syntaxe plus complète de l'instruction open. Pour connaître l'ensemble des options consulter l'un des cours disponibles.
! syntaxe complète
open
( numero , file="mon_fichier"
, acces="sequential"
/"direct"
, &
form="formatted"
/"unformatted"
, &
action="read"
/"write"
/"readwrite"
, &
position="asis"
/"rewind"
/"append"
)
Les fichiers sont automatiquement fermés si l'exécution rencontre une instruction stop ou end. On peut fermer un fichier avant la fin de l'exécution du programme avec l'instruction close.
! fermeture du fichier
close
( numero logique du fichier)
! exemples
close
(11)
close
(i)
close
(2*i + 1)
S'il vous arrive d'écraser un de vos fichiers au cours de l'exécution de vos programmes cette option de l'instruction open est faite pour vous. Elle permet à l'ouverture du fichier de définir ses permissions de lecture et d'écriture.
! ouverture en lecture seule
open
(numero, file="mon_fichier"
, action="read"
)
! ouverture en écriture seule
open
(numero, file="mon_fichier"
, action="write"
)
! ouverture en lecture et écriture (défaut)
open
(numero, file="mon_fichier"
, action="readwrite"
)
Il peut être utile à l'intérieur d'un programme Fortran, de détecter l'existence d'un fichier avant de lire ou écrire dedans. Pour cela on utilise l'instruction inquire. Elle ne se limite pas à cela mais voici un exemple d'utilisation pour tester l'existence d'un fichier.
! on utilise une variable logique
logical
::exite
! on teste l'existence de mon_fichier
inquire
( file="mon_fichier"
, exist=existe)
! la réponse est dans la variable existe
If
( existe ) Then
! existe = .true.
write
(*,*)"le fichier existe"
ElseIf
( .NOT. existe) Then
! existe = .false.
write
(*,*)"le fichier n'existe pas"
STOP
Endif
Par défaut, à l'ouverture d'un fichier, on écrit ou on lit sur la première ligne du fichier. Dans l'instruction open l'option position permet de choisir la ligne sur laquelle on se positionne lors de l'ouverture du fichier.
! on ouvre le fichier avec position = "append"
open
( 10, file="mon_fichier"
, position="append"
)
! on va écrire à la suite du fichier
write
(10,*)"j'écris sur la dernière ligne"
Lors de la lecture d'un fichier, on peut rajouter dans l'instruction read l'option end=etiquette qui permet de renvoyer l'exécution du programme à la ligne marquée par l'étiquette lorsque l'on atteind la fin du fichier. Dans ce cas il faut utiliser les étiquettes et le format fixe.
! on va lire un fichier dont on ne connais pas le nombre de ligne
open
(10, file="fichier"
)
i=0
Do
read
(10,*,end
=1000)var1,var2
i = i + 1
Enddo
1000 write
(*,*)"la lecture a atteind la fin du fichier"
write
(*,*)"le nombre de ligne est : "
,i
Lors de la lecture d'un fichier, on peut rajouter dans l'instruction read l'option iostat=entier. Si la fin du fichier est atteinte, entier prendra une valeur négative. La valeur dépend du compilateur on testera donc simplement le signe.
! on va lire un fichier dont on ne connais pas le nombre de ligne
open
(10, file="fichier"
)
i=0
Do
read
(10,*,iostat=io)var1,var2
If
( io <
0 ) exit
i = i + 1
Enddo
write
(*,*)"la lecture a atteind la fin du fichier"
write
(*,*)"le nombre de ligne est : "
,i