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++Builder Discussion :

Aide pour la lecture d'un fichier caractere par caratere en (HEXA)


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Aide pour la lecture d'un fichier caractere par caratere en (HEXA)
    bonjour,
    voila mon PB , je souhaite lire des fichiers sur mon disque, ces fichiers sont des fichiers de donnée et il n'y a que trois caractere HEXA qui m'intéressent mais dans certain cas lors de la lecture du fichier (par exemple à la lecture du caractere '1A' en HEXA) ma routine ne récupère que des '37'

    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
    	AnsiString HEX = "";
    	 AnsiString ChaineHEX="";
    	using namespace std;
    	ifstream fichier(score.c_str(), ios::in);  // on ouvre le fichier en lecture
     
     
    	for(int i =0;i<100;i++)
    	{
    		char c;
    		fichier.get(c);  // on lit un caractère et on le stocke dans caractere
    		HEX =IntToHex(c,2);  //on le stock dans HEX
    		if(HEX.Pos("FFFFFF"))
    		{HEX=HEX.SubString(7,2);}
    		ChaineHEX=ChaineHEX+HEX;
    		if(HEX=="9F"||HEX=="FFFFFF9F")
    		{ChaineHEX=(ChaineHEX.SubString(ChaineHEX.Length()-9,10));i=100;}
    	}
    	fichier.close();  // on ferme le fichier
    Avez vous une explication pour un débutant, je suis sous XE8
    Merci
    nota : si je mets unsigned à char c j'ai une erreur avec le fichier.get(c) deplus les 3caracteres que je veux lire sont après le '1A' donc comment l'éviter pour que le pointeur sur le fichier ne perde pas les pédales ?
    peut on lire un fichier en pointant directement à un endroit précis

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, premièrement j'ai formaté un peu le code (Ctrl+D) car sinon je ne comprends rien, le voici:
    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
        AnsiString HEX = "";
        AnsiString ChaineHEX = "";
        using namespace std;
        ifstream fichier(score.c_str(), ios::in); // on ouvre le fichier en lecture
     
        for(int i = 0; i < 100; i++)
        {
            char c;
            fichier.get(c); // on lit un caractère et on le stocke dans caractere
            HEX = IntToHex(c, 2); // on le stock dans HEX
            if(HEX.Pos("FFFFFF"))
            {
                HEX = HEX.SubString(7, 2);
            }
            ChaineHEX = ChaineHEX + HEX;
            if(HEX == "9F" || HEX == "FFFFFF9F")
            {
                ChaineHEX = (ChaineHEX.SubString(ChaineHEX.Length() - 9, 10));
                i = 100;
            }
        }
        fichier.close(); // on ferme le fichier
    Mes recommandations:
    1. Utilise les méthodes d'accès aux fichiers comme TFileStream pour lire du binaire.
    2. Au lieu de 'i = 100;' c'est pas un break; que tu veux faire pour cesser l'itération?
    3. Au lieu de d'utiliser char, je te conseil un truc comme System::Byte. C'est un unsigned char, mais c'est plus clair que c'est un byte de donnée.
    4. Personnellement je n'utilise jamais using je préfère toujours mettre le namespace devant.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Merci pour l'aide Crayon, il ne me reste plus qu'a régler se problème de lecture des ces 3 carateres pour finir mon prog.
    le break fonctionne
    J'ai bien créé un TFileStream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TFileStream *fichier;   // Declaration du pointer
    fichier = new TFileStream(score.c_str(), fmOpenRead);
    fichier->Position=0;
    j'ai bien déclaré c en Byte
    mais je le li comment ? fichier->Read(Pointer(c),i); ne fonctionne pas
    Merci.

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    fais attention avec les type de fichier par exemple dans ton code un char ne peut contenir qu'un caractère donc au maximum la valeur de 255
    tu fais un test totalement inopérant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(HEX == "9F" || HEX == "FFFFFF9F")
    dans un char un 9f est équivalent à "FFFFFF9F"

    petit exemple de code utilisant les FileStream de C++Builder

    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
     
    AnsiString HexValue, Resultat;
    	  char  Buffer[1]; // le buffer contenant un char;
    	  int FileLength;
    	  int pos = 0; // itérateur
    	  TFileStream *fichier; // Declaration du pointer
    	  fichier = new TFileStream("Nouveau.log", fmOpenRead); // ton fichierdoit se trouver dans le même répertoire que ton exe 
    	  FileLength = fichier->Size; // on renseigne la taille
    	  fichier->Seek(0, 0); // on positionne le stream au début;
    	  while (pos < FileLength) {
    		  fichier->ReadBuffer(Buffer, 1);
    		  HexValue = IntToHex(*Buffer, 2);
    		  Resultat=Resultat+HexValue;
    		  if (*Buffer==0x1a) {
    			  ShowMessage("match");  // à remplacer par ton traitement
    			  pos=FileLength+1;
    		   }
    		  pos++;
    	   }
    	   delete  fichier;
    par ailleurs que veux tu faire exactement avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChaineHEX = (ChaineHEX.SubString(ChaineHEX.Length() - 9, 10));
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Tu lis le fichier en mode texte alors que tu cherches des octets.
    Certains octets ne sont pas lisible en mode texte, par exemple :
    0x0D <=> CarriageReturn <=> '\n'
    0x0A <=> LineFeed <=> '\r'
    Et d'autres

    Quand on veut lire des octets, on se met en mode binaire et on lit des Bytes
    Quand on lire des caractères, on reste au mode caractère qui est par défaut, et on lit des Char.

    Il te faut lire le fichier en mode binaire par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ifstream fichier(score.c_str(), ios::in|ios::binary );  // on ouvre le fichier en lecture et en binaire
    Je ne connais pas C++Builder, il doit y avoir un équivalent pour TFileStream.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    par ailleurs que veux tu faire exactement avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChaineHEX = (ChaineHEX.SubString(ChaineHEX.Length() - 9, 10));
    je souhaite récupérer 3 caracteres qui se trouve avant le 00 9F

    Je vais adapter ton code et te tenir au informé
    deux questions pour comprendre
    1) est on obligé d'indiquer la taille du fichier sachant que la lecture n'est pas obligé d'aller à terme dans mon cas
    2) pos et fichier->Seek(0, 0); doivent obligatoirement être à zéro ou peut on commencer la lecture plus loin ?
    Merci pour ton aide

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    je viens d'adapter le code de DjmSoftware et cela fonctionne un GRAND MERCI

    le 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
    				  while (pos < FileLength)
    				  {
    					  fichier->ReadBuffer(Buffer, 1);
    					  HexValue = IntToHex(*Buffer, 2);
    					  if(HexValue.Pos("FFFFFF"))
    					  {HexValue=HexValue.SubString(7,2);}
     
    					  Resultat=Resultat+HexValue;
    					  if (HexValue=="9F")
    					  {
    						  //ShowMessage("match");  // à remplacer par ton traitement
    						  //pos=FileLength+1;
    						  Resultat=(Resultat.SubString(Resultat.Length()-9,10));
    						  break;
    					   }
    					  pos++;
    				   }
    					fichier->Free();  // on ferme le fichier
    juste une question pourquoi if (*Buffer==0x9f) ne fonctionne pas (la condition n'est jamais remplie)?
    et pourquoi par moment j'ai dans HexValue FFFFFF9F ou FFFFFFF8 au lieu de 9F et F8 ?

    Pour dalfab: je prend bonne note merci.

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    juste une question pourquoi if (*Buffer==0x9f) ne fonctionne pas (la condition n'est jamais remplie)?
    et pourquoi par moment j'ai dans HexValue FFFFFF9F ou FFFFFFF8 au lieu de 9F et F8 ?
    une petite erreur de ma part j'ai employé un char pour stocké les caractères lu
    un char est un entier signé --> 0x9F en signé est égal à -97 en décimal ce qui est naturellement pas égal à 0x9f ou 195 en décimal
    correction la variable buffer doit être de type unsigned char;

    1) est on obligé d'indiquer la taille du fichier sachant que la lecture n'est pas obligé d'aller à terme dans mon cas
    2) pos et fichier->Seek(0, 0); doivent obligatoirement être à zéro ou peut on commencer la lecture plus loin ?
    je ne connais pas la structure de ton fichier, mais comme je suppose que tu ne sais pas exactement ou se situe la partie de fichier que tu recherche il est fortement conseillé de faire une recherche depuis de début du fichier.


    fais attention de ne pas mélanger dans ton code du delphi et du c++ sous peine de le rendre incompréhensible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier->Free(); // delphi 
    delete fichier; // c++
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    OK
    Merci pour l'aide je met le post en résolu

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

Discussions similaires

  1. [WD12] Aide pour application de transfert de fichiers
    Par bruce207 dans le forum WinDev
    Réponses: 4
    Dernier message: 28/10/2009, 13h30
  2. aide pour lister les TCD du fichier
    Par chordially dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/07/2009, 09h41
  3. Réponses: 33
    Dernier message: 18/04/2009, 12h36
  4. Aide pour visualiser différences entre 2 fichiers
    Par Choupinou dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 11/05/2007, 09h35
  5. Réponses: 2
    Dernier message: 10/10/2006, 09h33

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