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 fichier et allocate automatique


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 70
    Par défaut lecture fichier et allocate automatique
    Bonjour

    Je voudrais s'il est possible qu'en lisant un fichier contenant une colonne de taille inconnu avant la lecture, on puisse écrire toutes ces données dans un tableau qui se fait lui même un allocate à la bonne dimension ?

    Ca donnerait peut-être un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    real,dimension(:),allocatable::colonne
    integer::i
     
    i=0
    open(le fichier)
    do
    i=i+1
    read(unit fichier,format,end=999),colonne(i)
    enddo
    close
     
    999 continue
    Il faudrait que le programme me fasse un allocate(colonne(i)) je pense, est-ce possible ?

    Merci de votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    ce n'est pas directement faisable en fortran (comme en c++ par exemple) car tu ne peux pas affecter une valeur à un tableau déjà alloué et tu ne peux pas faire deux allocate consécutifs sur le même tableau.

    c'est en général une mauvaise façon de faire de "copier" les fonctionnalités d'un autre langage. en fortran 90 il faudrait faire une allocation initiale, puis copier les données dans un tableau temporaire, désallouer le tableau principal puis le réallouer à une nouvelle taille, recopier le tableau temporaire et ajouter les nouvelles données... bref c'est très moche.

    enfin, je parle pour le fortran 90, je ne sais pas si c'est possible facilement pour les normes plus récentes du langage.

    il te reste donc à faire une première lecture du fichier pour lire les paramètres dimensionnants de ton tableau, de faire les allocations et ensuite de lire les tableaux lors d'une deuxième lecture.

  3. #3
    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
    Par défaut
    C'est un problème classique, qui n'a malheureusement pas de solution simple. Traditionnellement, ces problèmes étaient souvent résolus par un traitement itératif :
    • Tant qu'il y a des données :
      • Lire une donnée
      • Traiter la donnée
      • Écrire le résultat


    De plus en plus, les programmeurs veulent tout lire, puis traiter. Si le fichier est « petit », la technique simple et efficace est la 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
     
    integer NbLigne
    integer k
    real,allocatable::colonne(:)
    ...
    NbLigne = 0
    do
       read(Fichier,*,iostat=k)
       if (k /= 0) exit
       NbLigne = NbLigne + 1
    enddo
    allocate(Colonne(NbLigne))
    rewind( Fichier)
    do k = 1, NbLigne
       read(Fichier,*,iostat=k) Colonne(k)
       if (k /= 0) exit
    enddo
    ...
    Tu peux également ne lire qu'une fois en jouant avec 2 variables allocatables, mais c'est un peu pénible. Si ton compilateur supporte la commande movealloc (Fortran 2003), ce sera un peu plus simple.

    Finalement, la technique utilisée par d'autres langages est via une liste liée, le tout caché / encapsulé de telle sorte que ça semble un simple vecteur dynamique. En Fortran, tu pourrait trouver un module de liste liée, c'est assez facile à trouver Google Fortran Linked list. De là, tu fais quelque chose comme :
    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
     
    use LinkedList
    type(TLinkedList) :: VecteurDynamique
    integer k
    real Element
    real,allocatable::colonne(:)
    ...
    do
       read(Fichier,*,iostat=k) Element
       if (k /= 0) exit
       VecteurDynamique%Append(Element)
    enddo
    allocate(Colonne(VecteurDynamique%NbItem))
    do k = 1, VecteurDynamique%NbItem
       Colonne(k) = VecteurDynamique%Item(k)
    enddo
    ...
    Si tu n'as pas à traiter la liste comme un vecteur natif, tu peux évidemment enleever le allocate et ce qui suit...

Discussions similaires

  1. Lecture fichier Word et remplacement paramètre
    Par Pfeffer dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/02/2005, 17h30
  2. [ifstream] pb lecture fichier non sequentielle
    Par bludo dans le forum SL & STL
    Réponses: 3
    Dernier message: 10/02/2005, 21h30
  3. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  4. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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