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 :

Problème d'entrée/sortie d'un fichier dans un répertoire


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Problème d'entrée/sortie d'un fichier dans un répertoire
    Bonsoir,

    J'ai un problème que je ne sais pas comment résoudre.
    J'ai des répertoires, par exemple a_01, a_02, a_m, dans lesquels il y a des fichiers (map_i, i=1,n), par exemple map_01.
    a_01/map_01
    a_01/map_02
    ........
    a_01/map_n

    a_02/map_01
    a_02/map_02
    ........
    a_02/map_n

    ................

    a_m/map_01
    a_m/map_02
    ........
    a_m/map_n
    m = 100 par exemple.
    n=100
    Je voudrais calculer la somme de troisième colonne du fichier map_i comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Somme_map01 =  a_1/map_01(:,3) + ....+ a_m/map_01(:,3)/m
    ........
    Somme_mapn = a_1/map_n(:,3) + ....+ a_m/map_n(:,3)/m
    Mais je ne sais pas comment il faut l'écrire.

    J'ai écrit un petit script pour calculer map_1, ça n'a pas marché :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    program stack_map
      implicit none
      character(len=6),parameter  :: filebase = "map_01"
      character(len=2),parameter::fileb= "a_"
      character(len=4)          :: filen
      integer                     :: i,j,k,nmax,ncol,nlign
      real, allocatable           :: l1(:),l2(:),l3(:)
      real                        :: so,tr
     
    nmax=2
    ncol = 3
    ! arrays' size with the first file
     nlign = 0
     open(10,file='(a_01,/map_01)',status="old",action="read",err=50)
     do
       read(10,*,end=40) tr,tr,tr
       nlign = nlign+1
      end do
    40  close(10)
    write(*,*) nlign," lines read"
     
     
    ! allocations
     allocate(l1(nlign),l2(nlign),l3(nlign))
     l3 = 0d0
     
    ! loop over files
     do i = 1,nmax
      write(filename,'(a6 )') filebase
      print*,filename
      write(filen,'(a4, i2.2)') fileb,i
      print*,filen
      open(10,file='(filen,/filebase)',status="old",action="read",err=50)
      do j = 1,nlign
        read(10,*) l1(j),l2(j),so
        l3(j) = l3(j)+so
      end do
      close(10)
     end do
     
    ! output writing
     open(10,file="map_01",action="write",status="replace")
       do k = 1,nlign
        write(10,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/nmax
       end do
     close(10)
     
    ! deallocations
    deallocate(l1,l2,l3)
     
    stop
    50 write(*,*) "Problem with maps_file opening"
    end program stack_map
    Est-ce qu'il a quelqu'un entre vous qui sache écrire un script pour calculer ça ?

    Merci par avance !

    Chip.

    ps: voici file map_01
    map_01 :
    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
    44
    45
     0.0000000E+00   0.9000000E+02   0.5350650E-14
      0.0000000E+00   0.8800000E+02   0.7821857E-14
      0.0000000E+00   0.8600000E+02   0.6425261E-14
      0.0000000E+00   0.8400000E+02   0.7732323E-15
      0.0000000E+00   0.8200000E+02  -0.6627371E-14
      0.0000000E+00   0.8000000E+02  -0.1164896E-13
      0.0000000E+00   0.7800000E+02  -0.1116324E-13
      0.0000000E+00   0.7600000E+02  -0.5363244E-14
      0.0000000E+00   0.7400000E+02   0.2168637E-14
      0.0000000E+00   0.7200000E+02   0.7061946E-14
      0.0000000E+00   0.7000000E+02   0.7381278E-14
      0.0000000E+00   0.6800000E+02   0.4624598E-14
      0.0000000E+00   0.6600000E+02   0.1734737E-14
      0.0000000E+00   0.6400000E+02   0.2951203E-15
      0.0000000E+00   0.6200000E+02  -0.3193952E-15
      0.0000000E+00   0.6000000E+02  -0.1385939E-14
      0.0000000E+00   0.5800000E+02  -0.2966076E-14
      0.0000000E+00   0.5600000E+02  -0.3827051E-14
      0.0000000E+00   0.5400000E+02  -0.2999837E-14
      0.0000000E+00   0.5200000E+02  -0.1036623E-14
      0.0000000E+00   0.5000000E+02   0.4138451E-15
      0.0000000E+00   0.4800000E+02   0.1211175E-15
      0.0000000E+00   0.4600000E+02  -0.1775308E-14
      0.0000000E+00   0.4400000E+02  -0.4183586E-14
      0.0000000E+00   0.4200000E+02  -0.6117263E-14
      0.0000000E+00   0.4000000E+02  -0.7207045E-14
      0.0000000E+00   0.3800000E+02  -0.7390039E-14
      0.0000000E+00   0.3600000E+02  -0.6502176E-14
      0.0000000E+00   0.3400000E+02  -0.4431441E-14
      0.0000000E+00   0.3200000E+02  -0.1605575E-14
      0.0000000E+00   0.3000000E+02   0.9345648E-15
      0.0000000E+00   0.2800000E+02   0.2169372E-14
      0.0000000E+00   0.2600000E+02   0.1893632E-14
      0.0000000E+00   0.2400000E+02   0.8803067E-15
      0.0000000E+00   0.2200000E+02   0.2339361E-15
      0.0000000E+00   0.2000000E+02   0.5239074E-15
      0.0000000E+00   0.1800000E+02   0.1440299E-14
      0.0000000E+00   0.1600000E+02   0.2173178E-14
      0.0000000E+00   0.1400000E+02   0.2090281E-14
      0.0000000E+00   0.1200000E+02   0.1165362E-14
      0.0000000E+00   0.1000000E+02  -0.3475502E-16
      0.0000000E+00   0.8000000E+01  -0.6570897E-15
      0.0000000E+00   0.6000000E+01   0.3553053E-17
      0.0000000E+00   0.4000000E+01   0.2034712E-14
      0.0000000E+00   0.2000000E+01   0.4626023E-14

  2. #2
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Salut

    Quand tu met du code dans un message, utilise les balises code de l'éditer (le #) ça facilite la lecture.

    Sinon je te conseille de lire ce post

    Ce dont tu as besoin est de savoir concaténer des chaines caratères = construire une chaine de caratère à partir de plusieurs.

    Pour cela il suffit d'utiliser //

    Voici un bout de code pour te balader dans tes dossiers :

    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
     
    Do m=1,mmax    ! boucle sur les dossiers
      write(numdossier,"(i2.2)")m   ! i2.2 ça écrit 01 au lieu de 1
      Do n=1,nmax   ! boucle sur les fichiers
        write(numfichierr,"(i2.2)")n
     
        ! le nom du fichier     
        fichier = "a_"//numdossier//"/map_"//numfichier
     
        ! avec n=2 et m=3 tu devrais avoir fichier="a_03/map_02"
     
     
        open(10, file=fichier,action="read")
     
        ! tu fais ce que tu veux avec
     
      Enddo
    Enddo
    Dans mon code numfichier et numdossier sont des chaines de caractères. Selon ce que tu veux faire l'ordre des boucles n'est pas le meilleur mais ça te montre comment passer d'un fichier/dossier à l'autre.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Ca marche pas mon code
    Salut,

    Merci beaucoup Labgalen, C'est tres gentil de ta part,
    J'ai recrit mon code come ton renseignement. Mais ca ne marche pas. je n'ai pas trouve les erreur est ce que tu peux m'aider ?


    Voici le code que je viens d'ecrire:

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     
       program stack_map
      implicit none
     
    ! Declaration
      character(len=4)      :: maps
      character(len=10)     :: numdossier,numfichier
      character(len=2)      :: a_
      character(len=9)      :: map_stack
      integer               :: i,j,k,nmax,mmax,ncol,nlign, n, m
      real, allocatable     :: l1(:),l2(:),l3(:)
      real                  :: so,tr
     
     
    mmax=2
    ncol = 3
    nmax = 97
     
    ! arrays' size with the first file
     nlign = 0
    open(10,file="a_01"//"/maps000075",status="old",action="read",err=50)
     do
       read(10,*,end=40) tr,tr,tr
       nlign = nlign+1
      end do
    40  close(10)
    write(*,*) nlign," lines read"
     
    ! allocations
     allocate(l1(nlign),l2(nlign),l3(nlign))
     l3 = 0d0
     
    !! boucle
     
      Do m=1,mmax
           write(numdossier,"(i2.2)")m
         do n=1,nmax
               write(numfichier,"(i6.6)")n
    !             fichier="a_"//numdossier//"/maps"//numfichier
                    open(10, file="a_"//numdossier//"/maps"//numfichier,status="old",action="read",err=50)
                        do j = 1,nlign
                           read(10,*) l1(j),l2(j),so
                              l3(j) = l3(j)+so
                        end do
                           close(10)
          end do
      end do
     
    ! output writing
       do n=1,nmax
             write(numfichier,"(i6.6)")n
             open(20, file="map_stack"//"/maps"//numfichier,action="write",status="new")
                   do k = 1,nlign
                        write(20,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/mmax
                   end do
      end do
     close(20)
     
    ! Deallocations
    deallocate(l1,l2,l3)
     
    stop
    50 write(*,*) "Problem with maps_file opening"
     
    end program stack_map

    Merci par avance !

    Chip.


    Citation Envoyé par Ladgalen Voir le message
    Salut

    Quand tu met du code dans un message, utilise les balises code de l'éditer (le #) ça facilite la lecture.

    Sinon je te conseille de lire ce post

    Ce dont tu as besoin est de savoir concaténer des chaines caratères = construire une chaine de caratère à partir de plusieurs.

    Pour cela il suffit d'utiliser //

    Voici un bout de code pour te balader dans tes dossiers :

    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
     
    Do m=1,mmax    ! boucle sur les dossiers
      write(numdossier,"(i2.2)")m   ! i2.2 ça écrit 01 au lieu de 1
      Do n=1,nmax   ! boucle sur les fichiers
        write(numfichierr,"(i2.2)")n
     
        ! le nom du fichier     
        fichier = "a_"//numdossier//"/map_"//numfichier
     
        ! avec n=2 et m=3 tu devrais avoir fichier="a_03/map_02"
     
     
        open(10, file=fichier,action="read")
     
        ! tu fais ce que tu veux avec
     
      Enddo
    Enddo
    Dans mon code numfichier et numdossier sont des chaines de caractères. Selon ce que tu veux faire l'ordre des boucles n'est pas le meilleur mais ça te montre comment passer d'un fichier/dossier à l'autre.

  4. #4
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Là comme ça je vois pas, est ce que tu peux donner ton message d'erreur ?

    C'est à la compilation ou à l'exécution ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut C'est à l'exécution.
    Salut,

    Le message erreur est: Problem with maps_file opening
    C'est à l'exécution.


    Je ne sais pas comment faire ?

    Merci de ton aide

    Chip.

  6. #6
    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
    Un premier problème est que les variables caractères dans lesquelles tu écris les numéros ont 10 caractères de long alors que les séquences écrites n'ont que 2 ou 6 caractères. Les séquences sont donc complétées par des espaces pour faire 10. Les solutions sont :
    • Racourcir la définition des variables à 2 et 6 caractères
    • Utiliser trim() lors de la concaténation

    Pour faciliter ta recherche d'erreur, enlève temporairement le err=50 dans le open. Lorsqu'une erreur se produira, le programme affichera un message d'erreur beaucoup plus informatif que «Problem with maps_file opening». L'autre possibilité : ajoute un « iostat=UneVariableEntiereQuelconque » dans le open et à l'erreur, ajoute le nom du fichier que tu essaies d'ouvrir et la variable contenant le numéro d'erreur retourné par iostat.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Merci de m'avoir repondu.
    J'ai réécrit mon code selon les renseignements de Sylvain Bergeron.

    Il y a des messages d'erreur :
    forrtl: severe (66): output statement overflows record, unit -5, file Internal Formatted Write
    Image PC Routine Line Source
    stack_maps000000 08098F63 Unknown Unknown Unknown
    stack_maps000000 08098583 Unknown Unknown Unknown
    stack_maps000000 0806BD8E Unknown Unknown Unknown
    stack_maps000000 0804C042 Unknown Unknown Unknown
    stack_maps000000 0804BCDD Unknown Unknown Unknown
    stack_maps000000 0805BB3A Unknown Unknown Unknown
    stack_maps000000 0805A2D1 Unknown Unknown Unknown
    stack_maps000000 08049FC1 Unknown Unknown Unknown
    stack_maps000000 08049B61 Unknown Unknown Unknown
    libc.so.6 4005B450 Unknown Unknown Unknown
    stack_maps000000 08049AC1 Unknown Unknown Unknown
    Est-ce qu'il y a quelqu'un qui sait résoudre ce problème ?

    Merci de votre aide,

    Chip

    Voici le code :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    program stack_map
      implicit none
     
    ! Declaration
      character(len=4)      :: map="maps"
      character(len=2)     :: nd,nf
      character(len=2)      :: Fa="a_"
      character(len=9)      :: map_sorti="map_stack"
      integer               :: i,j,k,nmax,mmax,ncol,nlign, n, m
      real, allocatable     :: l1(:),l2(:),l3(:)
      real                  :: so,tr
     
     
    mmax=2
    ncol = 3
    nmax = 97
     
    ! arrays' size with the first file
     nlign = 0
    open(10,file="a_01"//"/maps000075",status="old",action="read")  
     do
       read(10,*,end=40) tr,tr,tr
       nlign = nlign+1
      end do
    40  close(10)
    write(*,*) nlign," lines read"
     
    ! allocation
     allocate(l1(nlign),l2(nlign),l3(nlign))
     l3 = 0d0
     
    !! boucle
     
      Do m=1,mmax
           write(nd,"(i2.2)")m
         do n=1,nmax
               write(nf,"(i6.6)")n
                    open(10, file="a_"//nd//"/maps"//nf,status="old",action="read")   
                        do j = 1,nlign
                           read(10,*) l1(j),l2(j),so
                              l3(j) = l3(j)+so
                        end do
                         print*,"valeur of L3",l3
                           close(10)
          end do
      end do
     
    ! output writing
     
     do n=1,nmax
       write(nf,"(i6.6)")n
       open(20, file="map_stack"//"/maps"//nf,action="write",status="new")
       do k = 1,nlign
          write(20,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/mmax
       end do
     end do
     close(20)
     
    ! Deallocations
    deallocate(l1,l2,l3)
     
    end program stack_map

  8. #8
    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
    Message pertinent:
    output statement overflows record, unit -5, file Internal Formatted Write
    Dans ton programme, « nf » est déclaré 2 caractères, mais tu essaies d'y écrire 6 caractères (write(nf,"(i6.6)")n), d'où l'overflow...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Oui, c'est ma faute. Excuse-moi.

    J'ai corrigé nf, il y a toujours des messages d'erreur. Je pense que j'ai mal écrit au niveau écriture des fichiers sorties
    Je veux créer un répertoire (map_stack) dans le quel je vais mettre tous les mapsi (i=1,nmax).

    Peux-tu me dire comment je dois faire pour les corriger ?

    Merci de ton aide.

    Chip

    Voici le message d'erreur :
    forrtl: No such file or directory
    forrtl: severe (29): file not found, unit 20, file /data2/test/map_stack/maps000001
    Image PC Routine Line Source
    stack_maps000000 08098EFB Unknown Unknown Unknown
    stack_maps000000 0809851B Unknown Unknown Unknown
    stack_maps000000 0806BD26 Unknown Unknown Unknown
    stack_maps000000 0804BFDA Unknown Unknown Unknown
    stack_maps000000 0804BC75 Unknown Unknown Unknown
    stack_maps000000 080520C9 Unknown Unknown Unknown
    stack_maps000000 0804A2D2 Unknown Unknown Unknown
    stack_maps000000 08049B61 Unknown Unknown Unknown
    libc.so.6 4005B450 Unknown Unknown Unknown
    stack_maps000000 08049AC1 Unknown Unknown Unknow
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    program stack_map
      implicit none
     
    ! Declaration
      character(len=4)      :: map="maps"
      character(len=2)     :: nd
      character(len=6)     :: nf
      character(len=2)      :: Fa="a_"
      character(len=9)      :: map_sorti="map_stack"
      integer               :: i,j,k,nmax,mmax,ncol,nlign, n, m
      real, allocatable     :: l1(:),l2(:),l3(:)
      real                  :: so,tr
     
     
    mmax=2
    ncol = 3
    nmax = 97
     
    ! arrays' size with the first file
     nlign = 0
    open(10,file="a_01"//"/maps000075",status="old",action="read")  
     do
       read(10,*,end=40) tr,tr,tr
       nlign = nlign+1
      end do
    40  close(10)
    write(*,*) nlign," lines read"
     
    ! allocation
     allocate(l1(nlign),l2(nlign),l3(nlign))
     l3 = 0d0
     
    !! boucle
     
      Do m=1,mmax
           write(nd,"(i2.2)")m
         do n=1,nmax
               write(nf,"(i6.6)")n
                    open(10, file="a_"//nd//"/maps"//nf,status="old",action="read")   
                        do j = 1,nlign
                           read(10,*) l1(j),l2(j),so
                              l3(j) = l3(j)+so
                        end do
                           close(10)
          end do
      end do
     
    ! output writing
     
     do n=1,nmax
       write(nf,"(i6.6)")n
       open(20, file="map_stack"//"/maps"//nf,action="write",status="new")
       do k = 1,nlign
          write(20,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/mmax
       end do
     end do
     close(20)
     
    ! Deallocations
    deallocate(l1,l2,l3)
     
    end program stack_map

  10. #10
    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
    Citation Envoyé par chip_2008 Voir le message
    ...
    Je veux creer un repertoire (map_stack) dans le quel je vais mettre tous les mapsi (i=1,nmax).
    ...
    forrtl: No such file or directory
    forrtl: severe (29): file not found, unit 20, file /data2/test/map_stack/maps000001...
    Le problème est que le open ne permet pas la création du répertoire. Il permet uniquement de créer des fichiers.

    Fortran ne permet pas directement de créer des répertoires, le concept de répertoire n'existe même pas en Fortran. Les solutions sont :
    • Exécuter une instruction «md» via un call system() ou autre fonction/routine du genre.
    • Voir la librairie du compilateur si une autre fonction propriétaire permet de créer directement un répertoire.
    • Créer toi-même le répertoire avant de lancer le programme.

    Note : Puisque les 2 premières solutions reposent sur des fonctions / routines propriétaire, elles ne sont pas nécessairement portables.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci Sylvain,


    J'ai cree un repertoire, ca marche a l'execution.

    J'ai encore des problemes en calculant moyene de troisieme colones de meme fichier dans des repertoire different. J'ai verifier resultat. c'est pas vrai.


    Est-ce que c'est bien comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      Do m=1,mmax
           write(nd,"(i2.2)")m
         do n=1,nmax
               write(nf,"(i6.6)")n
                    open(10, file="a_"//nd//"/maps"//nf,status="old",action="read")   
                        do j = 1,nlign
                           read(10,*) l1(j),l2(j),so
                              l3(j) = l3(j)+so
                        end do
                           close(10)
          end do
      end do
    Un grand merci a vous


    Chip.

  12. #12
    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,

    Dans ce que tu donnes dans ton message ci-dessus, les l3(j) contiendront, une fois les boucles terminées, les sommes des éléments de la jème ligne des 3èmes colonnes des nmax*mmax fichiers.

    Cependant d'après cet autre bout de cod que tu donnes plus haut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ! output writing
     
     do n=1,nmax
       write(nf,"(i6.6)")n
       open(20, file="map_stack"//"/maps"//nf,action="write",status="new")
       do k = 1,nlign
          write(20,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/mmax
       end do
     end do
     close(20)
    C'est la quantité l3(k)/mmax que tu écris dans ton fichier.
    Si tu veux la moyenne, c'est l3(k)/(mmax*nmax) qu'il faut calculer.

    A moins que je n'ai pas compris de quelle moyenne tu parles...

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci Ehouarn de m'avoir repondu.

    Je vais expliquer la moyenne que je voulais calculer:
    J'ai deux repertoires: a_01, a_02 dans les quelles il y ont des fichiers : (map_i, i=1,n), exemple: map_01

    a_01/map_01
    a_01/map_02
    a_01/map_03

    a_02/map_01
    a_02/map_02
    a_02/map_03

    Chaque fichier map_1 ont 3 colones et nl linge (nl = 1000 par exemple)
    Je voudrai calculer la moyene de troisieme colone du fichier map_i comme :

    ici j'ai choisi : nmax=3, mmax=2
    i=1,n
    map_01 (:,3)= a_01/map_01(:,3) + a_02/map_01(:,3)/mmax
    map_02 (:,3)= a_01/map_02(:,3) + a_02/map_02(:,3)/mmax
    map_03(:,3) = a_01/map_03(:,3) + a_02/map_03(:,3)/mmax

    Et puis je vais mettre des fichier map_i dans un nouveau repertoire que j'ai creer.

    J'ai quand meme diviser par /(nmax*mmax) mais ce ne donne pas un bon resultat.

    J'ai cherche des erreurs. Malheuresement, je n'ai pas trouve.

    Est-ce qu'il y a quel qu'un qui connait ?


    Merci a vous

    Chip

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    J'ai mal écrit la moyenne dans les messages précédents :
    la moyenne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    map_01 (:,3)= ( a_01/map_01(:,3) + a_02/map_01(:,3))/mmax
    map_02 (:,3)= (a_01/map_02(:,3) + a_02/map_02(:,3))/mmax
    map_03(:,3) = (a_01/map_03(:,3) + a_02/map_03(:,3))/mmax

  15. #15
    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
    D'accord, mais si tu veux faire la moyenne des fichiers de même nom il faut que tu modifie ta façon de faire, en particulier pour ne calculer la somme des l3(j) que lorsque tu boucles sur les fichiers de même nom.
    Ce qui donnerait 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
    18
    19
    20
    21
    22
     
    do n=1,nmax ! boucle sur les fichiers
      write(nf,"(i6.6)")n
      l3(:)=0. ! mise à zéro des l3()
      do m=1,mmax ! boucle sur les dossiers
        write(nd,"(i2.2)")m
        open(10, file="a_"//nd//"/maps"//nf,status="old",action="read")
        ! lecture des données:
        do j=1,nblign
          read(10,*) l1(j),l2(j),so
          l3(j) = l3(j)+so
        enddo
        close(10)
      enddo
      ! arrivé ici, on a cumulé les l3(:) sur les dossiers, pour un même nom de fichier, on peut écrire la moyenne correspondante
      write(nf,"(i6.6)")n
      open(20, file="map_stack"//"/maps"//nf,action="write",status="new")
      do k = 1,nlign
        write(20,"(e14.7,1x,e14.7,1x,e14.7)") l1(k),l2(k),l3(k)/mmax
      enddo
      close(20)
    enddo
    Remarque qu'au passage les l1() et l2() qui sont écrits sont les derniers qui ont été lus (ce qui était déjà le cas dans l'exemple de code que tu donnais).

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Merci a tous
    Salut,


    Enfin, Ca marche, Je vous remercie au plus fond du ceurs. J'ai apris des choses graces a votre aide.

    Je vous shouhaite un excelent week-end.

    Chip

    ps: Est-ce qu'on peut ecrire un script ou un code pour resoudre ce probleme par autre langage ou d'autre outile ?


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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2010, 19h54
  2. Problème d'entrée sortie
    Par Ququbs dans le forum Composants
    Réponses: 3
    Dernier message: 16/07/2010, 23h24
  3. Problème d'entrée sortie
    Par judas54 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 16/02/2008, 10h34
  4. Problème d'Entrée / Sortie
    Par Stevens.Georges dans le forum Langage
    Réponses: 8
    Dernier message: 08/01/2008, 14h28
  5. Réponses: 11
    Dernier message: 13/10/2004, 00h58

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