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 :

Besoin d'aide pour lire un .pgm


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut Besoin d'aide pour lire un .pgm
    Bonjour à tous,

    c'est mon premier message sur Developpez.net donc je ne sais pas trop comment ça se passe ^^

    J'ai un problème sur une petit programme, je doit lire une image.pgm et la retranscrire en changeant certaine valeur.

    Le problème est que je débute en C (Je suis orienté vers .Net qui est somme doute différent ^^) et la philosophie de ce langage m'est un peu difficile a comprendre

    Donc pour l'instant j'arrive a lire l’entête (Mon fichier est en p6) mais le reste des pixels étant en binaires, je n'arrive pas a le lire !

    Si vos âmes charitables sont capable de m'aider, je vous en serait très reconnaissant ^^

    (EDIT: Je dois passer exclusivement par C (Pas de C++) )
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    // Fonction Main
    int _tmain(int argc, _TCHAR* argv[])
    {
    	// Définitions des variables
    	unsigned char x[3];
    	char *chemin =(char*) malloc(255 * sizeof(char));
     
    	FILE* descr;
    	strcpy(chemin,"monCheminAbsolue/test.pgm");
     
    	printf("Chemin du fichier: %s \n",chemin);
     
    	// Ouverture du fichier
    	if(descr = fopen(chemin,"r+b"))
    	{
    		printf("Le fichier est ouvert \n");
    		while(!feof(descr))
    		{
    				fscanf(descr,"%s",x);
    				printf("Valeur: %s \n",x);
    		}
     
    	}
    	else
    	{
    		printf("non ouvert \n");
    	}
     
     
     
    	getchar();
    	// system("pause");
    	return 0;
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    voici un lien indiquant la spec du format
    http://netpbm.sourceforge.net/doc/pgm.html
    ou http://users.wpi.edu/~cfurlong/me-593n/pgmimage.html
    Les données peuvent être en plain text ou binaire apparemment.

    Commence par lire le header, la suite devrait venir toute seule.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut
    Merci pour la réponse, en faite, j'arrive déjà a lire le header mon fichier est en P6 (De p1 a p3 tu as du texte, de P4 a P6 du binaire) je doit pouvoir gérer n'importe quel type en faite

    EDIT: Mon programme me renvoi bien l’entête, mais n'arrive pas a lire le binaire CV image:

    http://imageshack.us/f/14/capturepbb.png/

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Première remarque : l'utilisation de foef() --> http://c.developpez.com/faq/index.ph...eneral#ES_feof

    Ensuite sur la lecture :
    • fscanf cherche a récupérer une chaine de caractères
    • lors de l'en-tête ASCII, il doit y arriver
    • lors du passage à la partie binaire, cela ne doit plus marcher
    • pour le vérifier, il faut tester la valeur retour de la fonction --> http://man.developpez.com/man3/fscanf.3.php
    • je mettrai un bemol sur l'utilisation de scanf et un buffer de 3 : si la chaine est plus grande, on n'écrit à des emplacements qui ne nous "appartiennent" pas. Voir la rubrique BOGUE sur la page de manuel :
      Citation Envoyé par man
      La conversion %s devrait toujours être accompagnée d'une longueur maximale de chaîne de caractères. En effet, il existe un risque de débordement de buffer, qui peut conduire à un trou de sécurité important dans un programme Set-UID ou Set-GID.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut
    Merci pour les pistes, comment peut-tu lire du binaire avec un fscanf?


    J'ai corrigé le code avec tes indications, en revanche la partie binaire n'est pas lu, mon fscanf lit du texte non du binaire, est il possible de lire plusieurs format avec un seul fscanf?

    Sachant que je j'ai lu, je ne sais plus ou que fopen() en mode "r+b" correspondait binaire.

    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
    51
    52
    53
     
     
    // Chargement des librairies
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    // Fonction Main
    int _tmain(int argc, _TCHAR* argv[])
    {
    	// Définitions des variables
    	unsigned char x[3];
    	char *chemin =(char*) malloc(255 * sizeof(char));
     
     
    	strcpy(chemin,"C:/Users/Hdes/Desktop/test.pgm");
    	FILE* descr = fopen(chemin,"r+b");
     
    	printf("Chemin du fichier: %s \n",chemin);
     
    	if (descr == NULL)
    	{
           printf("La fonction fopen a echoue.\n");
    	}
    	else
        {
    		int c;
            long taille = 0;
     
            while ((c = fgetc(descr)) != EOF)
            {
    			fscanf(descr,"%s",x);
    			printf("Valeur: %s \n",x);
                taille++;
            }
     
            if (feof(descr))
            {
                printf("Fin de fichier atteinte !\n");
                printf("La taille du fichier est : %ld octets.\n", taille);
            }
            else
            {
                if (ferror(descr))
                    printf("Arret du programme en raison d'une erreur de lecture !\n");
            }
    	}
     
    	getchar();
    	return 0;
    }

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Je présume que tes nombres sont stockées sur 8 bits. Cela correspond à un objet de type char, ce qui correspond à un format %c.

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

Discussions similaires

  1. Besoin d'aide pour lire un fichier Excel
    Par Sekigawa dans le forum C#
    Réponses: 7
    Dernier message: 04/03/2010, 13h46
  2. Besoin d'aide pour lire son avec SDL
    Par Spooky6900 dans le forum SDL
    Réponses: 1
    Dernier message: 28/02/2007, 18h12
  3. Besoin d'aide pour lire dans le registre
    Par Pierre.g dans le forum Windows
    Réponses: 6
    Dernier message: 16/08/2006, 22h37
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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