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 :

Erreur lecture d'ascii


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Par défaut Erreur lecture d'ascii
    Salut à tous,
    Cela fait maintenant quelques jours que j'essaie de résoudre un petit problème mais je n'y parviens toujours pas et je viens demander un peu d'aide aux âmes charitables se trouvant sur ce forum.

    J'ai déjà fait maints et maints recherches (google et autres et même sur ce forum) sans trouver une réponse appropriée.

    Voilà mon problème:
    J'ai besoin de charger un fichier PGM dans une zone mémoire afin de faire des traitements d'image dessus.
    Pour cela, j'ouvre un fstream sur mon image, je lit l'entête qui se compose ainsi

    P5
    x y
    z

    avec P5 = format du fichier (ici : contient de l'ASCII)
    x et y la taille de l'image (ex : 640 480)
    z la plage de codage du niveau de gris (généralement 255)

    Ensuite viennent les données ...
    Je les charge mais mon flot se coupe au milieu du chargement.
    J'ai regardé a l'aide d'un éditeur héxa jusqu'a quel moment il parvient à charger et il plante lorsqu'il rencontre le caractère 1B ou 0D qui correspondent aussi aux codes ESC et CR (echap et retour à la ligne)

    Comment faire pour éviter que ces caractères soit considerer comme ESC et CR mais juste leur valeur correspondant en décimal ... ???


    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
     
    ifstream fichier(filename);
    string trash;
    unsigned int nbc, nbl;
    if (fichier)
    {
       fichier>>trash;
       if (trash != "P5")
       {
    	cout<<"Format non reconnu, abandon !"<<endl;
    	exit(0);
       }
       fichier>>nbc;
       fichier>>nbl;
       fichier>>trash;
     
       allocate(nbc, nbl); // Méthode d'allocation de zone mémoire
     
       fichier.read((char *)((*this)[0]),nc*nl*sizeof(T)); // T etant le type de données (ici unsigned char)
     
       fichier.close();	
    }

  2. #2
    Nouveau candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut Problème de mode de lecture
    Je pense que ton fichier est ouvert en mode input or pour travailler sur des fichiers binaires comme tes fichiers image, tu dervrais plutôt l'ouvrir en mode binaire.

    Pour cela il faudrait utiliser la methode open de ifstream:

    ifstream fichier;
    fichier.open(nom_de_fichier, ifstream::binary);

    Je ne sais pas si on peut faire ça en une seule ligne (si le constructeur de ifstream est surchagé de la façon suivante):

    ifstream(nom_de_fichier, ifstream::binary);

    En tout cas les deux lignes précédentes devraient marcher je pense...

  3. #3
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Il semble que ce format de fichier soit binaire.
    Pour le lire il faudra utiliser un fstream:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fstream f;
    f.open(nomDuFichier,ios::binary|ios::in);
    Les premiers octets du fichier sont en ascii. Tu devras donc les lire par des read comme pour la partie donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char car;
    f.read((char*)&car,1);
    A toi de traiter
    • les marques de fin de ligne 1 ou 2 octets
    • concaténer les chars lus dans des chaînes
    • convertir les chaines en valeurs numériques
    La suite du fichier est codée en binaire: Ta méthode de lecture est donc bonne...
    Bonne journée

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Par défaut
    C'est bon ca marche, je vous remerci les gars, j'avais juste besoin d'ouvrir en mode binaire avec ios_base::binary.

    C'est super !
    Merci bien

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

Discussions similaires

  1. [C#]Erreur lecture flux http et ecriture fichier
    Par f.colo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/01/2012, 10h40
  2. Erreur lecture disque
    Par flo456 dans le forum Composants
    Réponses: 3
    Dernier message: 11/05/2007, 22h18
  3. Erreur lecture fichier avi
    Par ooyeah dans le forum Windows XP
    Réponses: 4
    Dernier message: 11/04/2007, 22h19
  4. lecture fichiers ASCII avec séparateur
    Par thierry007 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 11/04/2007, 13h25
  5. Erreur lecture tableau WMI
    Par BATiViR dans le forum Delphi
    Réponses: 15
    Dernier message: 10/04/2007, 21h54

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