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 :

Remplir un fichier binaire à partir d'une image


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Remplir un fichier binaire à partir d'une image
    Bonjour,

    j'ai besoin de copier les données de mon image bmp, vers un fichier binaire,
    bon j'utilise, pour ce faire, ce code écrit en C:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
      FILE *image=fopen("my_image.bmp","rb");
     if(image == NULL)
      {
        printf("Le fichier image nexiste pas\n");
      }
     else
      {
        printf("Le fichier image existe et est ouvert en lecture seule \n");
      }
      fclose (image);
     FILE *fp=fopen("my_file.dat","wb");
     if(fp == NULL)
      {
        printf("Le fichier n'existe pas\n");
      }
     else
      {
        printf("my_file existe et est ouvert en ecriture\n");
      }
      fclose (fp);
      int i=0;
      unsigned char v;
      while (!feof(image))
      {
           fread (&v, 1, 1, image);
           fwrite (&v, 1, 1, fp);
           i+=1;
      }
      printf("Stop a la Lecture numero %d", i);
      return 0;
    }
    Le problème est que le dernier message n'est jamais affiché, donc l'exécution se bloque dans la boucle while, est ce normal?
    En plus, le fichier binaire est toujours vide de données ..

    NB: L'ouverture des deux fichiers se fait avec succès.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    NB: L'ouverture des deux fichiers se fait avec succès.
    Mais comme tu les as fermés (lignes 16 et 26) avant les fread() et fwrite()....

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par diogene Voir le message
    Mais comme tu les as fermés (lignes 16 et 26) avant les fread() et fwrite()....
    Je sais ça parait bizarre, mais.....quand je les ai laissé ouverts, j'ai eu cette erreur lors de l'exécution au niveau de fread:

    l'instruction à 0X******* emploie l'adresse mémoire "0X00000000". La mémoire ne peut pas être "written".

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ceci n'empèche pas que les fichiers doivent rester ouverts si on veut s'en servir !

    Je ne vois pas dans ce code la cause de l'erreur que tu signales. Poste le code fautif.

    Accessoirement, il est préférable de tester le retour de fread() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (fread (&v, 1, 1, image)==1)
    {
           fwrite (&v, 1, 1, fp);
           i+=1;
    }
    fclose(image);
    fclose(fp);
    feof() doit servir à déterminer si l'échec de la lecture est due à une fin de fichier ou à une erreur de lecture.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Merci bien, je viens de le résoudre,
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
      unsigned char v[1024];
      size_t ret;
     
      FILE *image=fopen("my_image.bmp","rb");
     if(image == NULL)
      {printf("Le fichier image nexiste pas\n");}
     else
      {printf("Le fichier image existe et est ouvert en lecture seule \n");}
     
     FILE *fp=fopen("my_file.dat","wb");
     if(fp == NULL)
      {printf("Le fichier n'existe pas\n");}
     else
      {printf("my_file existe et est ouvert en ecriture\n");}
     
      ret = fread (v, sizeof(unsigned char), 1024, image);
      while (ret)
      {
        fwrite (v, sizeof(unsigned char), ret, fp);
        ret = fread (v, sizeof(unsigned char), 1024, image);
      }
     
      fclose (image);
      fclose (fp);
      return 0;
    }

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Il y a un soucis dans ton code. Si l'ouverture d'au moins un des deux fichiers échoue, ton programme continue...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ret = fread (v, sizeof(unsigned char), 1024, image);
      while (ret)
      {
        fwrite (v, sizeof(unsigned char), ret, fp);
        ret = fread (v, sizeof(unsigned char), 1024, image);
      }
    Il y a moyen d'optimiser ici.

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

Discussions similaires

  1. creer un fichier lib à partir d'une DLL
    Par benoit70 dans le forum MFC
    Réponses: 12
    Dernier message: 28/09/2008, 22h58
  2. Réponses: 7
    Dernier message: 07/07/2008, 11h18
  3. Réponses: 3
    Dernier message: 27/01/2005, 10h53
  4. Remplir un fichier binaire de BITS !!!!
    Par ben13 dans le forum C
    Réponses: 98
    Dernier message: 08/01/2005, 19h38
  5. Effacer le contenu d'un fichier a partir d'une ligne
    Par localhost dans le forum Linux
    Réponses: 3
    Dernier message: 04/04/2004, 04h47

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