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 :

Lire un fichier binaire de data compilé par un Salford compiler


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Par défaut Lire un fichier binaire de data compilé par un Salford compiler
    Salut tout le monde !

    Je n'ai jamais fais de FORTRAN. J'essaie de lire un fichier binaire contenant des données numériques et provenant d'un programme fait en FORTRAN.
    Ce programme a été compilé par un compilateur Salford et le format des données est super bizarre (en tout cas j'ai l'impression, je n'ai pas accès aux sources).

    J'essaie d'ouvrir ces données sous MATLAB et c'est pas facile. En ouvrant le fichier comme un "double" j'arrive a avoir certaines valeurs mais pas tout (c'est à dire que j'ai une version texte tronquée de ce que je dois obtenir, du contenu décrypté du fichier).

    A priori, le format n'est pas le même dans tout le fichier.
    D'après ce qu'on m'a dit (mais que je ne comprend pas) : "Records less than 240 bytes have one byte at the beginning and the end with the length of this record. Longer records have a FF byte and additionally four bytes with the length" ("Les données <240 octets ont 1 octet au début et la fin avec la taille des data. Les data plus longues ont FF octet and additionally four bytes with the length")

    Désolé pour la traduction, c'est vraiment mystérieux pour moi.

    Est-ce que cela vous dit quelque chose ?
    Est-ce que vous avez une idée de la strucure de ces données pour que je fasse un programme pour les lire ?

    Merci à tous !
    A+
    Stéphane

  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
    Par défaut
    Question de parler la même langue, il n'y a pas vraiment de fichier binaire en Fortran avant Fortran 2003. En fait, Fortran ne traite pas de façon standard les fichiers binaires. Il y a cependant un format de fichier "unformatted" en Fortran. Les 2 sont très souvent confondus, mais ce n'est pas la même chose.

    Le terme binaire sert généralement à écrire un fichier n'ayant pas de structure interne et dont les valeurs sont représentées selon leur représentation interne ("machine").

    Un fichier "unformatted" est un format spécifique à Fortran, mais malheureusement les détails spécifiques quant à sa structure réelle ne sont pas prévus dans la norme et sont laissés à l'éditeur. Le fichier "unformated" est une suite de records. Chaque record est écrit en binaire. La structure d'un record est généralement : <longueur>data<longueur>.

    Ce que tu décris ressemble à un fichier "unformatted" et non à un fichier binaire.

    Pour lire un tel fichier sans le code source d'origine, je vois quelques problèmes :
    • Le codage des longueurs sur un octet ou sur 5 (FF+4 pour la longueur effective) me semble unique à Salford.
    • Extraire la partie data de chaque record.
    • Savoir ce que chaque ligne contient (comment interpréter les octets binaires).


    Veux-tu lire ce fichier directement en MATLAB ? Je ne connais pas du tout MATLAB. Comme cet outil est proche de Fortran, peut-être permet-il de lire ce fichier directement ? (genre option=Fortran, Unformatted, Salford !!!). Sinon, tu devras utiliser une stratégie proche de la suivante :
    • Lecture binaire
    • Pour chaque record :
      • Lire le premier octet. Si la valeur est 255 (FF), alors lire les 4 suivants pour déterminer la longueur
      • Lire la partie data en assignant les octets successifs à des variables.
      • Lire la longueur (1 ou 5 octets) (et valider avec la longueur du début pour détecter une corruption possible)

  3. #3
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Pourquoi vouloir lire dans MATLAB un fichier qui vient de FORTRAN ?

    Je ne connais pas (plus) FORTRAN mais en MATLAB il y a un format de fichier que tu ne peux créer et lire que dans MATLAB, il est impossible de le réutiliser dans un autre environnement, je suppose que dans ton cas c'est la même chose.

    Donc 2 solutions :
    - soit le programme amont te donne un autre format de fichier qui soit lisible par MATLAB.
    - soit tu utilises FORTRAN pour traiter ce fichier.

  4. #4
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    petit complément à ce qu'a dit sylvain: j'utilise gfortran sur deux deux machine, l'une avec un système 32bit et l'autre avec un système 64bit et j'écrit mes fichiers en format unformatted et un système n'est pas capable de lire ce que l'autre a écrit:
    avec un éditeur hexa on s'aperçoit rapidement que si le contenu du record est bien identique sur les deux machine, la "taille" (placé en début ET fin de chaque record) quant à elle n'est pas codée sur le même nombre de bit...

    de plus, et cela dépent à la fois du compilateur utilisé et de l'architecture de la machine il peuvent ne pas être codés de même manière (genre bit de poids fort/bit de poid faible, direct, inverse... etc...)

    si tu veut gagné du temps, je te conseil si cela t'es possible de stocker non pas en unformatted, mais dans un fichier "texte" bien plus portable sur différentes machines/logiciels

  5. #5
    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
    Citation Envoyé par genteur slayer Voir le message
    si tu veut gagné du temps, je te conseil si cela t'es possible de stocker non pas en unformatted, mais dans un fichier "texte" bien plus portable sur différentes machines/logiciels
    Tout à fait d'accord. L'utilisation d'un fichier unformatted devrait être limité à des situations où le programme créant le fichier et le programme utilisant le fichier sont tous 2 :
    • Écris en Fortran
    • Exécuté sur la même machine
    • Compilé par le même compilateur

    Dans ton message initial, tu dis que tu n'as pas accès aux sources. Présentement ? Elles sont perdues ?

    Si tu ne peux pas modifier directement les sources, le plus simple à mon avis est de t'écrire un convertisseur de unformatted à texte. Ce convertisseur devra être programmé en Fortran et compilé en Salford parce que le codage du fichier semble très spécifique à Salford. Le format 1 octet/5 octets semble être le format de leur compilateur Fortran 77. Je ne sais pas s'il est supporté par leur compilateur Fortran 95. Tu devras en tenir compte avant d'écrire en Fortran 95... Ce convertisseur peut être très simple. Le fait de l'écrire en Fortran Salford fera que la difficulté se limitera à deviner ce qu'il y a sur chaque ligne, et non à savoir comment décoder un tel fichier...

    Dans un premier temps, ce convertisseur pourrait avoir la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    program Conversion
       implicit none
       double precision DoubleData(20)
       real RealData(20)
       integer IntegerData(20)
     
       open(11, 'Fichier unformatted', form = 'unformatted',access='sequential')
       read(11) DoubleData(1:5) ! en supposant qu'il y ait 5 données double sur la ligne 1
       print *, DoubleData(1:5) ! affichera les 5 données lues
       read(11) ... ! lecture de la 2ième ligne
    ...
    Une fois que tu sera satisfait de ta compréhension du fichier, tu pourras modifier le programme pour qu'il imprime dans un fichier plutôt qu'afficher à l'écran.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Par défaut
    Bonjour à tous !

    Tout d'abord, merci beaucoup de vos réponse qui m'ont vraiment bien aidé à comprendre ce que j'avais en face de moi (merci beaucoup Sylvain pour ta réponse si rapide et précise).

    Je suis finalement arrivé à lire directement le fichier de données avec MATLAB.

    Pour répondre un peu à la question de Caro-Line, je n'ai pas FORTRAN sur ma machine et je ne connais pas du tout le FORTRAN. Je travail uniquement avec MATLAB.
    En fait, j'ai un logiciel de dynamique des rotors (MADYN) qui a été fait en FORTRAN par une université Allemande (c'est un vieux logiciel en plus, il a + de 10 ans). Mais nous n'avons que l'exécutable.

    Moi, je veux importer les modèles crées par ce logiciel sous MATLAB.
    Le logiciel prévoyait une exportation des fichiers en format texte mais dans ce fichier, les éléments de matrices et des vecteurs calculés sont tous tronqués à 5 digits, ce qui peut créer des erreurs de troncatures assez énormes (en absolu) sur les grand nombres (par exemple sur les nombres du genre 1.5684E+09, il peut y avoir une erreur absolue de l'ordre de E+04).
    Donc, je voulais lire directement les données dans le fichier non exporté.

    Désormais, c'est chose faite, en suivant ce que vous m'avez dit, j'ai pu faire un programme sous matlab qui lit directement dans ces fichiers.
    D'ailleurs, si ça intéresse quelqu'un, je peux vous le filer !


    En tout cas, merci à tous !
    Je n'imaginais vraiment pas avoir une réponse aussi rapide et aussi précise (je pensais n'avoir aucune réponse en fait...)

    A+
    Stéphane

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

Discussions similaires

  1. Lire un fichier binaire
    Par vancim dans le forum Pascal
    Réponses: 3
    Dernier message: 20/10/2006, 02h13
  2. comment lire des fichiers binaires
    Par compton dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 06/07/2006, 12h03
  3. [C#] Lire un fichier binaire
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/06/2006, 18h08
  4. lire un fichier binaire 8bit apr 8bit
    Par lykim dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 12/05/2006, 17h09
  5. [NIO]Lire un fichier binaire
    Par Info-Rital dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 25/07/2005, 07h50

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