Entrées et Sorties
Jusqu’ici, on a printé et readé des données que l’utilisateur doit fournir lui même, en direct, à la main. Mais il est souvent pratique de lire des valeurs en entrée dans un fichier, et aussi d’écrire les résultats en sortie dans un fichier… Dans les deux cas, il y a 3 étapes:
Ouvrir le fichier (open)
Le fichier doit être placé dans le même répertoire que le script. Il faut lui assigner un numéro, et préciser si c’est un fichier en binaire (unformatted) ou texte (formatted). Pour ouvrir le fichier texte toto.txt, entrer:
open(unit=1,file= « toto »,form= « formatted »,action= « read »,iostat=ios)
Trifouiller le fichier (read ou write)
Pour lire le fichier, il faut d’abord le décrire. Contient-il des entiers, des réels ou des caractères (respectivement I, F et A) ?
Combien de caractères faut-il lire pour chaque type ?
Exemple: pour lire un fichier en colonnes listant des données sismiques (stations.txt, avec station, latitude, longitude et altitude de la station):
N 28.00160 84.62350 1997
Si l’on veut lire la colonne de latitude (nombre réel), on veut identifier 8 caractères, dont 5 après la virgule. Il faut alors écrire F8.5
Et pour tout lire:
character::sta
real::lat,lon
integer::alt
open(unit=1,file= « stations.txt »,form= « formatted »,action= « read »)
read(unit=1,fmt='(A,F8.5,F8.5,I5)’) sta, lat, lon, alt
FORTRAN lira le fichier de façon séquentielle, ligne par ligne.
Pour écrire des données dans un fichier, le principe est le même, il faut préciser le format dans lequel on va écrire les variables:
write(unit=1,fmt='( )’) variables
Exemple: si i=12 et j=1234:
integer::i,j
open(…
write(unit=1,fmt='(I5,I8)’) i, j
va écrire: —12—-1234
Par ailleurs,
write(unit=1,fmt='(« i= »,I5, « j= »,I8)’) i, j
va écrire: i=—12j=—-1234, ce qui peut clarifier les choses…
Enfin, surtout, ne pas oublier de fermer le fichier avec close :
close(unit=1)
Notions sur les tableaux, Chaînes de Caractères
Un tableau est une variable pouvant stocker plusieurs valeurs de même type (entier, réel, caractère…). Par exemple, si l’on déclare le tableau suivant comme un tableau d’entiers
Il y aura un bug à cause de la dernière valeur, réelle.
FORTRAN manipule des tableaux jusqu’à 7 dimensions (une matrice étant un tableau à deux dimensions).
Comment les déclarer proprement ?
type ,dimension(expression1,expression2,…,expression n):: nom du tableau
Déclarons par exemple le tableau suivant, nommé titi (1X6), de trois façons différentes, pour le fun
integer, dimension(6)::titi
integer, dimension(1:6)::titi
integer, dimension(-1:4)::titi
integer, dimension(0:5)::titi
Par défaut, le premier indice est 1, mais on peut lui attribuer 0.
Si le tableau fait plus d’une dimension, on sépare les dimensions par des virgules:
real, dimension(4,6)::toto
Un peu de vocabulaire:
Le rang d’un tableau = nombre de dimensions (ex. = 2 pour toto, =1 pour titi)
Le profil d’un tableau = vecteur avec le nombre d’éléments dans chaque dimension (ex. [4,6] pour toto)
La taille d’un tableau = produit des éléments du profil (ex. 24 pour toto)
Deux tableaux sont conformants quand ils ont le même profil.
Pour travailler sur des morçeaux de tableaux, à partir de:
integer, dimension(4,6)::toto
toto(2,3)
toto(:,:)
toto(1:3,2)
renvoie 5.5
renvoie toto en entier
renvoie la portion:
54.5
35.0
13.4
On peut aussi extraire des données du tableau avec un pas choisi. Par exemple, pour isoler les éléments de la 1ere ligne de deux en deux, entrer:
toto(1,2:6:2) ce qui sortira :
54.5 43.35 212.3
Et pour effectuer des opérations sur les tableaux ?
FORTRAN effectue toutes les opérations membre à membre (et non des produits matriciels, directement, par exemple).
Remplir les tableaux (affectation, avec =):
Pour attribuer la valeur 1 à la case (2eme ligne, 3eme colonne):
toto(2,3)=1
Remarque… toto=1 est autorisé, bien que toto et 1 ne soient pas conformants. Cette commande remplit toto de « 1 », dans toutes les cases.
Opérations diverses…
Tout est permis, mais terme à terme: + – / * sin cos …
Et les chaînes de caractères…
Rappel: pour déclarer un caractère, il suffit d’entrer:
character::ch
Mais pour une chaîne de caractères:
character(LEN= longueur de la chaîne):: nom de la chaîne
Par exemple:
character(LEN=9):: ch
déclare ch comme un tableau de caractères à 1 ligne et 9 colonnes.
Mais, grande différence avec les tableaux, si on attribue ch= « bonjour »
La commande va fonctionner, même si « bonjour » n’a que 7 lettres:
B O N J O U R
Des espaces seront automatiquement attribués aux cases non remplies.
A part ça, on peut réaliser les mêmes opérations que sur les tableaux, par exemple transformer
« bonjour » en « bonsoir », en attibuant: ch(4:7)= « soir »
Remarque chiante: pour désigner le i-ème caractère d’une chaîne de caractères, ch(i) ne marche pas.
Il faut entrer ch(i:i) …