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 :

Read et write un fichier avec Fortran


Sujet :

Fortran

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Read et write un fichier avec Fortran
    Bonjour,
    j'ai un exercice à faire, et ca fait plusieurs jours que je m'y colle sans vrais résultats ...
    Alors voila mon énoncé

    (A file homework_6.dat contains book records: Name (up to 25 characters), publish year (4 digit integer), price (6 digit real), ISBN (13 digit integer). Write a program to read the file (homework_6.dat) and print out (on screen or into another file) the details in the following format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                                      Publish   
               Name                          Year      ($)        ISBN
           -------------------------      ----   ------     -------------
           Principles of Combustion       2005    107.61     9780471046899
           An Introduction to Comb        2011    193.99     9780073380193 
           Guide to Fortran               2009     71.95     9781848825420
           Modern Fortran Explain         2011    100.00     9780199601417
           Introduction to Program        2012    200.00     9780857292322)



    Donc, j'ai un fichier .dat qui ce qu'il y a juste au dessus ( name, publish year ..) exactement sous cette forme.


    Voila le programme que j'ai écrit
    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
    program dat
        implicit none
        character (len=25) :: Name
        integer :: i, publish_year, ISBN
        real :: price 
        open(unit=7, file="homework_6.dat", status="old", action="readwrite")
        open(unit=8, file="output_hw6.dat")
        !Comment: these below 3 lines are for skipping 3 heading your input                 
        read(7,*)
        read(7,*)
        read(7,*)
        do i=1, 10
        read (7,*) Name, publish_year, price, ISBN
        write (8,1) Name, publish_year, price, ISBN
        1 format(a25,2x,i4,2x,f3.2,2x,i13)
        end do
        close(unit=7)
        end program dat
    Mais j'ai une erreur apres avoir fait 'compile' à la ligne 13.

    Je ne sais pas comment faire pour résoudre mon exercice

    Merci de votre aide

  2. #2
    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 jill_ Voir le message
    Mais j'ai une erreur apres avoir fait 'compile' à la ligne 13.
    C'est une erreur à la compilation ou à l'exécution ?

    Si c'est à l'exécution, c'est possiblement dans le fait que tu utilises un format libre (*). Le format libre interprète les espaces comme des séparateurs. Il va donc séparer les éléments de la ligne à lire en mots et tenter d'assigner "Principles" à Name, "of" à publish_year, ... Tu devrais utiliser un format explicite si tes données sont toutes tabulées de la même façon.

  3. #3
    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!
    J'ajouterais deux remarques à celles de Silvain:
    1. Ton programme lit (lignes 9 à 11) 3 lignes sans intérêt alors que ton fichier de données en comporte 4 (lignes 1 à 4).
    2. Il est dangereux d'attribuer aux fichiers les numéros 7 et 8, parce que, pour des raisons historiques, certains compilateurs peuvent leur donner une signification particulière. Utilise plutôt 10 et 11.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  4. #4
    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
    Je n'avais pas vu du premier coup, mais autre source de problème : ISBN (13 digit integer).

    Un entier de 13 digits, ça excède un integer 4 (32 bits). Ce dernier est limité à 2 147 xxx xxx (2^31 -1), soit 9 digits. Tu pourrais utiliser un integer 8, mais ce n'est pas toujours disponible. De toute façon, comme il est illogique de faire des opérations sur des numéros ISBN (ISBN1 +-*/ ISBN2), tu n'as aucun besoin qu'ils soient numériques. Je te conseille donc de les déclarer character (13).

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    - C'est une erreur à l'execution
    Je comprends le probleme avec les espaces entre les mots, je dois remplacé * par quoi dans ce cas ?

    - Pour les 3 lignes, je pensais qu'il fallait sauter les lignes de l'énoncé, (avec Name, publish year, et les pointillées) mais je préfererai que tout soit copier, et réecris dans le fichier 8, mais je ne savais pas comment faire, c'est pour cela que j'ai décider de les sauter ... si vous avez une solution pour que je puisse tout lire ? je veux bien )

    - Je vais remplacer le 7 et 8 par 10 et 11, merci

    - et je vais mettre ISBN dans les characteres

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Voici finalement à quoi ressemble mon 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
     
    program dat
        implicit none
        character (len=25) :: Name
        character (len=13) :: ISBN
        integer :: i, publish_year
        real :: price 
        open(unit=10, file="homework_6.dat", status="old", action="readwrite")
        open(unit=11, file="output_hw6.dat")
        !Comment: these below 3 lines are for skipping 3 heading your input
        read(10,*)
        read(10,*)
        read(10,*)
        do i=1, 10 
        read (10,'(7x,a25,6x,i4,3x,f6.2,5x,a13)') Name, publish_year, price, ISBN
        write (11,'(7x,a25,6x,i4,3x,f6.2,5x,a13)') Name, publish_year, price, ISBN
        1 format(a25,i4,2x,f6.2,a13)
        end do
        close(unit=10)
        end program dat
    Malheureusement, une nouvelle erreur apparait, à la meme ligne 14
    "Error 57, attempt to read past end-of-file"

    Je ne sais plus quoi faire

    EDIT
    On m'a indiqué d'ou venait l'erreur = dans la do loop !
    ce n'est pas i=1, 10 mais i=1, 5 !
    maintenant ca roule, j'obtiens bien le fichier avec tous ce qu'il y a d'écrit
    Merci beaucoup pour votre aide !

  7. #7
    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
    Tu fais do i=1, 10, puis read. Est-ce qu'il y a bien 10 lignes de données à lire ?

    En général, on utilise plutôt une boucle indéfinie, mais on teste la fin de fichier à la lecture par une clause end= ou iostat=

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Tu es plus rapide

    Oui c'est exactement ça ! Et ca a résolu mon probleme

    Encore merci !

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

Discussions similaires

  1. lecture de fichier avec fortran
    Par afafo dans le forum Fortran
    Réponses: 3
    Dernier message: 04/12/2013, 19h13
  2. Manipulation de fichiers avec fortran
    Par jal13 dans le forum Fortran
    Réponses: 3
    Dernier message: 27/08/2010, 01h34
  3. Envoi de fichiers avec read et write
    Par Z-fly dans le forum Réseau
    Réponses: 9
    Dernier message: 15/08/2008, 20h44
  4. Pb avec read et write sous vc++
    Par Jbx 2.0b dans le forum SDL
    Réponses: 13
    Dernier message: 28/04/2006, 14h58
  5. Problème avec write sur fichier
    Par telescan dans le forum Linux
    Réponses: 8
    Dernier message: 13/12/2005, 16h09

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