Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 1
    Points
    1

    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 :
    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 :
    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
    825
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 825
    Points : 1 106
    Points
    1 106

    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/Modérateur

    Homme Profil pro Jean-Marc Blanc
    Comme retraité, des masses
    Inscrit en
    avril 2007
    Messages
    2 925
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Marc Blanc
    Âge : 73
    Localisation : Suisse

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

    Informations forums :
    Inscription : avril 2007
    Messages : 2 925
    Points : 5 002
    Points
    5 002

    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
    825
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 825
    Points : 1 106
    Points
    1 106

    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
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 1
    Points
    1

    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
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 1
    Points
    1

    Par défaut

    Voici finalement à quoi ressemble mon programme

    Code :
    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
    825
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : août 2006
    Messages : 825
    Points : 1 106
    Points
    1 106

    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
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 1
    Points
    1

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •