Gestion de fichiers en fortran 90/77

Résolu/Fermé
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 - 26 juin 2008 à 23:54
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 1 juil. 2008 à 17:33
Bonjour à tous!
Voila, Je travaille sur un programme en fortran 77 (c'est vieux comme le monde!) et
je voudrais creer un fichier FORMATÉ qui va m'afficher les resultats de mes calculs.
Seulement, il faut que je l'ouvre et le ferme plusieurs fois et je ne sais pas comment faire pour qu'il continue à écrire là où il s'était arreté précédemment...

Merci aux âmes charitables!!!!!!

5 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 130
27 juin 2008 à 22:56
Bonsoir,

Essaie en ajoutant : OPEN (UNIT = 70, .............., STATUS = ....

A titre de comparaison je joins une instruction OPEN qui fonctionne (en Fortran 77):
       OPEN      (UNIT   = DATA_UT_IN,     IOSTAT = IO_RC, 
     S            FILE   = F_NAME_IN,      STATUS = 'OLD',
     S            ACCESS = 'SEQUENTIAL',   FORM   = 'FORMATTED', 
     S            ERR    = 15)



--
Cordialement.

Cchristian.
1
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
30 juin 2008 à 17:00
Bonjour,
Merci de ta réponse,
J'ai essayé avec ton code mais j'ai besoin d'un accès direct et c'est là qu'il trouve un problème .
A titre d'info, J'ai un compilateur ifort que j'ai téléchargé dans le site de Intel...
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 130 > Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011
30 juin 2008 à 19:20
Voici une séquence qui fonctionne chez moi et qui met en oeuvre un fichier à organisation et accès directs.

       IO_ORDRE          = 'INQUIRE_DIR'        
       INQUIRE   (FILE   = F_NAME_DIR,     
     S            OPENED = F_OP,           EXIST  = F_EX,
     S            DIRECT = F_DIR,          ERR    = 15 ) 


       IF        ( F_DIR .eq. 'YES' )      THEN
          PRINT 700,   F_NAME_DIR, F_DIR, 'peut donc ' 
       ELSE
          PRINT 700,   F_NAME_DIR, F_DIR, 'NE PEUT PAS' 
          GO TO 150            
       END IF                               

C      Ouverture en accès direct du fichier F_NAME_DIR.
       IO_ORDRE          = 'OPEN_DIR'        
       OPEN      (UNIT   = DATA_UT_DIR,    IOSTAT = IO_RC, 
     S            FILE   = F_NAME_DIR,     STATUS = 'OLD',
     S            ACCESS = 'DIRECT',       FORM   = 'FORMATTED',
     S            ERR    = 15,             RECL   = F_SIZE_DIR)

C      ----------------------------------------------------------------
C      Lectures pour affichage console des enreg;F_NAME_DIR AVANT MODIF
C      ----------------------------------------------------------------

       PRINT 1000
       PRINT 1010

       IO_ORDRE          = 'READ_DIR' 
       CPT_ENREG         = 1
       IO_RC             = 0        

       DO WHILE  (IO_RC  ==  0)
           IO_ORDRE      = 'READ_DIR'        
           READ  (UNIT   = DATA_UT_DIR,    IOSTAT = IO_RC,
     S	          FMT    = 500,            REC    = CPT_ENREG, 
     S            ERR    = 15)
     S            LINE  

          IF     (IO_RC    .eq.    -1)     THEN
             PRINT   1010
             PRINT *,F_NAME_DIR, ': Fin normale de fichier RC : ', 
     S               IO_RC,' SUR ORDRE : ', IO_ORDRE
             PRINT *,F_NAME_DIR, ': Nb. d''enregistrements lus    : ',
     S               CPT_ENREG  - 1      
          ELSE
             PRINT 500,    LINE
             CPT_ENREG   = CPT_ENREG  + 1
          ENDIF                   
       END DO

...........................................
...........................................
      GO TO ..........
       
15     PRINT *,' '
       PRINT *, 'ANOMALIE ENTREE/SORTIE FS : ',    IO_RC, ' SUR ORDRE :'            
     S         ,IO_ORDRE 
      GO TO .....................

150    IO_ORDRE            = 'CLOSE_OUT_DIR'        
       CLOSE     (UNIT     = DATA_UT_OUT,    IOSTAT = IO_RC,
     S              ERR    = 15,             STATUS = 'KEEP')
...............................................
.............................................
100       FORMAT (I3, F10.2, F10.2                                  )
200       FORMAT (1X, (BZ,I3), 2X, (BZ,F10.2), 2X, F10.2, 2X, F10.2 )
300       FORMAT (1X, 'Le resultat de  A (', F6.2, ') + B (', F6.2,   
     S            ') est C = ', F6.2                                )
400       FORMAT (20X, 'TAB2 (', I3, ')', ' = ', I3                 )  
500       FORMAT (A80                                               )
510       FORMAT (I4, A76)
600       FORMAT (//,1X,   'INQUIRE passé sur ',             A13,
     S            ' apres creation des ',                    I4, 
     S            ' enregistrements d''une',              /, 1X, 
     S            ' longueur de:',                           I4,
     S            ' caracteres chacun. Status : OPEN : ',    L1,
     S            ' -- EXISTE : ',                           L1     )
700       FORMAT (//,1X, A10,' status DIRECT : ',            A3,
     S            '. Ce fichier ',                           A13,
     S            ' etre accede en direct')
800       FORMAT (/,1X, A10, ' ne contient pas plus de ',    I4,
     S            ' enregistrements. Entrez une valeur : ',  $      ) 

900       FORMAT (1X, 1I3, 1X, A9, 1I2, 1I2, ' ', 1I5, '-', A8,      
     S             ' dans ',  A13, ' step: ', A15                   )  
910       FORMAT (1X,I3, A9, 1I2, 1I2, ' ', 1I5, '-', A8,      
     S             ' dans ',  A13, ' step: ', A15                   )  
1000      FORMAT (
     S        '0        1         2         3         4         5     ',
     S        '    6         7         8'                           )
1010      FORMAT (
     S        '1---5----0----5----0----5----0----5----0----5----0----5',
     S        '----0----5----0----5----0', /                        )


P.S. Question : Le fichier file='eta_fct_of_time' a bien été créé en tant que fichier à organisation et accés directs ? Ce n'est pas un fichier créé en "séquentiel" que tu tentes d'ouvrir en accés direct.
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18 > cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012
30 juin 2008 à 19:48
Merci, je vais essayer...
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18 > cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012
1 juil. 2008 à 16:34
Je n'ai pas créé le fichier, ne se crée-t-il pas directement avec l'instruction open? faut -il que je rajoute status='new'?
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 130 > Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011
1 juil. 2008 à 17:30
Bonjour,

Si le fichier n'existe pas il faudra la première fois le créer avec NEW :
Ma remarque était en effet mal formulée, elle sous-entend que le fichier est déjà existant créé dans une précédente étape, alors qu'il va être constitué dans le même programme par les instructions :
C      Ouverture en accès direct du fichier F_NAME_DIR.
       IO_ORDRE          = 'OPEN_DIR'        
       OPEN      (UNIT   = DATA_UT_DIR,    IOSTAT = IO_RC, 
     S            FILE   = F_NAME_DIR,     STATUS = 'NEW',
     S            ACCESS = 'DIRECT',       FORM   = 'FORMATTED',
     S            ERR    = 15,             RECL   = F_SIZE_DIR)
       ...................................

 
        ................................
           INTERM             = 1     ! N° relatif d'enregistrement (1 à n)
C      Boucle écritures en accès direct  dans le fichier F_NAME_DIR.
       ....................................
            IO_ORDRE    = 'WRITE_DIR'
             WRITE (UNIT = DATA_UT_DIR,    IOSTAT = IO_RC,
     S              FMT  = 505,            REC    = INTERM,    
     S              ERR  = 15)
     S              .....................,    ..................,

          INTERM             = INTERM             +  1  
          ...........................
         ............................
C     Fin de la boucle 
         ...............................................
0
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 332
27 juin 2008 à 08:44
regarde là
ftp://ftp-developpez.com/fortran/cours/notions-base.pdf
tu devrais trouve facilement.
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
27 juin 2008 à 16:57
Merci pour les cours!
J'ai essayé d'ouvrir un fichier en accès direct mais j'ai toujours le même message d´erreur:

fortcom: Error: funwave2d.f, line 93: Syntax error, found END-OF-STATEMENT when expecting one of: , )
open(70,file='eta_fct_of_time',form='formatted',access='direct',recl=ngage*20)
-----------------------------------------------------------------------------------------------------------------^

voici le bout de code:
open(70,file='eta_fct_of_time',form='formatted',access='direct',recl=ngage*20)
write(70,rec=it,fmt='(100F8.4)')(etn(ixg(k),iyg(k)),k=1,ngage)
close(70)
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
30 juin 2008 à 19:41
Pour les futurs lecteurs de cette discussion:

Un des problèmes rencontré est que le compilateur ne comprend pas les instructions open,write,read,....
quand elles sont en début de ligne,
il faut absolument faire une indentation pour qu'il comprenne.(ne pas écrire dans les colonnes 1 à 5 car c'est la zone pour les étiquettes.)

certains compilateurs marchent comme ca...
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
1 juil. 2008 à 17:17
Merci de votre aide, Je crois que j'ai trouvé l'erreur:

fortcom: Error: funwave2d.f, line 93: Syntax error, found END-OF-STATEMENT when expecting one of: , )
open(70,file='eta_fct_of_time',form='formatted',access='direct',recl=ngage*20)
---------------------------------------------------------------------------------------^


ici, outre le fait que je n'avais pas fait d'identation et qu'une fois sur deux il ne reconnaissait pas l'instruction OPEN,
il fallait:

- faire plusieurs lignes car la ligne d'instruction OPEN était trop longue et il ne la lisait pas en entier


en faisant cela, le programme compile.

REMARQUE: avant de lire un fichier binaire, utiliser la fonction
rewind(UNIT_FILE)

MERCI ENCORE!!!!!!!!!
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 130
1 juil. 2008 à 17:33
Bon courage, merci pour ces infos,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 332
30 juin 2008 à 08:41
peut être n'aime til pas le *20...
-1
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
30 juin 2008 à 16:55
J'ai essayé avec un nombre et j'ai le même message d'erreur.
Les fichiers formattés en accès direct fortran 90 marchent-ils mieux?
0