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 2 fichiers ligne par ligne


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut Lecture 2 fichiers ligne par ligne
    Bonjour,

    je débute avec le Fortran, donc ma question pourrait paraître assez simple pour certains

    je dispose de 2 fichiers texte, comprenant plusieurs variables en colonnes et ce sur plusieurs lignes.
    Je désire comparer les 2 fichiers afin de réaliser des opérations assez simples.
    Ils se composent ainsi:

    Id1 Id2 Composante
    Id1 Id2 Composante
    ...

    Je pose une condition if et .and. pour retrouver les mêmes variables d'un fichier à l'autre Id et Id2. Lorsque le programme trouve des 2 mêmes Id, il réalise une opération sur la Composante.

    Cependant, mon programme ne marche pas. J'ai établi une boucle avec do while sur i pour les 2 fichiers. Ca ne marche pas, alors je pensais faire une boucle avec i pour le 1er fichier et une 2eme avec j pour le 2eme fichier afin qu'il parcourt d'abord 1 ligne pour le 1er fichier et toutes les lignes pour le 2e et ainsi de suite. Mais ça ne marche pas.

    Soit j'ai fait un erreur dans mon programme genre dans la place de la boulce de j.
    Soit c'est tout autre chose...

  2. #2
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Citation Envoyé par tourby Voir le message
    Bonjour,

    je débute avec le Fortran, donc ma question pourrait paraître assez simple pour certains
    Bah, on a tous débuté un jour

    Cependant, mon programme ne marche pas. J'ai établi une boucle avec do while sur i pour les 2 fichiers. Ca ne marche pas,
    Donne nous ton fichier source. On essaiera de voir ce qui ne va pas.
    Précise l'OS et le compilateur (et avec quelles options) tu utilises.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut
    Bonjour,


    Je travaille et compile sous Linux

    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
     
    program clca
    implicit none
     
    real	:: T(99999),T09(99999),T10(99999)
    integer :: Bdr_id(99999),Bd(99999),Bf(99999),S1(99999),S2(99999),S3(99999)
    integer :: Bdr_id09(99999),Bd09(99999),Bf09(99999),S109(99999),S209(99999),S309(99999)
    integer :: Bdr_id10(99999),Bd10(99999),Bf10(99999),S110(99999),S210(99999),S310(99999)
    integer	:: i,j
     
    i=1
    j=1
     
    open(unit=10,name="clca10.txt",status="old",err=1000)
    open(unit=11,name="clca09.txt",status="old",err=1000)
    open(unit=12,name="clca.txt",status="replace",err=1000)
     
    do while(.true.)
     do while(.true.)
     
     read(10,*,end=1000) Bdr_id10(i),Bd10(i),Bf10(i),S110(i),S210(i),S310(i),T10(i) 
     
     read(11,*,end=1000) Bdr_id09(j),Bd09(j),Bf09(j),S109(j),S209(j),S309(j),T09(j)
     
       if(Bdr_id10(i)==Bdr_id09(j).and.Bd10(i)==Bd09(j))then
         T(i)=T10(i)-T09(j)
       endif
     
     
    write (12,*) Bdr_id10(i),Bd10(i),Bf10(i),S110(i),S210(i),S310(i),T(i)
     
    j=j+1
     enddo 
     
    i=i+1
    enddo
     
    1000 continue
     
    end program
    merci

  4. #4
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    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
     
    program clca
    implicit none
     
    integer, parameter :: Taille=99999
     
    real,dimension(Taille)       :: T09(Taille),T10(Taille)
    integer,dimension(Taille,6):: B09,B10 
    integer    :: i,j,N09,N10,ios
     
    !lecture du fichier clca10.txt et stockage.
    open(unit=10,file="clca10.txt",status="old",iostat=ios)
    i=0
    do while(ios==0)
      i=i+1
      read(10,*,iostat=ios) (B10(i,j),j=1,6),T10(i)
    end do
    N10=i
    close(10)
    !lecture du fichier clca09.txt et stockage
    open(unit=10,file="clca09.txt",status="old",iostat=ios)
    do while(ios==0)
      read(10,*,iostat=ios) (B09(i,j),j=1,6),T09(i) 
    end do
    N09=i
    close(10)
     
    open(unit=12,file="clca.txt",status="replace",iostat=ios)
    do i=1,N10
     do j=1,N09
    ! si il y a correspondance, alors on fait l'opération
       if((B10(i,1)==B09(j,1)).and.(B10(i,2)==B09(j,2)))then
         T10(i)=T10(i)-T09(j)
       endif
     end do
     write (12,*) (B10(i,j),j=1,6),T10(i)
    end do
    close(12)
    end program
    moi je le ferai plutôt de cette manière mais cela te demande beaucoup de mémoire et ce n'est pas forcément utile:
    on lit entièrement le fichier 10 et on stocke ses valeurs le compteur i permet en fin de boucle de connaitre le nombre de valeurs on fait de même pour le fichier 9
    on fait ensuite une boucle pour trouver la corespondance et si oui, on éfectue l'opération, sinonon laisse le tableau T01 tranquille... puis on écrit le fichier...
    cependant tu n'a pas besoin de stocker entièrement le fichier 10:
    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
    program clca
    implicit none
     
    integer, parameter :: Taille=99999
     
    real,dimension(Taille)       :: T09(Taille),T10
    real T10
    integer,dimension(Taille,6):: B09,B10 
    integer,dimension(6) :: B01
    integer    :: i,j,N09,N10,ios
     
     
    !lecture du fichier clca09.txt et stockage
    open(unit=10,file="clca09.txt",status="old",iostat=ios)
    do while(ios==0)
      read(10,*,iostat=ios) (B09(i,j),j=1,6),T09(i) 
    end do
    N09=i
    close(10)
     
     
    !lecture du fichier clca10.txt et stockage.
    open(unit=10,file="clca10.txt",status="old",iostat=ios)
    open(unit=12,file="clca.txt",status="replace",iostat=ios)
     
     do while(ios==0)
       read(10,*,iostat=ios) (B10(j),j=1,6),T10
      do j=1,N09
    ! si il y a correspondance, alors on fait l'opération
       if((B10(1)==B09(j,1)).and.(B10(2)==B09(j,2)))then
         T10=T10-T09(j)
       endif
     end do
     write (12,*) (B10(j),j=1,6),T10
    end do
    close(10)
    close(12)
     
    end program
    dans ce second exemple, tu lit le fichier 9 entièrement pour sauvegarder ses valeurs en mémoire ensuite, tu lit ligne par ligne le fichier 10 que tu compare à chacune des valeurs de 9, effectue l'opération si correspondance enfin écrit la ligne dans le fichier résultat... tu économise donc pas mal de mémoire.

    enfin dans ton programme à toi, ce qui est très dérangeant, c'est qu'à chaque fois que tu lit une ligne de 10, tu lit TOUTES les lignes de 9 ce qui veut dire que tu lit et relit les données de 9 en permanence ce qui est très lent puisque ton fichier est sur le disque dur... il vaut mieux le charger en mémoire c'est beaucoup plus rapide en traitement!!!

    p.s. l'attribut IOSTAT renvoie un entier te disant si la lecteur ou l'ouverture (dans le open) s'est bien dérouler... il devient non nul également lorsque tu arrive à la fin du fichier... donc tant que ios est nul, on peut continuer à lire...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut
    Bonjour, merci pour ta réponse précise!

    Cependant, lorsque j'applique ta première solution, le programme ne semble pas calculer ma condition. Il me réécrit exactement leT10 du fichier clca10

    J'ai aussi changé les open unit, tu écrivais 2 fois unit=10 pour les 2 fichiers à lire

    EDIT :

    Oups,

    en fait il manquait 2, 3 lignes que tu devais sans doute avoir oublié, ou fait exprès pour me faire cogiter mais ça marche

    Merci beaucoup

  6. #6
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    non c 'était pas fait exprès...
    mais pour les deux open unit=10, vu que tu ouvre puis ferme la 10, elle est de nouveau libre pour ouvrir un autre fichier!

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. lire fichier .txt (NOTEPAD) ligne par ligne
    Par skambram dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2009, 18h41
  3. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  4. [lecture d'un fichier] ligne par ligne
    Par pitit777 dans le forum C++
    Réponses: 3
    Dernier message: 26/11/2005, 11h22
  5. [debutant]lecture fichier ligne par ligne
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 13/11/2005, 19h02

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