Bonjour,
J'ai un fichier texte qui ressemble à quelque chose comme ceci. Le nombre de colonnes est fixe mais le nombre de lignes (1000+) varie d'un fichier à un autre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
1    80,9015579200    58,7787246700    100,0000000000
2    30,9003887200    95,1060791000    100,0000000000
3    -30,9015693700    95,1056900000    100,0000000000
4    -80,9029464700    58,7768058800    100,0000000000
5    -100,0000000000    -0,0000180993    100,0000000000
6    -80,9003143300    -58,7804298400    100,0000000000
7    -30,9010887100    -95,1058502200    100,0000000000
8    30,9034862500    -95,1050720200    100,0000000000
9    80,9029388400    -58,7768211400    100,0000000000
10    100,0000000000    0,0000000000    66,6666641200
11    80,9015579200    58,7787246700    66,6666641200
12    30,9003887200    95,1060791000    66,6666641200
13    -30,9015693700    95,1056900000    66,6666641200
J'aimerais lire ce fichier et le stocker dans un tableau. J'utilise Compaq Visual Fortran et j'ai essayé de comprendre le help pour faire une lecture mais sans succès. J'ai chercher pour trouver des exemples sur le net mais en vain. Si quelqu'un pouvait me diriger vers un exemple concret et complet ou bien me donner la syntaxe pour effetuer la lecture, j'apprécierais beaucoup.
Merci!

p.s. J'utilise Fotran90. Je dois traduire un programme Matlab en Fortran, je viens tout juste de commencer à travailler avec Fortran.

edit: Après plusieurs heures de tentatives, j'ai trouvé comment lire mon fichier. Par contre, je n'ai pas réussi à paramétriser l'algorithme aussi bien que je l'aurais voulu.

Tout d'abord, je veux stocker le nom du fichier dans une variable (filename). Pour que la commande OPEN puisse fonctionner, je dois indiquer le nombre de caractère lors de l'instanciation de la variable de type CHARACTER. Est-ce qu'il y aurait moyen d'utiliser l'instanciation CHARACTER(LEN=*) (ou autre chose permettant quelque chose de similaire) et ensuite de redimensionner la variable. Ainsi, il serait possible de changer facilement le nom du fichier.

Ensuite, pour le tableau contenant les données, je veux le dimensionner selon le nombre de lignes contenus dans le fichier. Je n'ai pas trouvé de commande pour obtenir directement le nombre de lignes contenues dans le fichier. Donc, j'ouvre une première fois le fichier et je compte le nombre de lignes. Ensuite, je dimensionne mon tableau et par la suite, je réouvre le fichier et je le relis une deuxième fois, mais cette fois, j'enregistre les données dans mon tableau. Est-ce qu'il y aurait moyen d'effectuer cela sans avoir à ouvrir le fichier deux fois? Ou tout autre méthode qui serait plus optimale? (J'ai l'impression que ma méthode utilisée n'est pas très bonne côté temps d'exécution...)

Voici ce que j'ai fait jusqu'à maintenant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
program Test1
 
    implicit none
 
    character(len=15) :: filename
    integer :: i,j,nbNode,nbCol
    integer :: unitFile, iError,line
    double precision, allocatable :: fileContent(:,:)
    double precision, allocatable :: temp(:)
 
    nbNode = 0
    nbCol = 4
 
    allocate (temp(nbCol))
 
    unitFile = 1
    filename = "nodeMeshBig.txt"
 
    ! Ouvrir le fichier
    open(UNIT=unitFile, FILE=filename, FORM="FORMATTED", STATUS="OLD", ACTION="READ")
 
    ! Déterminer le nombre de lignes dans le fichier
    countLines: do
 
        read(UNIT=unitFile, FMT=*, IOSTAT=iError) temp
 
        if (iError == -1 .OR. iError > 0) then 
            exit
        else
            nbNode = nbNode + 1
        end if
 
    end do countLines
 
    close(UNIT=unitFile)
 
    ! Définir la dimension du tableau selon le nombre de lignes dans le fichier
    allocate (fileContent(nbNode,nbCol))
 
    ! Réouvrir le fichier
    open(UNIT=unitFile, FILE=filename, FORM="FORMATTED", STATUS="OLD", ACTION="READ")
 
    ! Stocker les données du fichier dans un tableau
    saveNodes: do line = 1,nbNode
 
        read(UNIT=unitFile, FMT=*) fileContent(line,1:nbCol)
 
    end do saveNodes
 
    close(UNIT=unitFile)
 
    ! Vérification
    write(*,*) size(fileContent(:,1))
 
    do i = 1,nbNode
        do j = 1,nbCol
 
            write(*,*) fileContent(i,j)
 
        end do
    end do
 
end program Test1