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 90] Détection de fin de fichier


Sujet :

Fortran

  1. #1
    Invité
    Invité(e)
    Par défaut [Fortran 90] Détection de fin de fichier
    Bonjour

    Je suis debutant avec Fortran 90. J'ai fait un petit programme test dont le but est simplement de copier une liste de nombres d'un fichier texte vers un autre qui est cree par le programme. En fait, j'aimerais ne pas avoir a connaitre la taille de cette liste, que le programme detecte tout seul cette taille. J'ai entendu parler du parametre end dans la fonction read et aussi de la commande allocatable mais je n'arrive pas a m'en servir correctement.

    Pourriez-vous m'aider, s'il vous plait?

    Voici le programme et la liste en pieces jointes
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !
    Tes fichiers attachés sont illisibles. Utilise plutôt les balises code.

    Jean-Marc Blanc

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

    Ton programme:
    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 essai
     
    integer :: i,j
    integer, allocatable, dimension(:,:) :: m,p
     character(99) :: outputfile
     
    open (unit=1,file='listeessai',form='formatted',status='old',action='read')
     
    i=1
    do
    read (1,'(i2)', end=100) m(i,1)
    p(i,1)=m(i,1)
    i=i+1
    end do
    100 continue
    allocate (m(i,1))
    allocate (p(i,1))
     
     
    type *,'outputfile :'
    read (*,'(a30)') outputfile
     
    OPEN  (UNIT =2,FILE =outputfile1,form='formatted',status="new",action="write")
     
    do i=1,10
    write (2,'(i2)') p
    end do
     
    end program essai
    pose problème sur plusieurs points:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    do
    read (1,'(i2)', end=100) m(i,1)
    p(i,1)=m(i,1)
    i=i+1
    end do
    100 continue
    allocate (m(i,1))
    allocate (p(i,1))
    Tu ne peux pas d'abord lire des valeurs et les mettre dans un tableau qui n'existe pas encore...
    Il y a plusieurs manières de faire, mais le plus simple est de faire les choses en deux temps: D'abord identifier le nombre de lignes du fichier pour connaitre la taille des tableaux qui seront nécessaires, allouer ces derniers, puis faire un deuxième passage de lecture des données proprement dites.

    Autre point important: commence toujours tes programmes par l'instruction 'implicit none':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    program essai
    implicit none
    ! déclaration des variables:
    ce qui force le fait de devoir déclarer toutes les variables qui seront utilisées et qui évitera les erreurs du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    read (*,'(a30)') outputfile
     
    OPEN  (UNIT =2,FILE =outputfile1,form='formatted',status="new",action="write")
    'outputfile1' n'est pas 'outputfile' et sera, comme tu t'en doutes, source de problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type *,'outputfile :'
    n'est pas une instruction Fortran ! Ce qu'a dû te dire ton compilateur quand tu as tenté de compiler ton programme. A ce sujet, je te conseille de regarder au moins brièvement la doc de ton compilateur et d'enclencher toutes les options d'analyse et débogage pour t'aider à isoler les problèmes que tu rencontres.

    Pour répondre à ta question initiale, il y a un paramètre optionnel des routines open et read, 'iostat' (input-output status), qui permet de savoir si l'ouverture/ la lecture s'est bien passée (renvoie zéro si tout va bien) et peut servir à déterminer le nombre de lignes d'un fichier. Par 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    program nombredelignes
    ! recherche du nombre de lignes d'un fichier
    implicit none
     
    integer :: nb=0   ! nombres de lignes du fichier
    integer :: uin=42  ! unitee logique associee au fichier
    integer :: ierr    ! etat de reussite(si ==0) ou echec (si /= 0) 
    integer :: number ! nombre entier a lire
    character(len=100) :: infile="listeessai" ! nom du fichier a lire
     
    !1. Ouverture du fichier
    open(uin,file=infile,form="formatted",iostat=ierr,status="old")
    if (ierr/=0) then
      write(*,*) "Impossible d ouvrir le fichier ",trim(infile)
      ! on s'arrete là
      stop
    endif
     
    !2. Lecture du fichier; on lit (et compte le nombre de lignes  correctement lues)
    !   tant qu'il n'y a pas d'erreur de lecture.
    do while (ierr==0)
      read(uin,*,iostat=ierr) number
      if (ierr==0) then ! la lecture s'est bien passee
        ! on incremente le compteur du nombre de lignes
        nb=nb+1
      endif
    enddo
     
    write(*,*) 'le fichier ',trim(infile),' contient ',nb,'lignes'
     
    end program nombredelignes
    Dans ton cas il faudrait ensuite une étape 3 ou tu alloues tes tableaux, maintenant que tu connais la taille qu'ils devront avoir, puis une étape 4 ou tu lis les données (n'oublie pas de rembobiner le fichier avant!).

    Bonne continuation.

    Ehouarn

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour votre aide!!

    Ca marche tres bien maintenant!

    A plus

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

Discussions similaires

  1. [NASM] Détection de fin de fichier
    Par andromeda dans le forum Assembleur
    Réponses: 2
    Dernier message: 13/04/2007, 20h01
  2. Réponses: 13
    Dernier message: 04/11/2005, 12h58
  3. [Fortran] Lecture de la fin d'un fichier
    Par sebduth dans le forum Fortran
    Réponses: 1
    Dernier message: 02/09/2005, 17h27
  4. Réponses: 4
    Dernier message: 07/12/2004, 09h11
  5. Lire de la 2eme ligne à la fin du fichier
    Par iamspacy dans le forum Linux
    Réponses: 3
    Dernier message: 03/05/2004, 14h23

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