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] Fichier à accès direct


Sujet :

Fortran

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 48
    Points
    48
    Par défaut [Fortran 77] Fichier à accès direct
    Bonjour
    J ai 2 problèmes et j'aimerais bien que l'on m'aide à les résoudre. :
    J'essaie sans succès de travailler avec les fichiers à accès direct en fortran 77
    _ comment ouvrir le fichier et accéder à une valeur précise, ou encore supprimer ou réajouter des valeurs à une position précise du fichier ?
    _ comment faut-il utiliser les fonctions rewind, endfile, backspace ?
    J'essaie sans succès.
    Et aussi comment faire pour lire dans un fichier de taille inconnue les éléments de la n ieme colonne (les valeurs sont données sous forme de tableau(mxn) dans un fichier).
    Vos propositions me seront vraiment utilles.
    [/code]

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Points : 322
    Points
    322
    Par défaut
    Je ne répondrais pas à ta question, car je ne connais pas le fortran. Je poste juste une réponse pour te demander : quel interêt as-tu à programmer en fortran ?
    "Une méthode fixe n'est pas une méthode" (Proverbe chinois)

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: [Fortran 77] Fichier à accès direct
    Citation Envoyé par ERICKO
    _ comment ouvrir le fichier et accéder à une valeur précise, ou encore supprimer ou réajouter des valeurs à une position précise du fichier ?
    Un fichier en direct access s'ouvre ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INTEGER n_unit
    n_unit = 17
    OPEN(unit=n_unit, file='toto.dat', form='unformatted', access='direct', recl=8)
    Dans cet exemple, j'ouvre un fichier nomme toto.dat sur l'unite 17. Ce fichier sera considere comme un fichier binaire avec des 'records' de 8 octets (une longueur qui correspond a un flottant double-precision sur ma machine). Remarque que ce fichier ne pourra pas etre directement lu sur une machine dont l'endianness et/ou la taille des variables est differente de celle de la machine qui a cree le fichier. C'est une grosse limitation des fichiers binaires (solutions: fichiers textes, formats portables type XDR). Mais ils sont souvent necessaire pour des raisons d'espace de stockage.

    Une fois ouvert, on ecrit dedans comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DOUBLE PRECISION var_double
    INTEGER n_rec
    ...
    var_double = 78.98d0
    ...
    n_rec = 1
    ...
    WRITE(17, rec=n_rec) var_double
    Ici, j'ecris au premier record (c'est assez logique). Si je voulais, j'ecrirais au record que je souhaite - les records precedents seraient remplis automatiquement par des valeurs sans signification. Mais c'est inutile dans la pratique. Si le record numero n_rec existe deja, il est ecrase. La fonction READ() est utilisee de la meme facon.

    _ comment faut-il utiliser les fonctions rewind, endfile, backspace ?
    Comme indique dans le standard. Apres avoir ecrit ou lu dans le fichier, la 'tete de lecture' (on peut imaginer cela comme ca) se trouve immediatement apres le record ecrit ou lu.
    REWIND(n_unit) ramene la 'tete de lecture' au debut du fichier.
    BACKSPACE(n_unit) ramene la 'tete de lecture' d'un 'record' vers l'arriere.
    ENDFILE(n_unit) met un indicateur de fin de fichier dans le record en cours. Ce record devient le dernier du fichier (ENDFILE est inutile dans la plupart des cas, sauf si le nombre de records dans le fichier est inconnu et qu'on ne veut pas utiliser iostat).

    Remarque 1: toutes les fonctions ci-dessus acceptent les mots-cle iostat et err pour gerer les erreurs
    Remarque 2: mettre a jour un fichier est tres souvent casse-gueule et se solde par la perte des donnees. En general, on prefere lire record par record dans un fichier, puis ecrire record par record (eventuellement modifie) dans un autre fichier. Ceci evite d'avoir a utiliser REWIND() et BACKSPACE() et d'avoir a se demander ou on se trouve dans le fichier.

    Et aussi comment faire pour lire dans un fichier de taille inconnue les éléments de la n ieme colonne (les valeurs sont données sous forme de tableau(mxn) dans un fichier).
    Si tu ecris ton tableau au debut du fichier, la n-ieme colonne sera le n-ieme record. Dans le cas general, il n'y a pas de miracle : tu dois connaitre le format du fichier binaire que tu lis.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 48
    Points
    48
    Par défaut documment (fortran77)
    salut
    Quel document me conseillez- vous pour mieux programmer en utilissant les fichers avec fortran (77)
    merci

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: documment (fortran77)
    Citation Envoyé par ERICKO
    Quel document me conseillez- vous pour mieux programmer en utilissant les fichers avec fortran (77)
    Il n'y a malheureusement pas de reponse generale. Cela depend beaucoup de l'utilisation que tu fais des fichiers (texte formate ou binaire non-formate). Il y a quelques tutorials interessants sur l'Internet, une recherche google suffit, mais ils restent generalement au ras des paquerettes - justement parce qu'il est difficile d'etre precis sans connaitre l'utilisation finale. Sinon, il faut s'inspirer de l'existant. Le reste s'acquiert avec l'experience.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 48
    Points
    48
    Par défaut fichier a access direct (fortran 77)
    Salut
    je n arrive vraiment pas a trouver la solution a mon problem voici le code
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
            open(UNIT=7,FILE='sortie.txt',status='NEW')
     
           OPEN(unit=20, file='test.txt')
          read(20,*)read_value
          ma=read_value
          mi=read_value
           close(20)
     
          OPEN(unit=20,file='test.txt')
           ios = 0
          nb_val= 0
          do while (.true.)
               read(unit=20,fmt=*,iostat=ios) read_value
                if (ios .ne. 0) exit
     
               nb_val = nb_val + 1 !nombre de valeur
                if(read_value.gt.ma)then
                  ma=read_value  ! Maximal
                endif
                if(read_value.lt.mi)then
                   mi=read_value  ! Minimun
               endif
     
          enddo
     
          endfile(20)
               rewind (20 )
           b_klasse  =15
     
    C!!!!!!!!!!!! distance entre les classe!!!!!!!!!!
           distance=ANINT((ma -mi)/ b_klasse+0.5)
     
            open(UNIT=13,FILE='inter.txt', status='NEW' , access='direct',
         1   form='unformatted', recl=nb_valeur)
     
     
           OPEN(unit=20, file='test.txt')
                 ios = 0
                 do while (.true.)
                      read(unit=20,fmt=*,iostat=ios) read_value
                      if (ios .ne. 0) exit
     
                          wert_bear=  ANINT(((read_value-mi)/abstand)+0.5)
                           write(13,rec=a)wert_bear
                           a=a+1
                 end do
            close(20)
     
              m= nb_val
              a=1
               do while(i.lt.m )
              do j=1, 4
               read(13,rec=a)read_value
               zahl(j)=read_value
               a=a+1
               end do
                if (test(zahl,k).eq.1.0) then
                write(7,*) zahl(2)
                 write(7,*) zahl(3)
                  do  while (i+2.le.m)    ! supression des valeurs i+1 et i+2
                          read(13,rec=i+3)read_value
                          write(13,rec=i+1) read_value
     
                        i=i+1
                    end do
                  m=m-2
                  i=1
             else
                   i=i+1
                end if
             end do
             close(13,status='delete')
     
             close(7,status='keep')
     
           end
     
     
               real function test(ein, h)
           implicit none
           real ein(10),aus
           integer h
           if (ein(h).ge.ein(h+1))then
     
               if (ein(h).ge.ein(h+2)) then
     
                   if (ein(h+3).le.ein(h+2)) then
     
                         if(ein(h+3).le.ein(h+1)) then
                          aus=1.0
     
                        endif
                   endif
                endif
            else
                if (ein(h+3).ge.ein(h+1))then
     
                 if (ein(h+3).ge.ein(h+2)) then
     
                    if (ein(h).le.ein(h+2)) then
     
                         if(ein(h).le.ein(h+1)) then
                          aus=1.0
     
                        endif
                    endif
                 endif
                 else
                 aus=0.0
     
               end if
     
           end if
            if (ein(h+1).eq.ein(h+2))then
            aus=0
            end if
             test=aus
          return
           end
    le ficher test.txt comporte environ 100 000 reels. lorsque je compile j obtiens le message suivant :
    do_ud:end of file
    apparent state : unit 13 named inter.txt
    last format: list io
    laterly reading direct unformatted external IO
    dans le ficher sortie.txt il n ya que deux valeur ce qui n est pas normal.
    les valeurs dans le fichier sortie doivent etre des entiers .
    je m escuse pour un aussi long message
    je ne me retrouve vraiment pas

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Il faut que tu repasses serieusement par la case conception de ton programme. Pour l'instant, il est tres confus.
    Je comprends que la premiere lecture de l'unite 20 sert a initialiser mi et ma. C'est pas vraiment la peine (je renomme les variables histoire d'aider un peu le pauvre lecteur du code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       valmax = -9999.0 ! tres petit
       valmin  = 9999.0 ! tres grand
    Apres, tu peux boucler sur toutes les valeurs de ton fichier. Evidemment les valeurs initiales sont a adapter a l'intervalle de valeur contenu dans test.txt.

    Ensuite, ca devient acrobatique, car tu ouvres un fichier binaire en unite 13 dans lequel tu vas ecrire _et_ lire. C'est ultra-casse gueule, quelque soit le langage de programmation utilise.
    Ensuite, il a le record length de cette unite 13. Tu donnes nb_valeur. Ce qui te laisse assez de place pour nb_valeurs octets. recl ne donne pas la taille totale du fichier. Il donne la taille d'un enregistrement. Si tu veux ecrire des variables reelles simple-precision une par une, recl=4. Si tu veux ecrire un tableau de nb_valeurs reelles, alors recl = nb_valeurs * 4 et tu dois ecrire ton tableau d'un coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       write(13, rec=1) (array(j), j=1, nb_valeurs)

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    le record de l unite 13 (recl= nb_valeur) c est une erreur . j ai change la valeur du record en prenant recl=4 mais le resultat ne change pas .comment faire pour ecrire toute mes valeurs d un coup dans le ficher unit 13 lorque j ai plus de 100000 valeur a lire dans le ficher unite 20

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par ERICKO
    comment faire pour ecrire toute mes valeurs d un coup dans le ficher unit 13 lorque j ai plus de 100000 valeur a lire dans le ficher unite 20
    Il est fort peu probable que tu puisses déclarer un tableau de 100000 réels. Le plus simple, si les enregistrements peuvent être traités indépendamment, est de les lire un par un, puis mettre à jour le fichier sortie.
    Quelque-chose comme cela:
    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
     
          OPEN(unit=20, file='test.txt')
          OPEN(unit=13, file='inter.txt', status='new', access='direct',
         &        form='unformatted', recl=4)
     
          ios = 0
          nrec = 1
          do while (.true.)
             read(unit=20, fmt=*, iostat=ios) read_value
             ! ici, on traite read_value pour en faire processed_value
             ...
             write(13, rec=nrec) processed_value
             nrec = nrec + 1
             if (ios .ne. 0) exit
          enddo
     
          close(20)
          close(13)

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut besoin d'aide pour le fortran
    Je vais essayer d'être assez claire en exprimant mon problème.
    J'ai fait une boucle dans lequel j'ai ouvert un fichier qui me stocke mes données sous forme de tableaux.
    Mais je veux créer un test qui ne sélectionne que certaines valeurs de ce fichier, précisément dans une colonne je veux choisir seulement les valeurs qui sont inférieures aux valeurs qui les précèdent. Comment dois je faire ?
    Par exemple, dans mon fichier, j'ai
    1.98
    1.95
    2.05
    2.08
    Mon test ne doit sélectionner que 1.95 car plus petit que 1.98.
    Ici c'est la partie du programme que je dois compléter avec le test.

    do it=2,iter
    xexit=(dfloat(it-1)*tinc*100.d0)/(365.25d0)

    xdistTA2=(y(19)-y(7))**2+(y(20)-y(8))**2+(y(21)-y(9))**2
    xdistTA=dsqrt(xdistTA2)

    write(UNIT=77,FMT=2000) it, (t*100)/(365.25d0)
    + xdistTA
    enddo

  11. #11
    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
    Peux-tu préciser ta question ?
    • La rubrique parle de fichier à accès direct
    • Le 1er paragraphe parle de filtrer les valeurs dans un fichier
    • L'exemple de code n'a pas vraiment rapport avec le problème exposé

  12. #12
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut nombre de byte stockable par enegistrement
    Salut j'ai un problème du même genre,
    la routine qui suit me permet de stocker les tableaux pktf(100) et vittf(100) au numéro d'enregistrement idvcmt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                  open(idvcm,file='cmarche.dat',status='old')
                  open (idvcmt,file='xxx',access='direct',recl=1024)
                  read(idvcm,'(i5)')ncmarche
                  don=1,ncmarche
                     read(idvcm,*)ii,npmarche(n)
                   write(cid_cm(n),'(i5)')ii
                     doi=1,npmarche(n)
                       read(idvcm,'(2f10.0)')pktf(i),vittf(i)
                     end do 
                     write(idvcmt,rec=n)pktf,vittf
                  end do
    seulement, je ne parviens pas à stocker un troisième tableau même en augmentant le nombre de bytes de recl...
    Y aurait-il une limite au nombre de bytes stockables par enregistrement ?

    merci de vos réponses

  13. #13
    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 juliopony
    ... la routine qui suit me permet de stocker les tableaux pktf(100) et vittf(100) au numéro d'enregistrement idvcmt
    idvcmt n'est pas le numéro d'enregistrement, mais le numéro de fichier...

    Citation Envoyé par juliopony
    seulement je ne parviens pas à stocker un troisième tableaux même en augmentant le nombre de byte de recl...
    y aurait il une limite au nombre de byte stockable par enregistrement ?
    Comme tu n'a pas fourni le programme à 3 tableaux ne fonctionnant pas, on ne peut que spéculer sur ce qui ne fonctionne pas... Si tu essaie d'écrire un rang de chaque tableau à chaque ligne de xxx, recl devrait être égal au nombre de byte des variables à écrire. Il n'y a pas de limite à ma connaissance. En tout cas, pas de limite atteignable avec la faible dimension de tes tableaux.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par azertyman
    quel interêt as-tu à programmer en fortran ?
    quel intérêt as-tu à poser cette question ?

  15. #15
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    merci pour ta réponse,
    En fait je travaille sur un code existant et j'ai fait une grosse erreur en utilisant un "numéro de fichier" déjà déclaré dans le code ... d'où le problème
    Il n'y a donc effectivement pas de limite
    Désolé pour ce post malencontreux et encore merci

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    salut
    j'ai une question svp
    comment un fichier peut lire une valeur entreé dans un autre fichier?

Discussions similaires

  1. ouvrir un fichier à accès direct
    Par albertgl dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/11/2010, 16h56
  2. Réponses: 5
    Dernier message: 25/03/2010, 08h17
  3. Lecture fichier (acces direct)
    Par Invité dans le forum C
    Réponses: 1
    Dernier message: 30/01/2010, 15h32
  4. Fichier acces direct et sequentiel
    Par malav dans le forum C
    Réponses: 4
    Dernier message: 29/01/2009, 16h09
  5. Réponses: 7
    Dernier message: 18/03/2006, 13h16

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