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

C++ Discussion :

Lecture de fichier binaire


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut Lecture de fichier binaire
    Apres avoir decortiqué l'exemple de la FAQ http://c.developpez.com/faq/cpp/?pag...ERS_read_write
    Je n'arrive pas bien a voir comment lire mon fichier binaire et etre capable de dire

    pour mes bits 10 a 25 je fais une interpretation de unsigned short integer, pour les bytes 42 a 59 une interpretation string, etc

    Une idee?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    bits ou bytes ? C'est pas la même chose, pour aller chercher le bit 10 il faut utiliser les opérateurs bit à bit et de décalage, alors que pour aller chercher le byte 10 c'est immédiat dans un tableau de bytes.

  3. #3
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    La lecture ne se fera pas au bit detail.
    La plus petite entitee contenue dans mon fichier est un byte, et apres ce la varie a des longueurs non connues d'avance, mais je sais que c'est un multiple de byte(s).

    Je veux etre capable de faire byte x a y interprete integer, etc...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si la lecture est séquentielle alors pas de problème, enchaîne simplement les read avec des variables ayant le bon type.

    Si par contre tu lis un paquet d'octets et veux aller y chercher tes variables plus tard, tu peux faire un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char* Bytes; // ou vector<unsigned char>, peu importe...
     
    int x = *reinterpret_cast<int*>(Bytes + 10);
    Mais bon quelque soit la solution, si tu veux écrire du code portable il ne faut pas lire les variables directement, il faut tenir compte de l'endianess de la machine et du fichier.

  5. #5
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Désolé Laurent mais je suis toujours bloqué....

    J'ai un peu de mal avec le fread

    Tu aurais un exemple plus complet?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est simple, si on prends les fonctions définies dans la FAQ, et pour une lecture séquentielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::ifstream File("toto.dat", std::ios::binary);
    int x;
    read(File, x);
    float f;
    read(File, f);
    char str[64];
    read(File, str);
    ...

  7. #7
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Bon ok je comprend pas la voici mon code:
    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
    #include <fstream>
    #include <iostream>
    int main (int argc, char** argv)
    {
    	std::ifstream FileIn("REC.NDX", std::ios_base::binary);
    	if(FileIn.bad())
            {    
                std::cout << "File open error"<<std::endl;
                return -1;
            }
    	int x;
    	std::istream::read (FileIn,x);
     
    	DATETIME startTime,durationTime;
    	std::istream::read(FileIn, startTime);
    	std::istream::read(FileIn, durationTime);
    	std::cerr << "day:"<<startTime.year <<" month:"<<startTime.month<< " day:"<<startTime.day <<" hour:"<<startTime.hour<<" mn:"<<startTime.min<<" sec:"<<startTime.sec<<std::endl;
    	std::cerr << "day:"<<durationTime.year <<" month:"<<durationTime.month<< " day:"<<durationTime.day <<" hour:"<<durationTime.hour<<" mn:"<<durationTime.min<<" sec:"<<durationTime.sec<<std::endl;
    	FileIn.close();	
    	return 0;
     
    }
    et voila l'une des erreurs que je recoit a la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664: “READ”: Conversion of the parameter 1 of “class std:: basic_ifstream<char, struct std:: char_traits<char> >” in “char *” not possible No user-defined conversion operator available, that can accomplish this conversion, or the operator cannot be called
    Je comprend qu'il ne reconnait pas la methode read

    Je suis dans le bon namespace?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je crois que tu as lu trop vite la FAQ, relis calmement le code source et les explications

  9. #9
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Ok compris l'erreur. Désolé, fatigue et stress...



    A bientot

  10. #10
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Bon maintenant que j'arrive, grace aux differentes aides, a lire dans mon fichier binaire, je me trouve face a des problemes de remplissage de mes donnees.

    Ce que je cherches a faire est de lire dans un premier temps 32 bits par 32 bits et de les affichers a l'ecran.

    voici le code que j'utilise:
    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
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <bitset>
    #include <time.h>
    #include <stdio.h>
     
    template<typename T>
    std::istream & Fileread(std::istream& is, T& value)
    {
        return is.read(reinterpret_cast<char*>(&value), sizeof(T));
    }
     
    std::string AsciiStringTobinary(const std::string& inStr)
    {
    	std::istringstream is(inStr);
    	std::ostringstream os("");
    	char c;
    	while( is >> c )
    		os << std::bitset<8>(c).to_string();
    	return os.str();
    }
     
    int main (int argc, char** argv)
    {
    	std::ostringstream os("");	
    	std::ifstream FileIn("REC.NDX", std::ios_base::binary);
     
    	unsigned long int Type,Version;
    	if(FileIn.bad())
    	{
    		std::cout << "File open error"<<std::endl;
    			return -1;
    	}
     
    	Fileread(FileIn, Type);
    	os << Type;
    	std::cout << "TypeId:"<< std::hex << Type << " binaire: "<< AsciiStringTobinary(os.str())<< std::endl;
     
    	os.str("");
    	Fileread(FileIn, Version);
    	os << Version;
    	std::cout << "File version:"<< std::hex << Version << " binaire: "<< AsciiStringTobinary(os.str())<< std::endl;
     
    	os.str("");
    	Fileread(FileIn, Version);
    	os << Version;
    	std::cout << "32 bits:"<< std::hex << Version << " binaire: "<< AsciiStringTobinary(os.str())<< std::endl;
        return 0;
    }
    et voici la sortie sur l'ecran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TypeId:e9e binaire: 00110011001101110011010000110010
    File version:f0 binaire: 001100100011010000110000
    32 bits:0 binaire: 00110000
    Je comprends pas pourquoi la premiere lecture passe bien : 32 bits lus et la deuxieme fois il lit 24 puis 8 bits!!!

    Une explications? je suis un peu coincé

Discussions similaires

  1. Lecture de fichier binaire
    Par nuans dans le forum MATLAB
    Réponses: 23
    Dernier message: 21/05/2007, 10h00
  2. Lecture de fichier binaire et gestion de fin de fichier
    Par habasque dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/05/2007, 17h06
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Réponses: 5
    Dernier message: 26/03/2007, 01h30
  5. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56

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