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 .bin


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut Lecture fichier .bin
    Bonjour, je me permets de faire remonter une discussion laisser sans réponse, veuillez m'en excuser.

    Petit topo, le fichier binaire est écrit de la façon suivante:

    boucle k
    boucle y
    boucle x

    Chaque valeur est stockée en simple précision (float).
    La façon la plus évidente de lire ce fichier en fortran est de faire :

    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
     
    IMPLICIT NONE
     
    integer :: i,j,k,ios
    integer, parameter :: nx =  9276
    integer, parameter :: ny =  8350
    integer, parameter :: nc =  24
    real, dimension(nx,ny,nc) :: bin
    character*300 fin,fout
    open(11,file=fin,form='unformatted',access='sequential',iostat=ios)
     
    if ( ios /= 0 ) then 
    	print*, 'Probleme a l"ouverture'
    else
    	print*, 'Ouverture Reussi'
    	do k=1,nc
    		do j=1,ny
    			read(11) (bin(i,j,k),i=1,nx)
    		enddo
    	enddo
    endif
    Or vu la taille du tableau bin cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Traceback: not available, compile with -ftrace=frame or -ftrace=full
    Operating system error: Cannot allocate memory
    Memory allocation failed
    Si j'essaye de le lire ne serait qu'une partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		do j=1,ny
    			read(11) (bin(i,j),i=1,nx)
    		enddo
    je tombe sur ce type de message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Traceback: not available, compile with -ftrace=frame or -ftrace=full
    Fortran runtime error: Reading more data than the record size (RECL)
    Existe t'il une autre solution correcte pour lire ce fichier ?

  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
    Citation Envoyé par marc-alex Voir le message
    ...
    Or vu la taille du tableau bin cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Traceback: not available, compile with -ftrace=frame or -ftrace=full
    Operating system error: Cannot allocate memory
    Memory allocation failed
    Évidemment. Tu demande un tableau de près de 7Gb.

    Citation Envoyé par marc-alex Voir le message
    ...
    Si j'essaye de le lire ne serait qu'une partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		do j=1,ny
    			read(11) (bin(i,j),i=1,nx)
    		enddo
    je tombe sur ce type de message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Traceback: not available, compile with -ftrace=frame or -ftrace=full
    Fortran runtime error: Reading more data than the record size (RECL)
    Existe t'il une autre solution correcte pour lire ce fichier ?
    Le message dit qu'il y a moins de données dans l'enregistrement du fichier que ce que tu demandes. Il y a moins de nx éléments. Tu dois donc briser ta lecture en plusieurs morceaux. As-tu accès au programme ayant créé le fichier ? aux spécifications ?

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je ne reviens pas sur la taille de ton tableau de 7Go

    par contre, est ce que ton fichier n'aurait pas été écrit en accès direct ? si oui, toi tu le lis en accès séquentiel.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    Oui j'ai accès au programme ayant crée le fichier, voici la partie d'écriture:
    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
     
    for (i = 0; i < Nx_out; i++)
        for (j = 0; j < Ny_out; j++)
    	for (k = 0; k < Nc; k++)
    	  LUC_out(k, j, i) = LUC_out_af(k, j, i);
     
      cout << " done." << endl;
      cout << endl;
     
      cout << "Writing output data..."; cout.flush();
     
      FormatBinary<float> PolairFormat;
      PolairFormat.Write(LUC_out, dir_out + "/" + file_out);
     
      cout << " done." << endl;
    C'est écrit en cpp et compilé avec le même compilo que mon code fortran

    Citation Envoyé par kango
    est ce que ton fichier n'aurait pas été écrit en accès direct ? si oui, toi tu le lis en accès séquentiel.
    L'accès en direct entraine ios /= 0 par conséquent j'utilise l'accès séquentiel.

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Citation Envoyé par marc-alex Voir le message
    L'accès en direct entraine ios /= 0 par conséquent j'utilise l'accès séquentiel.
    tu as utilisé quelle valeur pour le recl dans ton instruction open lorsque tu as testé la lecture en accès 'direct' ?

    parce que pour lire un fichier en accès direct, il faut connaitre la taille d'un enregistrement. du coup, si tu n'as pas spécifié une bonne taille ou si tu n'en as pas spécifié du tout, le fait que ios soit différent de zéro peut s'expliquer.

    Comment est réalisée l'écriture dans le fichier binaire, dans le code c++ tu utilises la méthode Write de ton objet PolairFormat qui prend en argument le tableau à écrire et un emplacement sur le disque si je me trompe pas.

    Est ce que cette méthode Write écrit une donnée par ligne, deux, plusieurs ? et surtout dans quel ordre ? rien ne prouve que ce soit le même ordre que celui utilisé lors de la création du tableau LUC_out (dans les boucles for du début).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    Citation Envoyé par kango
    tu as utilisé quelle valeur pour le recl dans ton instruction open lorsque tu as testé la lecture en accès 'direct' ?
    4, la taille du real si je ne m'abuse, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fortran runtime error: Direct access data transfer requires record number
    Citation Envoyé par kango
    Est ce que cette méthode Write écrit une donnée par ligne, deux, plusieurs ?
    Voici la structure du fichier de sortie

    boucle k
    boucle y
    boucle x

    D'après mes info, c'est par ce même type de boucle que l'on devrait réussir à le lire.
    Au cas où j'ai quand même testé toutes les autres possibilités.

    Pour lire ce fichier en plusieurs ne serait-il pas possible de faire une lecture byte à byte ? Je vois comment convertir les octets en real mais pas comment les extraire directement du fichier sous forme binaire.

  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
    Par défaut
    Je ne suis pas un expert de C++, mais je serais très surpris que le fichier soit « unformatted-sequential ». C'est plutôt un stream binaire je crois.

    Ce type de fichier est une simple liste d'éléments collés les uns aux autres sans séparateur. Les octets 1 à 4 contiennent le premier élément, les octets 5 à 8 le deuxième, ... jusqu'à la fin. La taille du fichier devrait correspondre exactement au nombre d'éléments du tableau fois la taille d'un réel simple précision (4).

    Les compilateurs Fortran 2003 devraient le supporter directement (stream unformatted je crois). Le compilateurs antérieurs ont souvent un mode binaire. Tu dois te reférer à ton manuel.

    Comme suggéré par Kango, tu peux aussi le traiter en « direct-unformatted ». Au open, tu dois indiquer la longueur des enregistrements. Le paramètre devra avoir la valeur 4, 2 ou 1, selon que ton compilateur veut le nombre d'octets, le nombre de mots de 16 bits ou le nombre de mots de 32 bits (--> manuel). Et tu devras alors lire les éléments 1 par 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(Unit,rec=nx*ny*(k-1)+nx*(j-1)+i) bin(i,j)
    Tu peux aussi traiter les éléments par bloc en redéfinissant les enregistrements comme ayant nx éléments. Tu devras alors faire le open avec un recl=(4, 2, ou 1) *nx, et la lecture read(Unit,rec=ny*(k-1)+j)bin(:,j).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    Concernant l'option access='stream', cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    read(Unit,*) bin(i,j)
    Fortran runtime error: Bad real number in item 1 of list input
    Même quand j'essaye de lire ne serait ce que le premier réel de la liste.

    Concernant l'option access='direct',recl=x, pour n'importe quel valeur de RECL on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fortran runtime error: Direct access data transfer requires record number
    J'ai la Lose ou bien ?

  9. #9
    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 marc-alex Voir le message
    Concernant l'option access='stream', cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    read(Unit,*) bin(i,j)
    Fortran runtime error: Bad real number in item 1 of list input
    Même quand j'essaye de lire ne serait ce que le premier réel de la liste.
    Mes comiplateurs ne supporte pas F2003. Je ne peux pas t'aider sur ce point.
    Citation Envoyé par marc-alex Voir le message
    Concernant l'option access='direct',recl=x, pour n'importe quel valeur de RECL on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fortran runtime error: Direct access data transfer requires record number
    J'ai la Lose ou bien ?
    Ce message d'erreur me semble venir d'un read et non d'un open. Il doit manquer l'option « rec= ».

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    C'était bien le rec, merci pour votre aide

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

Discussions similaires

  1. Lecture fichier .bin
    Par pelotudo dans le forum C++
    Réponses: 1
    Dernier message: 07/11/2010, 13h04
  2. lecture d'un fichier.bin + affichage du contenu
    Par mitchness dans le forum C
    Réponses: 1
    Dernier message: 26/12/2007, 18h07
  3. lecture de fichier .bin
    Par dufoindufoin dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 23/09/2006, 13h15
  4. lecture fichier .bin ?
    Par touki79 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 15h38
  5. Lecture d'un fichier .bin
    Par nanas dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 06/05/2005, 11h02

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