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 :

pb : caractere en trop lors de la lecture d'un fichier binaire


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut pb : caractere en trop lors de la lecture d'un fichier binaire
    voila je vous solicite a nouveau pour un probleme que j'ai évoqué dans un message précédent mais ce n'était pas le sujet. dc voila j'essaye de lire des fichiers binaires dont le contenu est affiché sous forme de caracteres ascii et d'afficher ces caracteres dans un editbox. j'utilise le programme suivant pour lire chacun des fichier :

    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
     
    void Read(HWND Dlg, char fileName[501])
    {
    	//ouverture
    	ifstream is(fileName, ios_base::binary|ios_base::in);
     
    	char * buffer = NULL;
     
    	//recherche de la longueur
    	is.seekg(0, ios::end);
    	ifstream::pos_type length = is.tellg();
    	assert(length >= 0); 
     
    	//Reading
    	is.seekg(0, ios::beg);	
    	buffer = new char[length];
    	is.read(buffer, length);
     
    	Purity(buffer, length);
     
    	//Post in the editbox (IDC_TEXT)
    	SetDlgItemTextA(Dlg,IDC_TEXT, buffer);	
            delete[] buffer;
    }
    la fonction Purity est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Purity(char *s, size_t taille)
    {
    	for(int i=0 ; i<taille-1 ; i++)
    	{
    		char c = s[i];
    		//Change juste le caractère de contrôle NUL
    		//Laisse les caractères étendus (-128~-1 ou 128~255) inchangés.
    		if(c==0)
    			s[i] = '.';
    	}
    }
    mon probleme est le suivant :
    le programme m'affiche systematiquement des caracteres en trop comme ýýýýÝÝÝÝÝÝÝA ou ýýýýÝÝÝÝ ou encore ýýýýÝÝQ ça change pour chaque fichier et je ne comprend pas d'ou ça vient.
    est ce que quelqu'un peut m'aider??
    merci d'avance!

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Si je peux me permettre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Purity(char *s, size_t taille)
    ça fait longtemps que je n'avais pas vu de fonction prenant en paramètre la taille de l'objet en question...
    J'aurai bien vu un std::vector au moins !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int i=0 ; i<taille-1 ; i++)
    Pourquoi taille - 1 ? Tu vas rater un élément. Avec un vector et un itérateur au moins tu te planteras pas...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    oui dsl pr le taille-1 c'étai un test que j'avais oublié d'enlever normalement c'est bien taille et pas taille-1.
    effectivement j'avais pa pensé au vecteurs, je vais essayer
    merci

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    De rien.
    Par contre, est-ce que tu pourrais nous montrer l'écriture du fichier. Parce que ton code n'est peut être pas très beau, mais il est juste.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    ouai pas de probleme, voila l'exemple du contenu d'un des fichiers :

    en voila un autre qui ne contient qu'un caractere (visible) et une serie de blanc et de retour a la ligne


    j'ai pris les deux plus court. normalement, du moins lorsque j'ouvre ces fichiers avec le bloc note, les caracteres sont écrits en ligne, sans retour a la ligne. c'est lorsque je colle leurs contenu ici sur le forum que les caracteres spéciaux prennent effet.
    et donc mon programme les affiche correctement en ligne avec les caracteres en plus a la suite, caractere dont j'ai parlé dans mon 1er msg

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ton fichier ne se termine pas par 0 !
    Il se termine par le dernier caractère... Du coup, le SetDlgItemText va chercher la fin de la chaine (qui est 0) et ne la trouvera nulle part !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Reading
    is.seekg(0, ios::beg);	
    buffer = new char[length+1];
    is.read(buffer, length);
    buffer[length] = 0;
    Tu as d'ailleurs bien de la chance de ne pas avoir eu un seg-fault (quoique ce soit plus rare en lecture).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    ok je vois ce que tu veux dire, c'est normal dans ce cas qu'il m'affiche des caracteres en trop. par contre il me met l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    error C2666: '+' : 2 overloads have similar conversions
    pour la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    buffer = new char[length+1];

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream::pos_type length = is.tellg();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long length = is.tellg() ;

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    oui effectivement en remplaçant cette ligne ça marche nickel
    merci a tous!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2011, 15h38
  2. Réponses: 15
    Dernier message: 31/03/2007, 16h32
  3. Problème lors de la lecture d'un fichier avec Input...
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 18/11/2005, 18h55
  4. Probleme de BIP lors de la lecture d'un fichier
    Par GroRelou dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/09/2005, 10h12
  5. Réponses: 14
    Dernier message: 30/03/2005, 21h50

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