Bonjour,
J'ai un fichier qui contient 2 colonnes (des données initiales de mon programme) et je veux lire que la deuxième colonne.
comment pourrais je faire ça?
Merci d'avance
Bonjour,
J'ai un fichier qui contient 2 colonnes (des données initiales de mon programme) et je veux lire que la deuxième colonne.
comment pourrais je faire ça?
Merci d'avance
Tu dois normalement traiter ligne par ligne avec une boucle et à chaque ligne, tu lis :
- Si en format libre : 2 variables, une bidon, puis celle que tu veux.
- Si format fixe : Tu saute la plage de la première variable (nX), puis tu lis la variable que tu veux.
Voici une partie du fichier que j'utilise:
quand je fais un print je trouve:
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 -100.0000000000 0.0000000000 -99.9966661110 0.0000000000 -99.9933322220 0.0000000000 -99.9899983331 0.0000000000 -99.9866644441 0.0000000000 -99.9833305551 0.0000000000 -99.9799966661 0.0000000000 -99.9766627771 0.0000000000 -99.9733288881 0.0000000000 -99.9699949992 0.0000000000 -99.9666611102 0.0000000000 -99.9633272212 0.0000000000 -99.9599933322 0.0000000000 -99.9566594432 0.0000000000 -99.9533255543 0.0000000000 -99.9499916653 0.0000000000 -99.9466577763 0.0000000000 -99.9433238873 0.0000000000 -99.9399899983 0.0000000000 -99.9366561094 0.0000000000 -99.9333222204 0.0000000000 -99.9299883314 0.0000000000 -99.9266544424 0.0000000000 -99.9233205534 0.0000000000 -99.9199866644 0.0000000000 -99.9166527755 0.0000000000 -99.9133188865 0.0000000000 -99.9099849975 0.0000000000 -99.9066511085 0.0000000000 -99.9033172195 0.0000000000 -99.8999833306 0.0000000000 -99.8966494416 0.0000000000 -99.8933155526 0.0000000000
pour lire la 2ème colonne, j'ai fait
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 -100.00000000000000 0.0000000000000000 -99.996666110999996 0.0000000000000000 -99.993332222000006 0.0000000000000000 -99.989998333100004 0.0000000000000000 -99.986664444100001 0.0000000000000000 -99.983330555099997 0.0000000000000000 -99.979996666100007 0.0000000000000000 -99.976662777100003 0.0000000000000000 -99.973328888099999 0.0000000000000000 -99.969994999199997 0.0000000000000000 -99.966661110199993 0.0000000000000000 -99.963327221200004 0.0000000000000000 -99.959993332200000 0.0000000000000000 -99.956659443199996 0.0000000000000000 -99.953325554299994 0.0000000000000000 -99.949991665300004 0.0000000000000000 -99.946657776300000 0.0000000000000000 -99.943323887299996 0.0000000000000000 -99.939989998300007 0.0000000000000000 -99.936656109400005 0.0000000000000000 -99.933322220400001 0.0000000000000000
mais ça marche pas!!! je trouve toujours le même résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 open(UNIT = 1, FILE = 'SSPRK.dat') do i = 1,n if (mod(i,2).ne.0) then read(1,*) U(i) end if end do close(1)
Bonjour,
Le programme ne fonctionne pas car le test n'est pas bon pour au moins 2 raisons :
- 1) U(i) se voit affecter une valeur uniquement pour ses indices impairs. Les valeurs des indices pairs (en l'occurence 0.) sont celles de l'initialisation
- 2)lorsque l'indice est impair, c'est la valeur de la première colonne qui est affectée à U(i)
Comme l'a indiqué Sylvain Bergeron :
Le programme ci-dessous implante cette solution :Tu dois normalement traiter ligne par ligne avec une boucle et à chaque ligne, tu lis :
Si en format libre : 2 variables, une bidon, puis celle que tu veux.
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 program test implicit none integer, parameter :: n = 33 integer :: i real :: trash real, dimension(n) :: u open(unit = 10, file = "SSPRK.dat") do i = 1, n read(10,*) trash, u(i) end do close(10) do i = 1, n print *, u(i) end do end program test
Salut !
Juste pour dire qu'il est souvent avantageux d'utiliser les commandes SHELL (ou équivalentes pour les OS qui ne sont pas des LINUX) pour extraire des données. Par exemple, pour l'extraction de la seconde colonne avec des sed (supprime les espaces) et un cut :
Les données extraites sont écrites dans le fichier colonne 'tmp.dat', qui sera lu par le programme FORTRAN.
Code : Sélectionner tout - Visualiser dans une fenêtre à part cat file_to_extract.dat | sed "s/^\s*//g" | sed "s/\s\s*/ /g" | cut -d " " -f 2 > tmp.dat
Bonjour,
Je vous remercie pour vos réponses mais j'ai encore un petit problème , quand je lance mon programme il m'affiche un message d'erreur:
At line 60 of file main.f90 (unit = 10, file = 'SSPRK.dat')
Fortran runtime error: End of file
Je comprends pas ce message pourtant le fichier SSPRK.dat et le code se trouvent dans le même répertoire!!
Pourriez vous m'expliquez ce message d'erreur?
Merci d'avance
Salut the_reward.
Parce que la valeur d'arrêt de la boucle ne correspond pas au nombre de lignes du fichier, non ?
Tu peux aussi utiliser l'option iostat de read.
Salut __dardanos__
Si le n correspond bien au nombres de lignes du fichier et j'ai essayé avec l'option "iostat" mais ça marche toujours pas!!!!!
Envoie le code et le fichier alors.
Bonjour,
Tu peux procéder de la façon suivante :
Bonne journée,
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 program Lecture implicit none real,allocatable,dimension(:,:) :: Donnees real(kind=8) :: TMP integer :: I, ios open(11,file='SSPRK.dat',status='old',action='read',iostat=ios) !on ouvre le fichier avec !un iostat : une variable d'erreur valant 0 quand la lecture se passe bien i=0 !fait tant qu'il n'y a pas d'erreur... do read(11,*,iostat=ios) !une lecture a vide if(ios/=0)exit i=i+1 !en incrementant un comptant pour connaitre le nombre de lignes end do allocate(Donnees(i,1))!afin d'allouer un tableau de taille nombre de ligne rewind(11) do i=1,size(Donnes,dim=1) read(11,*)TMP,Donnees(i,1)!que l'on va remplir en relisant le fichier end do close(11) end program Lecture
Marlan
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager