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 :

problème de printf: n'affiche rien


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut problème de printf: n'affiche rien
    je ne suis trop c.
    plus java et c++. j'ai fais du c juste en cours avec des petits exo académique et ca ma toujours paru obsolete mais je veux faire un petit truc et je suis un sur un os. j'ai surtout besoin d'un explication sur ce code.
    voici le code en entier. essayez!!!
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
     
    typedef struct enteteFichier enteteFichier;
          struct enteteFichier{
             char format [2];					//La signature  indiquant le fichier BMP
             unsigned int sizeFichier;					//La taille totale du fichier en octets 
             unsigned int reserve;						//reservé
             unsigned int BMP_Off;						//offset: adresse de début de l'image
          };
     
    typedef struct enteteImage enteteImage;
          struct enteteImage{
              unsigned int sizeEnteteImage;			//taille de l'entète de l'image
              unsigned int BMP_Width;				//largeur de l'image en pixel
              unsigned int BMP_Height;				//hauteur de l'image en pixel
              unsigned short planes;					//Le nombre de plans  vaut toujours 1
              unsigned short bits_per_pixel;			//nombre de bit pour le codage de la couleur
              unsigned int compression;              //méthode de compression
              unsigned int sizeImage;				//La taille totale de l'image en octets
              unsigned int horiz_resolution;			//nombre de pixels par mètre horizontalement 
              unsigned int vert_resolution;			//nombre de pixels par mètre verticalement
              unsigned int color_used;				//Le nombre de couleurs de la palette
              unsigned int important_color;			//Le nombre de couleur important
          }; 
          typedef struct sCoul sCoul;
          struct sCoul{
           unsigned char R;
           unsigned char V;
           unsigned char B;
          };
     
          enteteFichier RecupEnteteFichier(FILE *fpin);
          enteteFichier RecupEnteteFichier(FILE *fpin){
        	  		   		enteteFichier E1;
        	  		   		fread(&E1.format,2,1,fpin);
        	  		   		fread(&E1.sizeFichier,4,1,fpin);
        	  		   		fread(&E1.reserve,4,1,fpin);
        	  		   		fread(&E1.BMP_Off,4,1,fpin);
        	  		   		return E1;  
          }
     
     
          enteteImage RecupEnteteImage(FILE *fpin);
          enteteImage RecupEnteteImage(FILE *fpin){
              	  		   	enteteImage E1;
              	  		   	fread(&E1.sizeEnteteImage,4,1,fpin);
              	  		   	fread(&E1.BMP_Width,4,1,fpin);
              	  		   	fread(&E1.BMP_Height,4,1,fpin);
              	  		   	fread(&E1.planes,2,1,fpin);
              	  		   	fread(&E1.bits_per_pixel,2,1,fpin);
              	  		   	fread(&E1.compression,4,1,fpin);
              	  		   	fread(&E1.sizeImage,4,1,fpin);  
              	  		   	fread(&E1.horiz_resolution,4,1,fpin);
              	  		    fread(&E1.vert_resolution,4,1,fpin);  
              	  		    fread(&E1.color_used,4,1,fpin);
              	  	        fread(&E1.important_color,4,1,fpin);
              	  		   	return E1;  
                }
     
     
          int main ()
          {
     
        	  printf("Entrez le nom de l'image:  ");
                  char *nomFichier;
                  int i=0,j=0;
                  FILE* f;
                  FILE* newFile;
                  enteteFichier EF;
                  enteteImage EI;
                  sCoul *couleurs=NULL;
                  sCoul *newColors=NULL;
     
                  printf("Entrez le nom de l'image:  ");
                  scanf("%s",&nomFichier);
                  strcat(nomFichier,".bmp");
                  printf("%s\n",nomFichier);
                  f = fopen(nomFichier,"rb");
     
                  if (f == NULL){
                	  printf ("Erreur ...");
                	  exit(-1);
                  }
     
                  //recuperation de l'entete jusqu'a la longeur en pixels
                   EF = RecupEnteteFichier(f);
                   EI = RecupEnteteImage(f);    
                   //pour commencer au debut de l'image
                   fseek(f, EF.BMP_Off, SEEK_SET);
                   i=0;
                   // allocation dynamique
                   couleurs=malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
                   while (!feof(f)){
                         // ici ca foire
                         fread(&couleurs[i], sizeof(sCoul), 1,f);
                         //les 10 premieres valeurs sont negatives !
                         if(i>=0&&i<11)
                         printf("%d\n",couleurs[i].B );
                         i++;
                   }           
                   fclose(f); 
                   newColors=malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
                  //modification des pixels  c'est juste pour tester
                   while (j<i){
                	   newColors[j].R=255-couleurs[j].R;
                	   newColors[j].V=255-couleurs[j].V;
                	   newColors[j].B-=255-couleurs[j].B;
                	   if(j>=0&&j<11)
                	   printf("%d\n",couleurs[j].B );
                	   j++;
                   }
     
                  // je crée mon nouveau fichier
                  newFile = fopen("Resu.bmp", "wb");
                  if (newFile == NULL){
                	  printf ("Erreur ...");
                	  exit(-1);  
                  }
     
                  fwrite(&EF, sizeof(enteteFichier),1,newFile);
                  fwrite(&EI, sizeof(enteteImage),1,newFile);
                  //doi je metre la pallette ??
                  j=0;
                  while(j<i){
                         fwrite(&newColors[j], sizeof(sCoul),1,newFile);
                         j++;
                  }  
     
                  fclose(newFile);   /* ajoute EOF au fichier et ferme le fichier */
                  // affichage de l'entete
                  printf("ENTETE DU FICHIER\n\n"); 
                  printf("Format: %c%c\n",EF.format[0],EF.format[1]);
                  printf("taille: %d octets\n",EF.sizeFichier);
                  printf("reservé: %d octets\n",EF.reserve);
                  printf("BMP_Off: %d octets \n",EF.BMP_Off);
                  printf("\nENTETE DE L'IMAGE\n\n");
                  printf("taille de l'entète de l'image: %d octets\n",EI.sizeEnteteImage);
                  printf("BMP_Height: %d pixels\n",EI.BMP_Height);
                  printf("BMP_Width: %d pixels\n",EI.BMP_Width);
                  printf("Le nombre de plans: %d \n",EI.planes);
                  printf("nombre de bit par pixel: %d bits\n",EI.bits_per_pixel);
                  printf("méthode de compression: %d \n",EI.compression);
                  printf("Taille total de l'image: %d octets\n",EI.sizeImage);
                  printf("Résolution horizontale: %d \n",EI.horiz_resolution);
                  printf("Résolution verticale: %d \n",EI.vert_resolution);
                  printf("Nombre de couleur utilisé: %d \n",EI.color_used);
                  if(EI.color_used!=0)printf("Nombre de couleur important: %d \n",EI.important_color);
                  printf("\n appuyez sur une touche\n");
                  printf("taille d'un entier  %d \n",sizeof(int));
                  printf("taille d'un char  %d \n",sizeof(char));
                  printf("taille d'un short  %d \n",sizeof(short));
                  printf("taille d'un sCoul  %d \n",sizeof(sCoul));
                  printf("taille d'un enteteFichier  %d \n",sizeof(enteteFichier));
                  printf("taille d'un enteteImage  %d \n",sizeof(enteteImage));
     
                  getch();
              return EXIT_SUCCESS;
     
          }
    le texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Entrez le nom de l'image:  ");
    ne s'affiche pas et je l'ai mis a deux reprises mais rien. whiy?

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Il faut savoir que le flux stdout (celui sur lequel écrit printf) est bufferisé.

    Le texte s'affichera si et seulement si l'une de ces conditions est remplies :
    - le vidage du flux est forcé par une instruction du type fflush
    - ou le texte contient un retour à la ligne \n
    - ou le buffer est plein.

    Ajoute donc \n à la fin de ton texte.

  3. #3
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut
    malgrés le \n rien ne se passe, le PB demeure.
    lorsque je lance mon prog. rien ne s'affiche c'est je tape quand même le nom du du fichier (puisque je sais ce que fait le prog) et toujours rien. ce n'es que lorsque je décide de mettre fin au programme en utilisant mon IDE que j'ai les résultats.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Normalement, ça aurait dû marcher.

    Dans ce cas, essaye : fprintf(stderr, "ton messsage");
    Ou bien ajoute un : fflush(stdout); après la ligne...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    tu as mis un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Entrez le nom de l'image:  ");
    avant la déclaration des variables ....

    et tu remets après ....

    enlève la commande avant la déclaration des variables et ça devrait marcher

  6. #6
    Expert confirmé
    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
    Par défaut
    Il y a bien plus grave : ton programme se détruit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                   char *nomFichier;
     ....
                  scanf("%s",&nomFichier);
    le format %s fait lire une chaîne de caractères. Il faut donc pour l'argument correspondant avoir un tableau pour ranger les caractères lus. Or dans ton code, tu passes l'adresse d'un pointeur !!! Ce qui fait que tu es limité à la taille d'un pointeur, typiquement 4. Au dela, tu écris dans une zone non réservée et le programme plante (si tu es chanceux) ou son comportement devient erratique et imprévisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                   char  nomFichier[128];//la taille doit être suffisante
     ....
                  scanf("%s",nomFichier);

  7. #7
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut
    Il y a bien plus grave : ton programme se détruit :
    Code :
    char *nomFichier;
    ....
    scanf("%s",&nomFichier);
    diogène ta raison mais ça ne marche toujours pas.
    voici le main actuel
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    int main ()
          {
     
                  char nomFichier[10];
                  int i=0,j=0;
                  FILE* f;
                  FILE* newFile;
                  enteteFichier EF;
                  enteteImage EI;
                  sCoul *couleurs; //=NULL;
                  sCoul *newColors; //=NULL;
                  fflush(stdout);
                  printf("Entrez le nom de l'image:  \n");
                  scanf("%s",nomFichier);
                  strcat(nomFichier,".bmp");
                  printf("%s\n",nomFichier);
                  f = fopen(nomFichier,"rb");
     
                  if (f == NULL){
                	  printf ("Erreur ...");
                	  exit(-1);
                  }
     
                  //recuperation de l'entete jusqu'a la longeur en pixels
                   EF = RecupEnteteFichier(f);
                   EI = RecupEnteteImage(f);    
                   //pour commencer au debut de l'image
                   fseek(f, EF.BMP_Off, SEEK_SET);
                   i=0;
                   // allocation dynamique
                   couleurs=(sCoul *)malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
                   while (!feof(f)){
                         // ici ca foire
                         fread(&couleurs[i], sizeof(sCoul), 1,f);
                         //les 10 premieres valeurs sont negatives !
                         if(i>=0&&i<11)
                         printf("%d\n",couleurs[i].B );
                         i++;
                   }           
                   fclose(f); 
                   newColors=(sCoul *)malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
                  //modification des pixels  c'est juste pour tester
                   while (j<i){
                	   newColors[j].R=255-couleurs[j].R;
                	   newColors[j].V=255-couleurs[j].V;
                	   newColors[j].B-=255-couleurs[j].B;
                	   if(j>=0&&j<11)
                	   printf("%d\n",couleurs[j].B );
                	   j++;
                   }
     
                  // je crée mon nouveau fichier
                  newFile = fopen("Resu.bmp", "wb");
                  if (newFile == NULL){
                	  printf ("Erreur ...");
                	  exit(-1);  
                  }
     
                  fwrite(&EF, sizeof(enteteFichier),1,newFile);
                  fwrite(&EI, sizeof(enteteImage),1,newFile);
                  //doi je metre la pallette ??
                  j=0;
                  while(j<i){
                         fwrite(&newColors[j], sizeof(sCoul),1,newFile);
                         j++;
                  }  
     
                  fclose(newFile);   /* ajoute EOF au fichier et ferme le fichier */
                  // affichage de l'entete
                  printf("ENTETE DU FICHIER\n\n"); 
                  printf("Format: %c%c\n",EF.format[0],EF.format[1]);
                  printf("taille: %d octets\n",EF.sizeFichier);
                  printf("reservé: %d octets\n",EF.reserve);
                  printf("BMP_Off: %d octets \n",EF.BMP_Off);
                  printf("\nENTETE DE L'IMAGE\n\n");
                  printf("taille de l'entète de l'image: %d octets\n",EI.sizeEnteteImage);
                  printf("BMP_Height: %d pixels\n",EI.BMP_Height);
                  printf("BMP_Width: %d pixels\n",EI.BMP_Width);
                  printf("Le nombre de plans: %d \n",EI.planes);
                  printf("nombre de bit par pixel: %d bits\n",EI.bits_per_pixel);
                  printf("méthode de compression: %d \n",EI.compression);
                  printf("Taille total de l'image: %d octets\n",EI.sizeImage);
                  printf("Résolution horizontale: %d \n",EI.horiz_resolution);
                  printf("Résolution verticale: %d \n",EI.vert_resolution);
                  printf("Nombre de couleur utilisé: %d \n",EI.color_used);
                  if(EI.color_used!=0)printf("Nombre de couleur important: %d \n",EI.important_color);
                  printf("\n appuyez sur une touche\n");
                  printf("taille d'un entier  %d \n",sizeof(int));
                  printf("taille d'un char  %d \n",sizeof(char));
                  printf("taille d'un short  %d \n",sizeof(short));
                  printf("taille d'un sCoul  %d \n",sizeof(sCoul));
                  printf("taille d'un enteteFichier  %d \n",sizeof(enteteFichier));
                  printf("taille d'un enteteImage  %d \n",sizeof(enteteImage));
     
                  getch();
              return EXIT_SUCCESS;
     
          }
    je crois que je ne déborde pas la taille de la chaine de caractère. car j'entre simplement BMP. et même j'ai mis un fflush(stdout) avant la printf mais rien n'y fait!

Discussions similaires

  1. Problème System.out.print n'affiche rien
    Par lyonnais784 dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 21/09/2013, 19h24
  2. printf() n'affiche rien
    Par silma dans le forum Débuter
    Réponses: 4
    Dernier message: 05/03/2012, 12h27
  3. printf n'affiche rien sur l'ecran
    Par M77ATTAR dans le forum C
    Réponses: 1
    Dernier message: 17/09/2011, 19h21
  4. [SDL allié à OpenGL] Problème l'écran n'affiche rien
    Par Harlock le Fléau dans le forum SDL
    Réponses: 5
    Dernier message: 04/11/2010, 14h16
  5. problème liste déroulante qui n'affiche rien
    Par edonist dans le forum IHM
    Réponses: 5
    Dernier message: 28/08/2008, 21h09

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