Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2820 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probleme avec fgets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme avec fgets

n°897551
Chronoklaz​m
Posté le 13-11-2004 à 15:35:29  profilanswer
 

En essayant de comprendre le truc avant de crée ma boucle
je n'arrive pas a remplir un tableau de char avec fgets :
 

Code :
  1. int main(int argc, char *argv[]){
  2. /* TODO: tchopper le tableau */
  3. if(argc != 2){
  4.  printf("\n\nERREUR : vous n'avez pas specifiez de parametres !\n\n" );
  5.  exit(1);
  6. }
  7. FILE *fp;
  8. char w[30];
  9. char h[30];
  10. char inutile[60];
  11. char bits[512];
  12. if ((fp = fopen(argv[1] , "r" )) == NULL)
  13.  printf("\n\nERREUR : impossible d'ouvrir le fichier %s !\n\n",argv[1]);
  14. else{
  15.  fgets(w,30,fp);
  16.  fgets(h,30,fp);
  17.  fgets(inutile,60,fp);
  18.                
  19. /* A partir de la les lignes font max 75 caracteres chancunes */
  20.           fgets(&bits[0],75,fp);
  21.  bits[74]='\n';
  22.  fgets(&bits[75],75,fp); /* Devrait chopper la 5ieme ligne et la mettre dans bits à partir de l'indice 75 */
  23. }
  24. printf("%s\n",w); /* Premiere ligne */
  25. printf("%s\n",h); /* Deuxieme ligne */
  26. printf("%s\n",inutile); /* Troisieme ligne */
  27. printf("%s\n",bits); /* Affiche la 4ieme ligne */
  28. printf("%c\n",bits[75]); /* Affiche des conneries */
  29. /*  fclose(fp); */
  30. return 0;
  31. }


 
Le probleme est que le deuxieme appel a fgets (fgets(&bits[75],75,fp))
sur le tableau bits à l'air de pas marcher, alors que le premier  
marche impec.  :fou:  :fou:  :fou:


Message édité par Chronoklazm le 13-11-2004 à 15:47:15
mood
Publicité
Posté le 13-11-2004 à 15:35:29  profilanswer
 

n°897580
blurk
Posté le 13-11-2004 à 16:15:34  profilanswer
 

Citation :


printf("%s\n",bits); /* Affiche la 4ieme ligne */
printf("%c\n",bits[75]); /* Affiche des conneries */


 
Y'aurait pas un petit "%c" à la place de "%s" par ici ? ;)

n°897589
Chronoklaz​m
Posté le 13-11-2004 à 16:26:27  profilanswer
 

Non je ne crois pas, puisque j'affiche un element du tableau bits qui est un char je met donc %c et non %s et l'inverse pour la ligne precedante.
 
Si je fais printf("%c\n",bits[73]) j'obtient le dernier caractere  
de la 4ieme ligne donc le premier appel a fgets marche nikel c'est apres
que ca beug.


Message édité par Chronoklazm le 13-11-2004 à 16:28:13
n°897600
blurk
Posté le 13-11-2004 à 16:55:02  profilanswer
 

Ah oui au temps pour moi...
Je croyais que tu voulais faire un truc du genre :
printf ("%s\n", bits + 75);

n°897625
matafan
Posté le 13-11-2004 à 17:56:21  profilanswer
 

Teste la valeur de retour de tes fgets.

n°897626
Chronoklaz​m
Posté le 13-11-2004 à 18:01:20  profilanswer
 

Ca renvoi un pointeur vers un char.
 
Comment je pourrais convertir par exemple la chaine "16" en un
int 16 ?


Message édité par Chronoklazm le 13-11-2004 à 18:05:14
n°897628
matafan
Posté le 13-11-2004 à 18:08:42  profilanswer
 

Ca renvoit surtout NULL en cas d'erreur. Pour le "16", utilise sprintf ou strtol. Evites les fontions atoi/atol/atoll, qui ne permettent pas de détecter les erreurs.

n°897673
Chronoklaz​m
Posté le 13-11-2004 à 19:28:47  profilanswer
 

merci matafan ! Bon j'ai fait le bourin, j'ai utilisé atoi  :whistle:
et maintenant j'arrive a recuperer la hauteur et la largeur   :bounce:  
 
Mais le boss de fin est tres coriace : En ayant des chaines de caracteres
par exemple "0x18" ce qui represente enfaite un valeure hexadecimale,  
laquelle je dois convertir en unsigned char.  :sweat:  
 
Quelqu'un a un flingue ? :cry:


Message édité par Chronoklazm le 13-11-2004 à 19:32:00
n°897697
matafan
Posté le 13-11-2004 à 19:50:25  profilanswer
 

strtol et sscanf permettent de traiter l'hexa (d'ailleurs dans mon post précédent je voulais dire sscanf, pas sprintf).

n°897754
Chronoklaz​m
Posté le 13-11-2004 à 20:52:07  profilanswer
 

Bon, POURQUOI CA BEUG ???????
 

Code :
  1. int main(int argc, char *argv[]){
  2. /* TODO tchopper le tableau */
  3. if(argc != 2){
  4.  printf("\n\nERREUR : vous n'avez pas specifiez de parametres !\n\n" );
  5.  exit(1);
  6. }
  7. FILE *fp;
  8. int w,h,c=0,i=0,taille;
  9. int cmpt=0;     /* Compteur d'espaces */
  10. char bits[512]; /* TABLEAU OU l'ON STOCKE LE FICHIER */
  11. static char buffer[2]; /* buffer pour w et h LES DIMENSIONS NE DOIVENT PAS DEPASSER UN NOMBRE A DEUX CHIFFRES */
  12. static char buffer1[4]; /* buffer pour les elements du tableau */
  13. unsigned char *tab;
  14. if ((fp = fopen(argv[1] , "r" )) == NULL)
  15.  printf("\n\nERREUR : impossible d'ouvrir le fichier %s !\n\n",argv[1]);
  16. else{
  17.  while( !feof(fp) ){ /* On stocke tous le fichier dans untableau de char */
  18.    bits[c]=(char)fgetc(fp);
  19.    c++;
  20.  }
  21. }
  22. /* TODO rechercher la valeur de width; apres les deux espace de la premiere ligne on a la largeur */
  23. while(cmpt != 2){ /* Parcours des 2 espaces */
  24.  if(bits[i] == ' ')
  25.   cmpt++;
  26.  i++;}
  27. if(bits[i+1] == '\n'){ /* On recupere la largeur */
  28.  w=bits[i]-'0';
  29.  i++;}
  30. else{
  31.  buffer[0]=bits[i];
  32.  buffer[1]=bits[i+1];
  33.  w=atoi(buffer);
  34.  i=i+2;}
  35. cmpt = 0; /* on remet le compteur des espaces a 0 */
  36. printf("%d",w); /* ON A LA LARGEUR HOURAAA */
  37. /* TODO rechercher la valeur de height; apres les deux espace de la deuxieme ligne on a la hauteur */
  38. while(cmpt != 2){ /* Parcours des 2 espaces */
  39.  if(bits[i] == ' ')
  40.   cmpt++;
  41.  i++;}
  42. if(bits[i+1] == '\n'){ /* On recupere la hauteur */
  43.  h=bits[i]-'0';
  44.  i++;}
  45. else{
  46.  buffer[0]=bits[i];
  47.  buffer[1]=bits[i+1];
  48.  h=atoi(buffer);
  49.  i=i+2;}
  50. printf("%d", h); /* ON A LA HAUTEUR HOURAAA */
  51. /* ON RESERVE LESPACE POUR LE TABLEAU A AFFICHER */
  52. taille=(w+1)*h;
  53. tab = (unsigned char *)calloc(taille, sizeof(unsigned char));
  54. i++; /* On incremente i pour passer le '\n' de la deuxieme ligne */
  55. /* TODO  TCHOPPER LES LEMENTS DU TABLEAU */
  56. while(bits[i] != '\n'){ /* Parcours de la ligne inutile */
  57.  i++;}
  58. i=i+4; /* On saute le saut de ligne de la 3ieme ligne et les 3 premiers espaces de la 4ieme ligne */
  59. cmpt=0; /* On remet le compteur a 0 */
  60.     c=0;   /* On reutilise c pour parcourir le tableau tab */
  61. printf("%c",bits[i]);
  62. /*printf("%d",strtoul(bits[i],bits+3,16));*/
  63. while((c==taille) || (bits[i] != '}')){ /* Jusqua la l'accolade fermante */
  64.  if(bits[i] == '\n')/* espaces de debut de ligne */
  65.   i=i+4;
  66.  if(bits[i] == ',') /* espace entre les elements */
  67.   i=i+2;
  68.  buffer1[0]=bits[i];    /* On stocke le mot dans un buffer */
  69.  buffer1[1]=bits[i+1];
  70.  buffer1[2]=bits[i+2];
  71.  buffer1[3]=bits[i+3];
  72.  i=i+3; /* on a bufferisé les 4 caracteres */
  73.        
  74.  tab[c]=(unsigned char)strtoul(buffer1,NULL,16); /* On convertit la chaine en hex */
  75.  c++;
  76. }
  77. printf("%x", tab[0]);
  78. /*  fclose(fp); */
  79. return 0;
  80. }


 
J'en ai trop marre  :pt1cable:  :pt1cable:

mood
Publicité
Posté le 13-11-2004 à 20:52:07  profilanswer
 

n°897844
Chronoklaz​m
Posté le 13-11-2004 à 23:28:59  profilanswer
 

Episode 30098, je suis entrain de rentrer dans la matrice  :ouch:  
apres avoir subi une violente attaque du coté des buffer declaré static
j'ai corrigé quelque bugs :
 

Code :
  1. int main(int argc, char *argv[]){
  2. /* TODO tchopper le tableau */
  3. if(argc != 2){
  4.  printf("\n\nERREUR : vous n'avez pas specifiez de parametres !\n\n" );
  5.  exit(1);
  6. }
  7. FILE *fp;
  8. int w,h,c=0,i=0,taille;
  9. int cmpt=0;     /* Compteur d'espaces */
  10. char bits[512]; /* TABLEAU OU l'ON STOCKE LE FICHIER */
  11. static char buf1[2]; /* buffer pour w et h LES DIMENSIONS NE DOIVENT PAS DEPASSER UN NOMBRE A DEUX CHIFFRES */
  12. static char buf2[4]; /* buffer pour les elements du tableau */
  13. unsigned char *tab;
  14. if ((fp = fopen(argv[1] , "r" )) == NULL)
  15.  printf("\n\nERREUR : impossible d'ouvrir le fichier %s !\n\n",argv[1]);
  16. else{
  17.  while( !feof(fp) ){ /* On stocke tous le fichier dans untableau de char */
  18.    bits[c]=(char)fgetc(fp);
  19.    c++;
  20.  }
  21. }
  22. /* TODO rechercher la valeur de width; apres les deux espace de la premiere ligne on a la largeur */
  23. while(cmpt != 2){ /* Parcours des 2 espaces */
  24.  if(bits[i] == ' ')
  25.   cmpt++;
  26.  i++;}
  27. if(bits[i+1] == '\n'){ /* On recupere la largeur */
  28.  w=bits[i]-'0';
  29.  i++;}
  30. else{
  31.  buf1[0]=bits[i];
  32.  buf1[1]=bits[i+1];
  33.  w=atoi(buf1);
  34.  i=i+2;}
  35. cmpt = 0; /* on remet le compteur des espaces a 0 */
  36. printf("largeur = %d\n",w); /* ON A LA LARGEUR HOURAAA */
  37. /* TODO rechercher la valeur de height; apres les deux espace de la deuxieme ligne on a la hauteur */
  38. while(cmpt != 2){ /* Parcours des 2 espaces */
  39.  if(bits[i] == ' ')
  40.   cmpt++;
  41.  i++;}
  42. if(bits[i+1] == '\n'){ /* On recupere la hauteur */
  43.  h=bits[i]-'0';
  44.  i++;}
  45. else{
  46.  buf1[0]=bits[i];
  47.  buf1[1]=bits[i+1];
  48.  h=atoi(buf1);
  49.  i=i+2;}
  50. printf("hauteur = %d\n", h); /* ON A LA HAUTEUR HOURAAA */
  51. /* ON RESERVE LESPACE POUR LE TABLEAU A AFFICHER */
  52. if ((w<=8)||((w%8)==0))
  53.   taille=(w/8)*h;
  54.  else
  55.   taille=((w/8)+1)*h;
  56. tab = (unsigned char *)calloc(taille, sizeof(unsigned char));
  57. printf("taille = %d\n",taille);
  58. i++; /* On incremente i pour passer le '\n' de la deuxieme ligne */
  59. /* TODO  TCHOPPER LES LEMENTS DU TABLEAU */
  60. while(bits[i] != '\n'){ /* Parcours de la ligne inutile */
  61.  i++;}
  62. i=i+4; /* On saute le saut de ligne de la 3ieme ligne et les 3 premiers espaces de la 4ieme ligne */
  63. c=0;   /* On reutilise c pour parcourir le tableau tab */
  64. while(i<150){ /* On reste modeste */
  65.  if((bits[i] == '\n') || (bits[i] == ',') ){
  66.   i=i+1;}
  67.  if(bits[i] == '0'){
  68.   buf2[0]=bits[i];   
  69.   buf2[1]=bits[i+1];
  70.   buf2[2]=bits[i+2];
  71.   buf2[3]=bits[i+3];
  72.   tab[c]=(unsigned char)strtoul(buf2,NULL,16);
  73.   c++;
  74.   printf("\ntab de %d = %d \n\n",c, tab[c]);
  75.   i=i+4;}
  76.  else
  77.   i++;
  78. }
  79. printf("\n1er mot de tab =\n%d\n\n", tab[0]); /*==> 24 OUUééé*/
  80. /*  fclose(fp); */
  81. return 0;
  82. }


 
Les dieux du C sont avec moi ! Il faut y croire !


Message édité par Chronoklazm le 13-11-2004 à 23:37:21
n°897849
Joel F
Real men use unique_ptr
Posté le 13-11-2004 à 23:33:03  profilanswer
 

j'ai mal au yeux >.<

n°897856
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 13-11-2004 à 23:39:27  profilanswer
 

'tain, Taz serait fou s'il lisait ça :D
("atoi", "FILE *", "\n\n" en début de phrase, etc...)


---------------
J'ai un string dans l'array (Paris Hilton)
n°897857
Joel F
Real men use unique_ptr
Posté le 13-11-2004 à 23:40:19  profilanswer
 

Harkonnen a écrit :

'tain, Taz serait fou s'il lisait ça :D
("atoi", "FILE *", "\n\n" en début de phrase, etc...)


s'il lui tombe dessus, il pourra s'en creuser une

n°897866
Chronoklaz​m
Posté le 13-11-2004 à 23:53:15  profilanswer
 

En attendant .... CAAAAA MAAAAAAAAAAAAAAARCHE !  :cry:  :cry:  
 

Code :
  1. #include <stdio.h>        /* Pour printf, scanf */
  2. #include <stdlib.h>
  3. #include <string.h>       /* strcmp */
  4. void affiche_tab(unsigned char tab[],int width, int height){
  5. /* Initialisation des variables */
  6. int cmpt = 0; /* Compteur de caracteres */
  7. unsigned char mask = 1; /* Masque pour l'affichage "a la bitmap" */
  8. int i = 0; /* Indice de parcours du tableau */
  9. while(height>0){ /* Tantque hauteur > 0 on parcours le tableau */
  10.  putchar(tab[i] & mask ? '1' : '0'); /* On ecrit un caractere en appliquant le masque binaire */
  11.  mask = mask<<1; /* On deplace le bit du masque vers la gauche */
  12.  cmpt++; /* On incremente le compteur de caracteres */
  13.  if(cmpt == width){ /* Si on a atteint la largeur donnée */
  14.   putchar('\n'); /* On passe à la ligne */
  15.   height--; /* Puisqu'on recommence une nouvelle ligne on decremente la hauteur */
  16.   cmpt=0;} /* On remet le compteur a 0 */
  17.  if((cmpt%8) == 0){ /* On a ecrit le premier mot de 8 */
  18.   i++; /* On regarde l'element suivant du tableau */
  19.   mask=1;} /* On remet le masque a son etat initial */
  20. }
  21.     printf("\n" );
  22. }
  23. int main(int argc, char *argv[]){
  24. if(argc != 2){
  25.  printf("\n\nERREUR : vous n'avez pas specifiez de parametres !\n\n" );
  26.  exit(1);
  27. }
  28. FILE *fp;
  29. int w,h,c=0,i=0,taille;
  30. int cmpt=0;     /* Compteur d'espaces */
  31. char bits[1024]; /* TABLEAU OU l'ON STOCKE LE FICHIER */
  32. static char buf1[2]; /* buffer pour w et h LES DIMENSIONS NE DOIVENT PAS DEPASSER UN NOMBRE A DEUX CHIFFRES */
  33. static char buf2[2]; /* buffer pour les elements du tableau */
  34. unsigned char *tab;
  35. if ((fp = fopen(argv[1] , "r+" )) == NULL)
  36.  printf("\n\nERREUR : impossible d'ouvrir le fichier %s !\n\n",argv[1]);
  37. else{
  38.  while( !feof(fp) ){ /* On stocke tous le fichier dans untableau de char */
  39.    bits[c]=(char)fgetc(fp);
  40.    c++;
  41.  }
  42. }
  43. /* TODO rechercher la valeur de width; apres les deux espace de la premiere ligne on a la largeur */
  44. while(cmpt != 2){ /* Parcours des 2 espaces */
  45.  if(bits[i] == ' ')
  46.   cmpt++;
  47.  i++;}
  48. if(bits[i+1] == '\n'){ /* On recupere la largeur */
  49.  w=bits[i]-'0';
  50.  i++;}
  51. else{
  52.  buf1[0]=bits[i];
  53.  buf1[1]=bits[i+1];
  54.  w=atoi(buf1);
  55.  i=i+2;}
  56. cmpt = 0; /* on remet le compteur des espaces a 0 */
  57. printf("largeur = %d\n",w); /* ON A LA LARGEUR HOURAAA */
  58. /* TODO rechercher la valeur de height; apres les deux espace de la deuxieme ligne on a la hauteur */
  59. while(cmpt != 2){ /* Parcours des 2 espaces */
  60.  if(bits[i] == ' ')
  61.   cmpt++;
  62.  i++;}
  63. if(bits[i+1] == '\n'){ /* On recupere la hauteur */
  64.  h=bits[i]-'0';
  65.  i++;}
  66. else{
  67.  buf1[0]=bits[i];
  68.  buf1[1]=bits[i+1];
  69.  h=atoi(buf1);
  70.  i=i+2;}
  71. printf("hauteur = %d\n", h); /* ON A LA HAUTEUR HOURAAA */
  72. /* ON RESERVE LESPACE POUR LE TABLEAU A AFFICHER */
  73. if ((w<=8)||((w%8)==0))
  74.   taille=(w/8)*h;
  75.  else
  76.   taille=((w/8)+1)*h;
  77. tab = (unsigned char *)calloc(taille, sizeof(unsigned char));
  78. printf("taille = %d\n",taille);
  79. i++; /* On incremente i pour passer le '\n' de la deuxieme ligne */
  80. /* TODO  TCHOPPER LES LEMENTS DU TABLEAU */
  81. while(bits[i] != '\n'){ /* Parcours de la ligne inutile */
  82.  i++;}
  83. i=i+4; /* On saute le saut de ligne de la 3ieme ligne et les 3 premiers espaces de la 4ieme ligne */
  84.     c=0;   /* On reutilise c pour parcourir le tableau tab */
  85. while((i<511) || (bits[i] != '}') || (c<taille) || (bits[i+1] != ';')){
  86.  if((bits[i] == '\n') || (bits[i] == ',') || (bits[i] == ' ') || (bits[i] == '0')){
  87.   i=i+1;}
  88.  if(bits[i] == 'x'){
  89.   i++;
  90.   buf2[0]=bits[i];   
  91.   buf2[1]=bits[i+1];
  92.   tab[c]=(unsigned char)strtoul(buf2,NULL,16);
  93.   c++;
  94.   i=i+2;}
  95.  if(bits[i] == '}')
  96.   break;
  97. }
  98. affiche_tab(tab,w,h);
  99. return 0;
  100. }

 
 
:bounce:  :bounce:  :bounce:  :bounce:


Message édité par Chronoklazm le 14-11-2004 à 00:46:13
n°897870
Chronoklaz​m
Posté le 14-11-2004 à 00:05:27  profilanswer
 

Bon moi jvé ouvrir ma boutielle, en attendant voici les deux exe :
 
http://perso.wanadoo.fr/jazzdemoscou/Projet.exe
Petit logiciel de dessin :)  
 
http://perso.wanadoo.fr/jazzdemoscou/bmtoa$.exe
Pour afficher votre fichier .xbm en mettant le nom de ce fichier
comme parametre d'execution.
(en gros afficher ce que vous aurez sauvegardé avec mon projet)
 
Grand merci a matafan et a vous tous !
 
P'ti screenshot :
http://perso.wanadoo.fr/jazzdemoscou/Face.JPG
 
 
:bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:


Message édité par Chronoklazm le 14-11-2004 à 00:29:58

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme avec fgets

 

Sujets relatifs
petit probleme...probleme d' analyse syntaxique
Probleme de dimension d'un SVG avec la balise EMBEDProbleme de backspace avec fprintf.
[PHP - PHPMailer] Problème d'envoie de mail [résolu][c] problème de fgets --> bus error core dumped
Probleme de retour a la ligne avec fgets( )...[C] Probleme fgets (resolu)
[C/C++ sous UNIX] problème de buffer avec fgets et cin ![C] probleme de fgets()
Plus de sujets relatifs à : Probleme avec fgets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR