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

Entrée/Sortie Java Discussion :

Equivalent fread (langage C) en Java


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut Equivalent fread (langage C) en Java
    Bonjour,

    Je cherche à adapter du code C en Java.
    L'une des fonctions me pose problème.

    Il s'agit de lire dans un fichier des longs qui ont été écrits puis lus dans le fichier avec les fonctions suivantes du langage C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fwrite(&donnee, 4, 1, fich);
     
    fread(&donnee, 4, 1, fich);
    où l'on lit / écrit l'équivalent d'un long (4 octets x 1) avec les paramètres suivants :
    - donnee est un long où l'on lit ou écrit
    - 4 correspond au nombre d'octets à lire ou écrire pour chaque élément
    - 1 correspond au nombre d'éléments à lire ou écrire
    - fich est le fichier où l'on lit ou écrit

    Donc, j'ai tenté de transposer cela en Java de la manière suivante afin de lire le fichier écrit précédemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inputBinaryFile = new FileInputStream (NomDuFichier);        // Fichier binaire    
    inputBinaryData = new DataInputStream (inputBinaryFile);    // Le même fichier via stream
     
    int NbDonneesLues=0;         
    for(;;){                
     
    TabNum [NbDonneesLues] = (long)inputBinaryData.readInt ();
    NbDonneesLues++;                                            
    }
    Sachant que TabNum est un tableau de long, la première astuce consiste à comprendre (je crois, corrigez si erreur !) qu'un long en C est de taille 4 octets alors qu'en Java il est de taille 8 octets.

    Cela explique dans mon code le readInt casté en long puis rangé dans un tableau de longs.

    Résultat au final :
    Ca donne des nombres super longs, voire négatifs. Bref, rien à voir avec les données lues et écrites à l'origine en C.

    J'ai essayé avec readLong (qui lit 8 octets donc) et logiquement ça ne lit pas correctement non plus.

    Est-ce que vous avez des idées ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ReadInt lit de la manière suivante:

    Soient a,b,c,d les bytes 0, 1, 2 et 3 dans le fichier, la valeur lue est


    (((a & 0xff) << 24) | ((b & 0xff) << 16) |
    ((c & 0xff) << 8) | (d & 0xff))
    Le code de ton programme en C a un problème, c'est qu'il n'est pas indépendant de l'endiance. Et donc, pour lire, tu va devoir tenir compte de l'endiance qui a été utilisée pour l'écriture (L'endiance en question dépendant de l'architecture dans laquelle le code C que tu porte a été lancé pour générer le fichier!)

    En pratique, tu va devoir faire 4 readByte et reconsituer ton int en jouant comme au dessus, mais en changeant les places de s a,b,c,d. Il y a fort à parier que ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     (((d & 0xff) << 24) | ((c & 0xff) << 16) |
      ((b & 0xff) << 8) | (a & 0xff))

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Java est big-endian quelle que soit la plate-forme, ton code C générera un fichier au format little-endian s'il est compile/exécute sur un processeur Intel.

    La lib nio de Java permet d'ouvrir des flux sur des données little-endian et d'en lire directement les données sans faire de transformation.
    Si tu préfères utiliser la lib io, il te faudra lire 4 octets (plutôt qu'1 int) puis faire les inversions d'octet que t'explique tchize_ pour reconstituer un int correct.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Merci tchize pour ton explication !
    J'ai adapté mon source suivant ta suggestion : PARFAIT !

    Bouye, j'essaierai ta solution avec nio après pour expérimenter.

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

Discussions similaires

  1. equivalent du control FileUpload en JAVA
    Par hicham246 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 04/01/2008, 15h56
  2. Equivalent listbox et treeview en Java
    Par AsmCode dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/03/2007, 22h17
  3. Choix d'un langage : C++ vs JAVA
    Par conconbrr dans le forum C++
    Réponses: 70
    Dernier message: 28/01/2007, 22h40
  4. Equivalent d'un vector de Java ?
    Par GyZmoO dans le forum C
    Réponses: 12
    Dernier message: 23/06/2006, 20h40
  5. [Mac] Equivalents de Delphi, Pascal, C, Java, etc ?
    Par cyberjoac dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 02/04/2006, 12h26

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