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.
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.
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
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
Partager