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 :

Lecture fichier binaire et inversion d'octets


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Lecture fichier binaire et inversion d'octets
    Bonjour,

    Je veux utiliser un fichier binaire dans un code fortran en l'ouvrant avec un bout de code que j'ai récupéré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	DIMENSION GRID(2500)
    	INTEGER*2 GRID	
    	open(1,file='19981207RR',form='binary')
    	read(1,end=99)(GRID(i),i=1,2500)
    99     close(1)
    mais la personne qui m'envoie le fichier binaire me dit qu'il faut "inverser les octets car le fichier a été généré sur une machine linux".

    Pour moi, c'est du chinois.

    Si je lis les fichiers directement avec le bout de code ci-dessus, cela ne correspond pas à ce que je dois obtenir.

    Je travaille sur PC, je n'ai pas Linux, et je suis méga débutant en programmation d'où mon appel à l'aide. Merci pour vos conseils.

    Zoro

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    L'histoire d'inverser les octets, c'est un probleme d'endianness. Cela depend du processeur, pas du systeme d'exploitation. Si tu utilises un processeur compatible x86 (Intel, AMD) comme la personne qui a fourni les donnees, alors tu n'as rien a faire : c'est du little-endian des deux cotes. Par contre, si les donnees ont ete crees sur une machine a processeur PowerPC, par exemple, alors les donnees sont au format big-endian et effectivement, il faudrait inverser les octets. C'est une limitation du format binaire pur : il n'est pas portable directement d'une machine a l'autre.

    Pour lire ton fichier, utilise un Fortran un peu plus standard que celui que tu proposes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    integer*2 grid(2500)
    ...
    open(unit=10, file='19981207RR', access='direct', form='unformatted', recl=5000)
    read(10, rec=1) grid
    close(10)
    Le recl donne la longueur d'un enregistrement en octets [record length] (ici, je lis tout en une fois, i.e. 2500 entiers de deux octets). Si tu veux faire une boucle (memoire limitee, par exemple), il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    open(unit=10, file='19981207RR', access='direct', form='unformatted', recl=2)
    do nrec = 1, 2500
      read(10, rec=nrec) grid(nrec)
    enddo
    close(10)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Merci
    Ca marche avec le code que tu m'as donné, je l'ai juste adapté au nb total d'entiers de ma grille. Merci beaucoup.
    Z

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par zoro_le_renard
    Ca marche avec le code que tu m'as donné, je l'ai juste adapté au nb total d'entiers de ma grille. Merci beaucoup.
    De rien. Remarque que j'avais fait une erreur dans la version 'boucle'. Le recl du OPEN n'etait pas correct. C'est maintenant corrige.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut signification de rec
    Da Zumba

    j'ai juste besoin d'une précision, que veut dire le
    rec=1
    dans l'instruction read ?

    Merci pour ta réponse

    Zoro

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par zoro_le_renard
    j'ai juste besoin d'une précision, que veut dire le
    rec=1 dans l'instruction read ?
    rec sert a preciser le numero de l'enregistrement (record) dans le fichier binaire. read() peut determiner la position du debut de l'enregistrement car on a donne la longueur d'un enregistrement a open() en utilisant recl (record length). Le debut d'un enregistrement est donc au (rec - 1) * recl octet (mais read() fait ce calcul toute seule).

    Dans le post ci-dessus, je propose deux solutions qui font la meme chose:
    - lire toute la grille d'un coup. recl vaut alors 5000 (2500 enregristrements de 2 octets) et on se positionne au premier enregistrement (rec=1).
    - lire enregistrement par enregistrement. recl vaut alors 2 (1 enregistrement de 2 octets) et on se positionne au debut de l'enregistrement nrec (rec=nrec).

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

Discussions similaires

  1. lecture fichier binaire de double
    Par sandra771 dans le forum C
    Réponses: 6
    Dernier message: 10/11/2006, 16h42
  2. Lecture fichier binaire
    Par djidji dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2006, 11h58
  3. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  4. Lecture fichier binaire
    Par kek_net dans le forum Langage
    Réponses: 5
    Dernier message: 07/08/2006, 19h37
  5. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53

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