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 :

Boucle sur write (Creation de plusieurs fichiers)


Sujet :

Fortran

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Boucle sur write (Creation de plusieurs fichiers)
    Bonjour,
    j'ai un petit problème sur les entrées sortie (que je maitrise pas totalement).
    A l'intérieur d'une boucle qui calcul des vecteurs, je voudrais enregistrer le vecteur obtenu dans un fichier, puis lors de la boucle suivante, le nouveau vecteur dans un nouveau fichier jusqu'a n !

    do j=1,10
    f=j
    U(1)=fx
    ********
    Calcul du vecteur en fonction de fx
    x=....
    ********

    do k=1,n
    write(j, fmt=*) k, x(k)
    enddo

    if (x_max>100) exit
    enddo
    Au final, j'obtiens des fichiers fort.1 ... fort.10 avec les composantes du vecteurs comme je veux.
    Néanmoins, je trouve pas ça "très propre" car je controle pas le nom du fichier et surtout je n'ai pas besoin d'utiliser open et close...

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Points : 89
    Points
    89
    Par défaut
    tu peux par exemple, ouvrir toutes tes unités dans premier temps, en donnant un nouveau nom de fichier a chaque fois puis faire ces écritures...et enfin fermer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    do k=1,n
    write(ficname,'(a3,i0)')"fic",n
    open(j, file=ficname)
    end do
     
    do k=1,n
    write(j, fmt=*) k, x(k)
    enddo
     
    do k=1,n
    close(j)
    end do
    je penses que ceci devrait correspondre à ta demande, si je ne me trompes pas.

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par yogitetradim Voir le message
    tu peux par exemple, ouvrir toutes tes unités dans premier temps, en donnant un nouveau nom de fichier a chaque fois puis faire ces écritures...et enfin fermer.
    Il serait plus « joli » de déplacer l'ouverture et la fermeture dans la boucle, donc de n'avoir qu'un fichier ouvert à la fois.

    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
     
    do j=1,10
       f=j
       U(1)=fx
       ...
    !  Calcul du vecteur en fonction de fx
       x = ....
       ...
    !  Ouverture du fichier
       write(NomFichier,'(a,i0,a)')"fic",n,'.txt'
       open(11, file=NomFichier) ! il est inutile d'utiliser un unit variable
     
    !  Ecriture
       do k=1,n
          write(11, fmt=*) k, x(k)
       enddo
     
       close(11)
       if (x_max>100) exit
    enddo

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci Sylvain Bergeron, j'obtiens exactement ce que je voulais. Parfait.

    Juste un chose pour comprendre, on utilises toujours l'unité n°11 mais pourtant plusieurs fichiers sont crées ? Je pensais que le unit=x où x représente un fichier et un seul...

    Autrement, savez vous s'il serait possible d'utiliser gnuplot pour tracer les fichiers obtenu sur une même courbe ?

    Car je fais ensuite call system('gnuplot graph_fx.dat')
    mais dans graph_fx.dat je suis obligé d'ecrire le nom de tout mes fichiers un à un, c'est moyen !
    J'ai vu cette solution
    c = c + 1
    #... some gnuplot commands ...
    if(c<100) reread

    mais ensuite impossible d'appeler mon fichier avec fic'c'.txt

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

    Citation Envoyé par bricksters
    Je pensais que le unit=x où x représente un fichier et un seul...
    C'est vrai mais uniquement durant la durée d'ouverture du fichier (instruction OPEN). A la fin de la boucle, l'instruction CLOSE(11) libère le numéro, tu peux donc le ré-utiliser à l'itération suivante pour ouvrir un autre fichier.

    Citation Envoyé par bricksters
    Autrement, savez vous s'il serait possible d'utiliser gnuplot pour tracer les fichiers obtenu sur une même courbe ?

    Car je fais ensuite call system('gnuplot graph_fx.dat')
    mais dans graph_fx.dat je suis obligé d'ecrire le nom de tout mes fichiers un à un, c'est moyen !
    Je n'ai pas bien compris ce que tu voulais faire. Si tu veux tracer tous tes résultats sur un même graphe à la fin de ta boucle, tu peux créer un fichier "trace.plt" avec les instruction gnuplot :

    Code trace.plt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    plot "fichier_1.txt"
    replot "fichier_2.txt"
    ...

    Puis l'appeler comme tu fais avec call system('gnuplot trace.plt').

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Ok pour la boucle sur le write, je n'y avais pas pensé !

    Justement pour le fichier plot trace.plt, si j'avais beaucoup de fichier, je serais obliger de taper replot "fichier_[1 jusqu'a n].txt", je ne pourrais pas faire une boucle sur le replot ?

    Comme ceci :

    do i=1,n
    replot 'fichier_'i'.txt'
    enddo

    J'éviterai de devoir ecrire une nouvelle ligne pour chaque fichier.

  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,

    Le plus simple serait d'écrire le fichier 'graph_fx.dat' dans ton programme fortran (avant le "call system(gnuplot graph_fx.dat") puisque tu connais dans ce dernier le nombre (et les noms) des fichiers de données à utiliser.

    Au passage, je recommanderai plutôt d'utiliser la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    plot "fichier_1.txt","fichier_2.txt","fichier_3.txt"
    que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    plot "fichier_1.txt"
    replot "fichier_2.txt"
    replot "fichier_3.txt"
    Car dans ce dernier cas, gnuplot fait trois plot: un premier avec fichier_1.txt, qui est immédiatement écrasé par un deuxième avec fichier_1.txt et fichier_2.txt, qui est lui-même écrasé par un troisième plot utilisant les trois fichiers.

  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
    Un (léger) avantage de Fortran sur plusieurs langage est que le délimiteur de chaîne de caractère peut être " ou ', à condition d'utiliser le même aux 2 bouts de la chaîne. Ça évite souvent le recours aux """"...

    Dans ton cas, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       character (1000) Ligne
       ...
       Ligne = 'plot "' // NomFichier(1) // '"'
       do k= 2, n
          Ligne = trim(Ligne) // ',"' // NomFichier(k) // '"'
       enddo
       ...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Ah j'étais en train de retaper mon message !

    Je vais essayer avec ta méthode, merci

  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
    Je ne l'ai pas écrit initialement, mais tu peux combiner les writes dans la construction :

    write(Ligne,'(a,a,i,a)') trim(Ligne), ', "Fic',k,'.txt"'

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/12/2010, 18h33
  2. [Débutant] Boucle avec fopen pour ouvrir plusieurs fichiers
    Par black cat747 dans le forum MATLAB
    Réponses: 7
    Dernier message: 08/12/2010, 15h55
  3. [XL-2003] boucle sur 12 feuille dans un fichier excel
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/06/2010, 06h18
  4. Réponses: 0
    Dernier message: 30/03/2008, 13h02
  5. creation de plusieurs fichiers textes
    Par seignseifer dans le forum C++
    Réponses: 3
    Dernier message: 07/03/2007, 05h52

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