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 :

Programme pour ouvrir un fichier de températures


Sujet :

Fortran

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut Programme pour ouvrir un fichier de températures
    Bonjour

    J'ai un fichier .dat.z dans lequel se trouvent des données de température. Sur le ftp où je l'ai téléchargé se trouve un programme en C (je pense) pour pouvoir le lire et là je n'y connais rien.

    http://aspera.jpl.nasa.gov/download/...as/1990/avhrr/ c l adresse ou j ai telecharger ce genre de fichier

    J'ai essayé beaucoup de moyens d'ouvrir ce fichier (global emapper, arcgis, verticale mapper, wimsoft et aussi Excel ou Notepad ) enfin ceux qui sont gratuit mais rien n'y fait et un ptit coup de pouce serait le bienvenu car c'est assez important.

    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Salut,

    pour commencer, le code que tu as mis en fichier joint n'est pas du C.
    Je pense à du Fortran (ça fait beaucoup d'années que je n'en ai plus fait mais il me semble que ça ressemblait à ça).
    Les fonctions réalisent des conversions latitude longitude en coordonnées de matrices.

    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
     The following four functions can be used convert    grid  <----> lat/lon.
    c
    c  
     
     
     
          integer function lat_to_j(lat)
    c
    c     Function takes a latitude and returns the index of the grid row that
    c     latitude falls in.  NOTE: assumes 512 grid cells over 180 degrees and
    c     that latitude varies from -90 to 90.
    c
          real lat
          lat_to_j=int((90.-lat)*2.844444)+1
          return
          end
     
     
     
     
          integer function lon_to_i(lon)
    c
    c     Function takes a longitude and returns the index of the grid column
    c     that the longitude falls in.  NOTE: assumes 1024 grid cells over 360
    c     degrees and that longitude varies from 0 to 360.
    c
          real lon
          lon_to_i=int(lon*2.844444)+1
          return
          end
     
     
     
          real function j_to_lat(j)
    c
    c     Function takes the index of a grid row and returns the latitude of the
    c     center of the grid cells in that row.  NOTE: assumes 512 grid cells
    c     over 180 degrees and that latitude varies from -90 to 90.
    c
          integer j
          j_to_lat=90.-((float(j)-.5)/2.844444)
          return
          end
     
     
     
          real function i_to_lon(i)
    c
    c     Function takes the index of a grid column and returns the longitude of
    c     the center of the grid cells in that column.  NOTE: assumes 1024 grid
    c     cells over 360 degrees and that longitude varies from 0 to 360.
    c
          integer i
          i_to_lon=(float(i)-.5)/2.844444
          return
          end
    Ensuite, pour lire les fichiers targz, il faut les décompresser. Une liste d'utilitaires :
    • 7zip
    • IceOWS
    • PoweTGZchiver
    • iZarc
    • TugZip



    Karl.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok merci de ton interêt!

    j ai utilisé l outil que tu m indique pour decompresser mais pour la lecture du fichier c tjrs pareil j obtient des hieroplyphes !!

    mon objectif est de recuperer les valeurs de longitude te latitude avec les valeurs correspondantes a l intersection des coordonnées!! donc dans le meilleur des cas 3 colonnes x y et Z

    dois je utiliser ce code dans un editeur de programme, est ce un code pour une extension d un logiciel ?? si oui comment le realiser?
    je sais beaucoup de question mais là je rame et ce genre de fichier j en ai une bonne vingtaine à traiter!!

    merci

  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
    Par défaut
    Tu es au bon endroit. Le code est bien du Fortran (Fortran 77 pour être précis).

    Pour lire, retourne au site de la NASA que tu indique. Au début du fichier read_sst.for, il y a un exemple de lecture des fichiers. En gros, ils sont « sequential unformated ».

    Il n'y a pas de garantie que les fichiers « sequential unformated » soient portables d'un système / compilateur à l'autre. Le standard Fortran décrit la fonctionnalité, mais pas la structure physique interne du fichier. En général, la structure suivante est respectée :

    • Le fichier est une suite d'enregistrement (binaire)
    • Chaque enregistrement commence et se termine par sa longueur
    • La longueur est calculée en bytes OU en multiple de 4 bytes
    • La longueur est écrite en binaire


    Comme le fichier est écrit en binaire, il est sensible à l'endianness (?) du processeur.

    Comment s'en sortir ?

    Le plus simple est d'utiliser un compilateur Fortran qui supporte le contrôle de l'endianness sur les opens, question de faire des essais...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok merci pour ces reponses!

    mais je dois dire que je ne suis pas programmeur et là je ne comprend pas tout !! le fortran 77 est il la seule solution pour obtenir les valeurs de ces fichiers?

  6. #6
    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
    Par défaut
    Tout compilateur Fortran supportera le source Fortran 77, le F77 étant un sous-ensemble des versions plus récentes du langage.

    Si tu veux lire le fichier sans un compilateur Fortran, tu devras avoir un langage supportant la lecture de fichier binaire et décoder toi même le fichier. Ce chemin n'est certainement pas plus facile que le précédent...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok

    je vois que je n ai pas le choix, dommage de ne pouvoir faire autrement,
    as tu une source qui pourrait aider un novice comme moi a utiliser ce code et la façon de l intégrer meme si j y vais a reculons vu que ce n est pas l objectif de mon stage et que ca va me prendre du temps! mais bon quand faut

    merci

  8. #8
    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
    Par défaut
    Pour un compilateur Fortran, cherche le forum, il y a plusieurs entrées sur le sujet. Ils font surtout référence aux compilateurs open source (g77, g95, gfortran). Comme tu veux uniquement compiler un programme Fortran 77, tu peux aussi utiliser certains compilateurs commerciaux limités à F77. Finanlement, comme ton besoin semble très ponctuel, tu peux aussi utiliser les versions à l'essai (30 jours) de certains compilateurs commerciaux.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    il n'est pas si terrible ce programme Fortran (et en plus il est assez bien commenté, ce qui n'est pas si commun). De même, pour savoir si les données sont correctement lues, il y a les commentaires qui indiquent quelques valeurs clés qui devraient être obtenues.

    As-tu essayé de compiler et lancer le programme tel quel?
    En présence du fichier 'sst9001.dat', il devrait afficher deux lignes contenant les valeurs suivante:
    Au delà de cela, la question est de savoir ce que tu comptes faire de ces données; S'il s'agit de les réécrire dans un fichier texte sous la forme d'un tableau longitude-latitude-valeur, il suffirait de rajouter deux-trois instructions au code initial (et d'utiliser les fonctions fournies), mais sois un peu plus précis sur ce point.

    Ehouarn

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok merci pour vos reponses

    oui c est ce que je veux , obtenir 3 colonnes dans un fichier texte, longitude latitude et valeurs correspondantes! tu veux dire que le code n est pas complet alors?

    j ai telecharger G77 et pour l instant je ne vois pas comment m en servir! mais je circule sur le forum pour voir!

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Le code fourni est complet, au sens où, une fois la l'instruction
    atteinte, le tableau sst contient toutes les données.

    C'est cependant ensuite à chaque utilisateur d'en faire ce qu'il veut; et dans ton cas, une simple double boucle pour écrire le tout dans un fichier texte.

    Mais avant de se lancer dans des modifications, autant vérifier que tu parviens déjà à faire tourner le code tel quel.

    Bon courage

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    salut !

    alors des nouvelles de cette ope
    J ai utilise deux compilateur de donne g77 et fnt77
    j ai reussit a compiler le code seawif. f qui est apparemment une extension .for, suis rentre sur le cmd appele le code qui m a produi t un .obj
    puis meme manip sauf que là je prend le fichier slink pour produire un exe (programme) à partir du .obj!!
    j utilise la commande :programme(.exe) donnees.dat et là j obtiens un msg d erreur " error/attempt to read past end -of- file"

    et là moi pas comprendre!!

    c quoi le pble ma manip ou mon code!!

    merci

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    error/attempt to read past end -of- file
    signifie simplement que ton programme a tenté de lire plus d'éléments que n'en contient le fichier. Il y a donc un problème au niveau de la lecture.
    Est-ce qu'au moins les premiers éléments sont lus correctement?

  14. #14
    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
    Par défaut
    Tu essaies probablement sur un PC. J'ai testé sur un PC et j'ai le même problème.

    Le fichier est « big endian » alors que les processeurs PC (x86) sont « little endian ». Par exemple, les 4 premiers caractères du fichier contiennent la longueur du premier enregistrement, lequel contient 4 caractères, soit 2 entiers de 2 caractères (yr,mon). Ce premier enregistrement complet contient en hexadécimale :

    00 00 00 04 00 5A 00 01 00 00 00 04

    soit, la longueur : 00 00 00 04
    yr : 00 5A = 5 * 16 + 10 (A) = 90
    mon : 00 01 = 1
    la longueur encore,

    dans le fichier, il y a ensuite 00 00 00 08, soit la longueur du 2ième enregistrement.

    Concentrons nous maintenant sur la longueur 00 00 00 04. Sur une machine big endian, ça donne : 00h * 256^3 + 00h * 256^2 + 00h * 256 + 04h = 4, ce qui est la bonne réponse. Sur une machine little endian, ça donne : 00h + 00h * 256 + 00h * 256^2 + 04h * 256^3 = 67.108.864 ce qui est évidemment erronné. Sur la machine little endian, il aurait fallu qu'il soit écrit 04 00 00 00. Quand le programme essaie de lire la 2ième ligne, il se déplace à la position 67 108 864 + 2 * 4 (pour les 2 champs longueur). Comme cette position excède la longueur du fichier, il produit l'erreur observé.

    La solution ? Tu dois utiliser un compilateur te permettant de spécifier que le fichier à lire est big endian même si la machine est little endian.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    ok d accord ce petit boutiste va pas faire de moi un grand boudhiste car je perds patience, ce dingue que la nasa file des données comme çà, en tt cas merci a vous deux pour cette aide,
    si j ai bien compris ce juste une question d ordre des octets, le poids le plus faible en premier pour le little endian!!

    moi j utilise un portable hp compaq nx 9105! quel est le programme a utilisé dans ce cas et comment spécifier ce changement de little a big?

    merci encore

  16. #16
    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
    Par défaut
    Dans les faits, il y a plusieurs solutions. Ça dépend de ton budget, de ta patience, de tes connaisances informatiques,... La meilleure solution pour une personne n'est pas nécessairement la meilleure pour une autre.

    Solution 1

    Vérifie si ton compilateur actuel te permet de spécifier l'endianness du fichier dans le open. Par exemple, pour CVF, il faut ajouter convert='BIG_ENDIAN' au open.

    Solution 2

    Trouve un compilateur qui supporte le contrôle de l'endianness. Il y a au moins Intel Visual Fortran qui le supporte. Ce dernier est gratuit pour 30 jours (à l'essai). Ça te donne le temps d'écrire et compiler et débogguer un programme d'extraction.

    Solution 3

    Tu lis le fichier en binaire, 2 caractères à la fois et tu inverses les caractères :
    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
     
    character*2 Big
    character*2 Little
    integer*2    iLittle
    equivalence (Little,iLittle)
    ...
    open(...,access='direct',recl=2)
    ...
    read(...,rec=3) Big ! Je lis la 3ième occurence de 2 caractères (je saute 00 00 et 00 04)
    Little(1:1) = Big(2:2)
    Little(2:2) = Big(1:1)
    yr = iLittle
     
    read(...,rec=4) Big
    Little(1:1) = Big(2:2)
    Little(2:2) = Big(1:1)
    mon = iLittle
     
    read(...,rec=9) Big ! on saute 00 00, 00 04, 00 00 et 00 08
    ...

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    bonjour,

    je reviens !! est ce que un changement ou un ajout d' une variable d environnement peut me permettre de réaliser mon export?


    merci

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    desole j etait sur la page, elle ne s est pas mise a jour et je n ai pas pas vu voir ta reponse

    merci, je vais essaye ca!!

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Dans la lignée de la solution 2 de Sylvain, il y a également le compilateur de chez Portland Group www.pgroup.com qui est gratuit en version d'évaluation et qui permet de choisir d'utilisier l'endian inverse de celui de la machine sur laquelle on tourne, en compilant avec l'option '-byteswapio'.

    Bon courage, le bout du tunnel n'est peut-être pas si loin.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    salut!

    je n arrive pas a trouver la facon de faire de la premiere solution, tu ajoute

    convert='Big endiann" au moment d appeler le code?

    \win32app\salford\ftn77 ... ?

    merci de me donner plus de precision:

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème pour ouvrir un fichier avec firefox 2.0
    Par peptofr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 19/12/2006, 17h37
  2. [vbscript] [msgbox] boutons pour ouvrir des fichiers
    Par D-ude dans le forum VBScript
    Réponses: 8
    Dernier message: 12/12/2006, 16h49
  3. [FPDF] Pb pour ouvrir un fichier pdf sous IE ?
    Par wormseric dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/11/2006, 11h15
  4. Programme pour créer des fichiers
    Par gaara dans le forum C
    Réponses: 32
    Dernier message: 15/10/2006, 17h53
  5. probleme pour ouvrir un fichier JPG
    Par kokatrix dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 04/05/2006, 16h53

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