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 :

End Of Line?


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut End Of Line?
    Bonjour!
    En fait, je dois lire dans un fichier des données qui ne sont pas toutes de la même taille (exemple en fortement simplifié: 1ère ligne 4 integer à lire / 2ème ligne 2 integer...). Pour faire cela, je ne vois que le 'end of line' qu'on retrouve dans d'autres langages, mais je ne trouve rien sur un eol en fortran(90)...
    Quelqu'un pourrait me dire quelle est l'instruction end of line en fortran? Merci beaucoup d'avance!

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    une solution est d'utiliser les options 'IOSTAT' (0 si lecture se passe bien, autre chose sinon) et 'ADVANCE=NO' (permet de garder le pointeur sur la même ligne) de READ. Donc la lecture d'une ligne pourrai être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    integer :: IOS , N
    open(unit=10,file='mon_fichier')
    IOS = 0
    do while (IOS == 0)
       read(10,*,IOSTAT=IOS,ADVANCE='NO') N   ! Le * peut être remplacé par le format d'entier s'il est fixe
       if (IOS == 0) then
          ! lecture s'est bien passée
          ! sauvegarde ou traitement de l'entier N lu
       else
          ! fin de ligne, passe à la suivante
          read(10,*)
       endif
    enddo

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    merci beaucoup!
    mais, il y a quand même un soucis... pour utiliser le ADVANCE='NO', on doit spécifier le format (=> pas d'* dans le read)... on perd alors la flexibilité qu'on recherche parce que lors de la lecture, j'ai des integer de taille 1 à 6... donc '(I6)' prend avec lui des caractères de l'integer suivant, ce qui ne m'arrange pas... pas d'idée pour ça?

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Si tu connais le nombre maximal d'entiers par ligne (ou un majorant quelconque, dans mon exemple 10), tu peux faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    integer :: n(1:10)
    integer :: ios
    open(unit=10,file='mon_fichier')
     
    ios = 0
    n = 0
    read(10,*,iostat=ios) n(1:10)
    Comme ceci, tu récupère toute ta ligne et il te laisse n = 0 dans les cases en trop.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Citation Envoyé par bobbyboy Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    integer :: n(1:10)
    integer :: ios
    open(unit=10,file='mon_fichier')
     
    ios = 0
    n = 0
    read(10,*,iostat=ios) n(1:10)
    Comme ceci, tu récupère toute ta ligne et il te laisse n = 0 dans les cases en trop.
    Je ne suis pas sûr du tout que les éléments non-lus soient mis à zéro; c'est peut-être le cas avec certains compilateurs, mais je ne pense pas que ce soit standard.

    Personnellement, je ferais comme ce que suggère bobbyboy, mais en lisant dans un premier temps la ligne entière du fichier dans une variable chaîne de caractère, puis je testerai (à l'aide du 'iostat') la lecture de 1, 2,... éléments pour déterminer le nombre d'entiers effectivement présents dans la chaîne (et les stocker, dans la foulée).

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par Ehouarn
    Je ne suis pas sûr du tout que les éléments non-lus soient mis à zéro; c'est peut-être le cas avec certains compilateurs, mais je ne pense pas que ce soit standard.
    Effectivement, mais au pire des cas, les éléments non-lus ne sont pas affectés par le READ. Et comme on initialise le tableau à 0 avant la lecture, tous les éléments non-lus sont nuls.

    Ca evite de passer par une transformation caractère-->entier qui est parfois hasardeuse et alourdi le code. Mais c'est une question de choix.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Il est vrai qu'en réinitialisant le tableau avant chaque lecture il n'y aura pas de problème (sauf si par malheur le dernier entier sur le ligne à lire est justement un zéro, mais là on entre dans un cas limite pathologique qu'on peut contourner si on a une idée sur l'intervalle d'appartenance des entiers à lire).

    Bonne continuation.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci à tous, j'ai trouvé une solution un peu détournée avec un 'backspace'... mais ça fonctionne!
    Encore merci et bonne journée!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/06/2014, 14h08
  2. Probleme start et end Line
    Par Phoenix07 dans le forum C#
    Réponses: 5
    Dernier message: 25/09/2012, 11h00
  3. [Web Service] NuSOAP : Uncaught SoapFault exception Premature end of data tag line 2
    Par mika34 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 09/11/2011, 16h31
  4. Supprimer dernier end of line
    Par linar009 dans le forum Administration système
    Réponses: 5
    Dernier message: 24/08/2007, 21h53

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