Gestion de fichiers en fortran 90/77

Résolu
Irene_Adler Messages postés 129 Date d'inscription   Statut Membre Dernière intervention   -  
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   -
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!!!!!!
A voir également:

5 réponses

cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
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   Statut Membre Dernière intervention   18
 
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   Statut Membre Dernière intervention   131 > Irene_Adler Messages postés 129 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   18 > cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention  
 
Merci, je vais essayer...
0
Irene_Adler Messages postés 129 Date d'inscription   Statut Membre Dernière intervention   18 > cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   131 > Irene_Adler Messages postés 129 Date d'inscription   Statut Membre Dernière intervention  
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention   18
 
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   Statut Membre Dernière intervention   18
 
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   Statut Membre Dernière intervention   18
 
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   Statut Membre Dernière intervention   131
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
peut être n'aime til pas le *20...
-1
Irene_Adler Messages postés 129 Date d'inscription   Statut Membre Dernière intervention   18
 
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