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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

lecture d'un fichier


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut lecture d'un fichier
    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

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    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.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    Voici une partie du fichier que j'utilise:
    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
    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
    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
    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
    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)
    mais ça marche pas!!! je trouve toujours le même résultat

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Points : 65
    Points
    65
    Par défaut
    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 :

    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.
    Le programme ci-dessous implante cette solution :

    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

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    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 :
    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
    Les données extraites sont écrites dans le fichier colonne 'tmp.dat', qui sera lu par le programme FORTRAN.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    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

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    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.

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    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!!!!!

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Envoie le code et le fichier alors.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    Tu peux procéder de la façon suivante :

    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
    Bonne journée,

    Marlan

Discussions similaires

  1. Lecture d'un fichier .dbf
    Par San Soussy dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 07/07/2004, 16h30
  2. Réponses: 6
    Dernier message: 02/09/2003, 15h12
  3. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo