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 :

[Fortran 77] Problème incrémentation nom_fichier


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut [Fortran 77] Problème incrémentation nom_fichier
    bonjour,

    Je travaille sur un programme fortran ou je cherche a faire ce qui suit:

    Pour l'instant mon programme me crée et écrit dans un fichier appelé 'contrainte', mais je désire en fait qu'il me crée x fichiers (un tous les 1000 pas) avec mes resultats a l'interieur biensur (pour des faciliter l'exploitation car les fichiers sont tellement gros que quand je les ouvre avec Excel il n'arrive pas à prendre en considération toutes les données or si je divise ce fichier en plusieurs petits fichiers de taille correcte, le problème ne se posera plus). Le seul soucis , c'est que je n'arrive pas a changer le nom du fichier a chaque fois que ma boucle do..enddo implemente de 1000 pas. Je desirerai avoir x fichiers texte du type 'contrainte1', 'contrainte2, 'contrainte3' etc... mais je ne sais absolument pas comment faire incrementer le numero dans le nom du fichier avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         OPEN(br3,file='/tmp/mon_non/RESULTATS/contrainte',
         &     form='formatted',access='APPEND')
             WRITE(br3,1200) temps,contrainte
    Si quelqu'un a une piste à me donner, merci de me répondre. Débutant sur Fortran

    Merci d'avance

  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
    Bonsoir,

    Le principe est de créer un caractère (ou une chaine en fonction de la taille de la borne supérieure de la boucle) puis de concaténer avec le nom.
    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    character (len = 3) :: ext   ! 3 ou plus selon la taille    
    character (len = 36) :: nom_fichier 
     
    if (mod(boucle,1000) == 0) then
       write (ext,'(i1)') boucle / 1000
       nom_fichier = "/tmp/mon_non/RESULTATS/contrainte" // ext
    Ca te renvoie les noms :
    /tmp/mon_non/RESULTATS/contrainte1
    /tmp/mon_non/RESULTATS/contrainte2
    /tmp/mon_non/RESULTATS/contrainte3
    /tmp/mon_non/RESULTATS/contrainte4
    /tmp/mon_non/RESULTATS/contrainte5
    /tmp/mon_non/RESULTATS/contrainte6
    /tmp/mon_non/RESULTATS/contrainte7
    /tmp/mon_non/RESULTATS/contrainte8
    /tmp/mon_non/RESULTATS/contrainte9
    Il faut remplacer le format '(i1)' par '(i2)' pour continuer de 10 à 99, ...

    Ne pas oublier de fermer le fichier précédent avant d'en ouvrir un nouveau

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

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Il faut que tu définisses une variable texte par exemple num et je vais supposer que tu auras au max 999 fichiers. En fait quand tu ouvres ton nouveau fichiers constante tu ouvre "constante"//num ce qui rajoute le numéro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    character(len=3)::num
    Dans ta boucle tu fais ça :

    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
     
    ifichier=0
    Do i=1,total
        If( mod(i,1000) == 0 ) Then   ! tous les 1000 pas
            ifichier = ifichier + 1
            write(num,"(i3.3)")ifichier  ! j'écris le numéro dans un string
                                              ! i3.3 permet d'écrire 002 au lieu de 2
            close(br3)   ! je ferme ton contrainte précédent
            open(br3,file="...../contrainte"//num)
                 ! si ifichier =2 alors ton nouveau fichier ouvert est 
                 ! contrainte002
        Endif
     
        ..... suite de ton programme
     
    Enddo
    le coup de mettre 002 au lieu de 2 c'est vachement pratique pour éviter les blancs dans les noms de fichiers !

  4. #4
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Grame et Ladgalen je vous remercie pour vos réponses.

    Je vais essayer d'explorer les pistes que vous venez de me donner et je vous tiens au courant du résulat.

    Encore merci à vous.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Bonjour,

    J'ai testé votre proposition, voici une partie du programme:

    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
     
     
    % déclaration
    INTEGER*4 br,br1,br2,br3,ipas,npas
    CHARACTER (len=3)::ext
    call pickname(scontac,1,'NPAS    ',npas)
    call numcompo(scontac,'IPAS    ',scontac_ipas)
     
    % déclaration
    ifichier=1
    % Corps du programme
              do i=1,npas
              call picknum(scontac,1,scontac_ipas,ipas)
               if(mod(ipas,10).EQ.0.d+0)then
               ifichier=ifichier+1
               write(ext,"(i3.3)")ifichier
               close(br3)
           OPEN(br3,file="/tmp/moi/RESULTAT/COCO/essai"//ext,
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
               endif
               enddo
    Le nombre de pas est très élevé (npas=90M défois).

    Quand je compile pas de problème, je lance le calcul, quand le nombre de pas ipas=10 (pour le test je sauvegarde tous les 10 pas), il me crée 999 fichiers du type essai***, essai002, essai003.... au lieu de un fichier (essai001) puisque je n'ai pas encore dépasser ipas=10. Parmi les 999 fichiers, le premier contient beaucoup de données (ensemble du calcul jusque ipas=10) et les autres contiennent une ligne de données, quand il arrive à ipas=20 il écrit à la deuxième ligne des fichiers essai002......

    Avez-vous une explication à ce problème?

    Merci d'avance.

  6. #6
    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
    Avez-vous une explication à ce problème?
    Ben, c'est normal, il fait ce que tu lui demandes.

    Il faut mettre ton "end if" AVANT le WRITE

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

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    C'est normal que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WRITE(br3,13000) temps,nc,rayon,sigtra
    soit dans la boucle IF/ENDIF ? Comme je le vois là, tous les 10 pas il crée un nouveau fichier et il écrit temps,nc,rayon et sigtra dedans. Mais comme ton write est entre ton If et endif il n'écrit jamais plus dans ton fichier !

    Je sais pas si c'est très clair ce que j'ai dis mais je pense que le problème vient du fait que le write est entre IF et Endif


    Autre chose :

    Mod (integer1, integer2) renvoie un entier qui est le reste de la division de integer1 par integer2. Tu as donc de la chance que

    mod(ipas,10).EQ.0.d+0 soit vrai de tous les 10 pas. Dis merci à ton comilateur. De manière générale évite de faire un test en demandant si un réel est égal à un autre réel, à cause de la précision c'est en fait jamais vrai.

    La bonne syntaxe est mod(ipas,10).EQ.0 !!! l'entier 0!

  8. #8
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Bonsoir,

    merci pour vos réponses, vos remarques et vos sugestions mais aussi merci à mon compilateur.

    demain je vais essayer de mettre le "end if" avant le write.

    Je n'ai toujours pas compris l'histoire de 999 fichiers.

    Pour l'instant j'ai fait quelque chose du genre:
    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
     
    % déclaration
    INTEGER*4 br,br1,br2,br3,ipas,npas
     
    call numcompo(scontac,'IPAS    ',scontac_ipas)
    call picknum(scontac,1,scontac_ipas,ipas)
     
      if(ipas.le.1000)then
           OPEN(br3,file='tmp/mon_nom/RESULTAT/COCO/essai_01'
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
      endif
     
       if((ipas.gt.1000).and.(ipas.le.3000))then
           OPEN(br3,file='tmp/mon_nom/RESULTAT/COCO/essai_02'
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
      endif
     
      if((ipas.gt.3000).and.(ipas.le.8000))then
           OPEN(br3,file='tmp/mon_nom/RESULTAT/COCO/essai_03'
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
      endif
     
     if((ipas.gt.8000).and.(ipas.le.12000))then
           OPEN(br3,file='tmp/mon_nom/RESULTAT/COCO/essai_04'
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
      endif
     
    ....................
     
    % Et le dernier fichier
     
     if((ipas.gt.800000)then
           OPEN(br3,file='tmp/mon_nom/RESULTAT/COCO/essai_06'
         &     form='formatted',access='APPEND')
           WRITE(br3,13000) temps,nc,rayon,sigtra
      endif
    Pour l'instant je me suis limiter à 6 fichiers, mais ils sont toujours aussi volumineux....Ce n'est pas vraiment de la programmation ce que je fais en ce moment mais bon ça dépanne!!!

    Vous avez compris mon problème,enfin je l'espère! Voilà c'est pas toujours évident de traduire ce qu'on veut en langage informatique (programmation) ni de faire passer le message...

    Merci encore pour votre aide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/03/2007, 10h13
  2. [Fortran 90] Problème de fmt
    Par Nours87 dans le forum Fortran
    Réponses: 16
    Dernier message: 12/01/2006, 19h29
  3. Problème : incrémentation !! perl a fumé ?
    Par Ickou dans le forum Langage
    Réponses: 11
    Dernier message: 30/11/2005, 17h40
  4. Réponses: 8
    Dernier message: 01/06/2005, 09h45
  5. [Fortran 77] Problème de compilation
    Par Kenji dans le forum Fortran
    Réponses: 26
    Dernier message: 23/05/2005, 16h07

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