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 :

création de fichier indicé


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut création de fichier indicé
    Bonjour ,

    Je souhaiterais savoir si quelqu'un sait comment mettre dans le nom d'un fichier une variable . ( en fait je fait des boucles et j ai besoin d'avoir un fichier différent pour inscrire mes résultats dans ce dernier à chaque tour de boucle).

    Merci d'avance de vos réponses.

  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 : 41
    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
    Bonjour

    Il faut concaténer des chaines de caractères avec l'opération //. Le principal problème dans ces opérations est souvent de ne pas avoir de blancs dans le nom du fichier. Voici un exemple que j'utilise souvant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
      character(len=3)                :: nom
      charcater(len=100)              :: fichiercom
      do i = 1, nc
     
        ...
     
        write(nom, "(i3.3)") i
        fichiercom = "direction_C_"//nom//".com"
     
        ...
     
      end do
    Le i3.3 c'est pour écrire 001 au lieu de ^^1. Si tu veux vraiment un chifre il faut faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichiercom = "direction_C_"//trim(adjustl(nom))//".com"
    adjustl place les caractères à gauche (adjust left) et trim supprime les blancs à droite.

    Bon courage

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

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

    Je souhaiterais savoir si quelqu'un sait comment mettre dans le nom d'un fichier une variable . ( en fait je fait des boucles et j ai besoin d'avoir un fichier différent pour inscrire mes résultats dans ce dernier à chaque tour de boucle).

    Merci d'avance de vos réponses.
    Oui, tu utilises un format interne i1 ou i2 ou plus, selon le nombre de boucles.
    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
     
    integer :: i
    character (len = 6) :: nom
     
    nom = 'data.'
     
    do i = 1, 9
      write (nom(6:6), '(i1)') i
      write (*,*) nom  
    end do
     
    end
    qui te renvoie

    data.1
    data.2
    data.3
    data.4
    data.5
    data.6
    data.7
    data.8
    data.9

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut merci de vos réponse
    Bonsoir,

    Tout d'abord je souhaite vous remercier pour vos réponse. En fait j'ai essayé vos deux méthode et je n'arrive pas à voir si/ou mes fichiers sont créés car j'en ai besoin à la sorti de mon programme pour tracer des graphiques. Je pensais plutot faire comme ce que j ai écrit ci dessous mais je n'arrive pas à mettre un indice et donc j ai mes valeurs qui s'écrivent dans un seul fichier les unes à la suite, des autres .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    CHARACTER(len = 32)  :: FILE_NAME
    ...
    DO WHILE(t<=tmax)
    DO j=1, n
    	'FILE_NAME' = 'pol',j,'.out'  !et ici j'ai une erreur de compilation si je  laisse le j
            ...
           OPEN(UNIT=50,FILE= FILE_NAME,STATUS='UNKNOWN')
    	WRITE(50,*) a(j), b(j), j
    END DO
    END DO

  5. #5
    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 : 41
    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
    Bonjour

    Dans cette ligne tu as plusieurs erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'FILE_NAME' = 'pol',j,'.out'
    Attention chaine de caractère

    Première erreur au début de la ligne :

    Je pense que le compilateur doit te dire qu'il y a une erreur

    'FILE_NAME' entre ' ' c'est une chaine de caractères donc ce n'est pas une variable. En gros ce que tu mes entre ' ' c'est vraiment le mot écrit tel quel. En programmation = veut dire attribue ou reçoit. Donc ta ligne veux dire :

    La chaine de caractères 'FILE_NAME' reçoit quelque chose. Or une chaîne de caractère n'est pas une variable dans laquelle tu peux stoquer quelque chose.

    En ce qui concerne j

    j est un entier alors que FILE_NAME est une chaine de caractère. Il faut donc convertir j en caractère pour que ça marche. C'est pour ça que tu as une erreur. Grame et moi on fait ça de deux manière différente.

    La méthode de Grame

    Une chaine de caractère c'est en fait un tableau de caractère. Toi tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHARACTER(len = 32)  :: FILE_NAME
    C'est un peu comme si FILE_NAME était un tableau de 32 cases dans lesquelles tu peux mettre une lettre à chaque fois. Donc tu peux choisir d'écrire un chiffre dans la dernière case. C'est ce que fait Grame. La dernière case est repérée par

    FILE_NAME(32:32)

    en fait la notation FILE_NAME(a:b) ça veut dire que tu prends un morceaux de la chaine (une sous chaine) qui va de a à b.

    Pour écrire dans une chaine tu fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    write( FILE_NAME(32:32),"(i1)") j
    ! n'oublie pas la syntaxe d'un write :
    ! write(   où     ,    comment ) ...
    ma méthode

    Moi je fait une concaténation de chaine, c'est à dire je regroupe plusieurs chaines. Je commence par écrire dans une chaine la valeur de j :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    character(len=3)                :: nom
    write(nom, "(i3.3)") i
    Puis ensuite je crée la chaine FILE_NAME à partir de trois bouts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILE_NAME = "debut"//nom//"fin"
    Tu remarque que debut et fin sont des chaines de caractères donc mon fichier va s'appeler debut001fin. Tu noteras aussi les // pour concaténer les chaines, les coller ou les rassembler si tu préfères.

    Tu pourrais très bien avoir deux chaines :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    prefixe = "debut_"
    FILE_NAME = prefixe//nom
    Là j'ai une chaine prefixe qui contient "debut_" à laquelle je colle le numéro, ce qui donne debut_001

    les blancs

    Le problème dans ce genre de chose c'est les blancs car les fichiers avec des blancs dans un terminal c'est un peu galère. Donc il faut les éviter. Pour ça tu as deux possiblités :

    Soit tu utilises un format du genre IN.P comme i3.3, ça veut dire que tu écris ton entier sur 3 colonnes avec 3 chiffres donc tu completes par des zéro. Au lieu d'écrire 1 tu écris 001 au lieu de 12 tu écris 012 ect ... Si tu vas au max jusqu'à 999 tu sais que tu dois écrire ton chiffre dans une chaine de longueur 3 et tu n'auras pas de blancs.

    Autre solution les fonctions trim et adjustl. La première supprime les blancs en fin de chaine de caractères, la seconde aligne à gauche (l pour left) la chaine de caractères. Donc si tu as

    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
     
    character(len=10) :: mot
     
    mot = "bonjour"
     
    write(*,*) bonjour
    ! => ça va donner "bonjour    " avec des blancs au fond
     
    write(*,*) trim(bonjour)
    ! => ça va donner "bonjour" sans les blancs au fond
     
    ! attention action inutile :
    mot = trim(bonjour)
    ! mot à une longueur de 10 donc quand tu met bonjour dans mot il complete avec des blancs
     
    write( mot, "(i10)") 2
    write(*,*) mot
    ! => ça va donner "         2" avec des blancs devant, c'est le format i10 
     
    write( mot, "(i10)") 2
    mot = adjustl(mot)
    write(*,*) mot
    ! => ça va donner "2          " avec des blancs après pour compléter
     
    write( mot, "(i10)") 2
    mot = adjustl(mot)
    write(*,*) trim(mot)
    ! => ça va donner "2" c'est ce qu'on veut
    Du coup tu dois pouvoir comprendre ma ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichiercom = "direction_C_"//trim(adjustl(nom))//".com"
    Là je suis sur que je n'ai pas de blanc !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut fichier indicé toujours
    Bonjour,

    En fait j'ai travaillé cette nuit sur mon programme , je n'ai donc vu que ce matin votre réponse, et j'ai avancé un peu (peut être pas dans le bon sens) entre temps. J' ai bien compris les explications que vous m'avez fournis et la syntaxe adéquat, par contre je ne comprend toujours pas comment faire pour avoir ces fichiers en sortie à la fin de mon programme. Je vais donc vous montrer ce que j'ai écrit.( nb: cela vas peut être vous faire rire car le langage fortran et on peut même dire la programmation étant quelque chose de nouveau pour moi, j'essaye de me débrouiller avec le peu que je sache.... lol)
    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
     
    PROGRAM
    IMPLICITE NONE
    .....
     
    character(len= 6)  :: nom
     
    nom = 'data.'
    u=0.0d0
    ....
    DO j=1, n                                    !je fais ça ici pour initialiser mes fichiers de sortie ou cas ou il n'existerais pas encore
    	write (nom(6:6), '(i1)') j
    	write (*,*) nom	
    	OPEN(UNIT=50,FILE= nom ,STATUS='unknown')
    	close(50)
    end do
    ...
    DO WHILE(t<=tmax)
    u=u+1.0d0
    DO j=1, n
    ...
    write (nom(6:6), '(i1)') j                       !je fais ça ici pour contourner le fait ke j est une variable et que je ne peut pas la mettre dans une chaine de cractere
    	write (*,*) nom
    OPEN(UNIT=50,FILE= nom ,STATUS='old')
    	WRITE(50,*) x(u), y(u), j
     
    	close(50)
    END DO
    t=t+h
    END DO
    Avec ce programme, j'ai bien en sortie mes fichiers data.j , mais le soucis est que je voudrais avoir en fait x(u) et y(u) qui s'écrivent dans le fichier data.j
    pour chaque u donné les uns à la suite des autres alors que j'ai l'impression qu'a chaque tour de boucle ('DO WHILE(t<=tmax)') les x(u) et y(u) sont réécris par dessus les x(u-1) et y(u-1). Je n'ai donc au finale dans mes fichiers data.j que les derniers x(u) et y(u) calculés qui s'écrivent. Donc voila je ne sais quoi en penser .Merci d'avance de vos réponse.

  7. #7
    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 : 41
    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
    Je pense que le problème vient du status="old" dans le open de ton fichier. Si tu fais ça je crois me souvenir que tu lui dis que le fichier existe, mais tu l'écrase à l'ouverture. Donc tu ne devrais avoir que la dernière valeur écrite dans ton fichier !

    La solution c'est de faire un position="append"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    open(10, file="monfichier", position="append")
    ! tu écris à la fin du fichier sans l'ecraser.
    write(10,*) x(u), y(u), j
    Si tu n'as que quelques fichiers tu peux aussi tous les ouvrir avant ta boucle et tous les fermer après ... Si tes calculs sont long et les fichiers sont gros tu risques de passer beaucoup de temps à ouvrir et fermer tes fichiers en faisant comme tu le fait. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ! ouverture
    do j=1,n
      write(nom,"(i6)") j
      open(10+j, file="data."//trim(adjustl(nom)) )
    end do
     
    ! calcul
      write(10+j,*) x(u), y(u), j
     
    ! fermeture
    do j=1,n
      close(10+j)
    end do
    Pour ce qui est de la numérotation des fichiers, fait attention que ce que tu as fait ne fonctionne que si n est inférieur ou égal à 9 ! Si n >= 10 alors il te faut deux colonnes pour écrire le nombre au lieu d'une seule. Je te conseille d'essayer d'adapter à ton cas la méthode en concaténant les chaines qui est plus souples je trouve (et puis c'est la mienne donc elle est forcément mieux je plaisante la meilleure est celle qu'on sait faire !)

    Si tu débutes, je te conseille aussi d'aller voir du coté de la FAQ fortran tu trouveras peut être des réponses ou des conseils rapides pour commencer.

    http://fortran.developpez.com/faq/

    Si tu as plus de temps je te conseille vivement les cours de l'idris

    https://cours.idris.fr/

    ou celui là qui n'est pas mal aussi :

    http://www.obs.u-bordeaux1.fr/radio/...95CMichaut.pdf

    tu en trouveras d'autre, notament sur la page FORTRAN de développez.com

    bon courage

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut fichier indicer solution
    Merci de votre réponse j'ai changer le statuts en 'append' et sa marche parfaitement, de plus j'ai choisi votre solution pour la création des fichiers, effectivement je pourrais être amener à avoir en sorti plus de 10 fichiers.

    Merci encore de l'aide que vous m'avez apporté.

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

Discussions similaires

  1. création de fichiers dans le disque dur
    Par sex-sansbol dans le forum ASP
    Réponses: 6
    Dernier message: 24/08/2004, 09h39
  2. Création de fichiers CAB
    Par Polux63 dans le forum Windows
    Réponses: 5
    Dernier message: 22/08/2004, 10h50
  3. Création de fichier
    Par gsxr man dans le forum ASP
    Réponses: 2
    Dernier message: 28/06/2004, 22h19
  4. Réponses: 8
    Dernier message: 03/09/2003, 00h47
  5. création de fichiers .x
    Par Pazz dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h33

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