IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ Fortran

FAQ FortranConsultez toutes les FAQ

Nombre d'auteurs : 1, nombre de questions : 70, dernière mise à jour : 23 juillet 2021 

 
OuvrirSommaireLes fichiers

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.

Choix du type de contenu d'un fichier
Sélectionnez
 ! 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).

Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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) :

Exemple lecture écriture dans un fichier
Sélectionnez
 ! 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
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

Choix du type d'accès aux enregistrement d'un fichier
Sélectionnez
 ! 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")
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

Synataxe générale de open
Sélectionnez
 ! 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 plus complète de open
Sélectionnez
 ! syntaxe complète
 open( numero , file="mon_fichier", acces="sequential"/"direct",       &
                                    form="formatted"/"unformatted",    &
                                    action="read"/"write"/"readwrite", &
                                    position="asis"/"rewind"/"append" )
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

syntaxe de l'instruction close
Sélectionnez
 ! fermeture du fichier
 close( numero logique du fichier)

 ! exemples
 close(11)
 close(i)
 close(2*i + 1)
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

Choix des permissions à l'ouverture d'un fichier
Sélectionnez
 ! 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")
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

 
Sélectionnez
 ! 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
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

Ecrire à la fin du fichier
Sélectionnez
 ! 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"
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

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.

Détection de la fin du fichier avec end
Sélectionnez
      ! 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.

Détection de la fin du fichier avec iostat
Sélectionnez
 ! 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
Créé le 22 octobre 2008  par Germain Salvato-Vallverdu

Copyright © 2008 developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.