[résolu] fgets et imlib_load_image

fgets et imlib_load_image [résolu] - C - Programmation

Marsh Posté le 23-07-2008 à 14:40:32    

Bonjour, j'ai un petit problème, surement idiot, mais qui me bloque bien pour le moment ...
 
Mon problème est plutôt trivial, mais je bute ... je n'arrive pas à passer un char en const char *.
 
Je veux récupérer dans un fichier l'emplacement d'une image sous forme de chaine, et réutiliser cette chaine pour afficher l'image.
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <Imlib2.h>
  4. int main( int argc, char **argv )
  5. {
  6. char path[128];
  7. FILE *fd;
  8. fd = fopen("/tmp/huhu","r" );
  9. fgets(path,128,fd);
  10. Imlib_Image cover = imlib_load_image(path);
  11. printf("file: %s\n",(path);
  12. if(cover) printf("ok\n" );
  13. else if(!cover) printf("no\n" );
  14. fclose(fd);
  15. return 0;
  16. }


 
 
Le code compile, et fonctionne à moitié. Il ouvre bien le fichier, récupère l'emplacement de l'image, affiche correctement la chaine à l'écran (printf). Mais la fonction imlib_image_load me dit que le fichier n'existe pas ... alors qu'il existe bel et bien.
 
imlib_load_image prend un const char * en argument, est-ce parce que je lui donne un simple char qu'elle ne trouve pas le fichier ? je n'arrive pas à "transformer" mon char en const char * ... quelqu'un pourrait-il me dépanner ?
 
Cordialement, Askelon

Message cité 1 fois
Message édité par Askelon le 23-07-2008 à 19:03:51
Reply

Marsh Posté le 23-07-2008 à 14:40:32   

Reply

Marsh Posté le 23-07-2008 à 14:47:52    

Askelon a écrit :


imlib_load_image prend un const char * en argument, est-ce parce que je lui donne un simple char qu'elle ne trouve pas le fichier ?

 

Non.
La fonction prend en paramètre un const char * ce qui indique qu'elle ne modifiera jamais le paramètre que tu lui donnes (interdit par le compilo).

 

Tu dis que le fichier existe bien... mais en es-tu sûr ?
Par exemple, le chemin du fichier indiqué est peut-être en relatif, et tu ne te trouves pas dans le bon répertoire... ou alors le fichier existe, et tu n'as pas les droits de lecture, bref, à mon avis le problème est plutôt de ce genre-là.

 

Autre remarque : tu ouvres un fichier avec fopen(), mais tu ne vérifies pas que l'ouverture s'est bien déroulée. Vérifie toujours que fd est différent de NULL pour t'assurer qu'il n'y a pas eu de problème.

 
Askelon a écrit :

je n'arrive pas à "transformer" mon char en const char *


Comme je le disais ton erreur ne vient pas de là, mais juste pour répondre à ta question, il suffit d'un cast :
char * truc;
(const char *)truc <= truc est forcé comme étant de type "const char *"


Message édité par Elmoricq le 23-07-2008 à 14:48:22
Reply

Marsh Posté le 23-07-2008 à 18:11:19    

Salut Elmoricq, et merci de ta réponse !
 
Malheureusement je n'avance pas :P
 
J'ai simplifié le code posté au maximum, ne laissant que la portion qui pose problème (par exemple je teste effectivement que l'ouverture du fichier réussie, et en effet elle réussie). Je suis parfaitement certain de l'existence du fichier, peu importe de quel fichier tu parles, d'ailleurs :
 
+ /tmp/huhu existe sans doute possible puisque c'est mon programme qui justement le créé, et que je vérifie bien que sa création est réussie. De plus un cat /tmp/huhu et un ls -la /tmp/huhu me montrent qu'il contient bien l'emplacement d'une image et qu'il m'est accessible en droit (644).
 
+ l'image dont l'emplacement est contenu dans mon fichier existe aussi bel et bien, déjà parce que le printf ligne 14 me l'affiche bien, et d'autre part un display `cat /tmp/huhu` m'affiche bien l'image.
 
En fait ce qui me faisait pencher pour un problème d'argument passé à imlib_load_image est que si j'y vais à la barbare et lui passe directement à la main le contenu de /tmp/huhu, par exemple imlib_load_image("/home/askelon/image.png" ), l'image s'affiche correctement ...
 
En gros je suis toujours coincé ^^ c'est vraiment imlib_load_image qui refuse l'argument que je lui passe en me disant à tord que le fichier n'existe pas  :sarcastic:


Message édité par Askelon le 23-07-2008 à 18:15:27
Reply

Marsh Posté le 23-07-2008 à 18:31:58    

Salut, ça ne pourrait pas venir d'un caractère qui ne passe pas au niveau de imlib_load_image? Genre un caractère spécial ou un espace qui s'est glissé là par erreur.
fgets ne récupèrerait pas \n dans la chaine qu'il remplit par hasard?
...  
 
remarque: ce n'est pas parceque le fichier existe et que tu as les droits que fopen peut l'ouvrir. Ok c'est rare mais y'a toujours des exceptions possibles: trop de fichiers ouverts, plus de mémoire,... Donc quoi qu'il arrive on vérifie toujours les appels systèmes. C'est une (bonne) habitude a prendre.


Message édité par ptitchep le 23-07-2008 à 18:35:57

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 23-07-2008 à 19:03:11    

Merci beaucoup ptitchep, tu as trouvé le problème !!! tout fonctionne parfaitement maintenant :D
 
C'était en effet un problème avec un caractère spécial qui empêchait imlib_load_image de fonctionner !!! c'est tout bête, j'aurai du y penser, il suffit de tester la présence d'un '\n' dans la chaine, et le remplacer par '\0' :)
 
Cela donne donc :
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <Imlib2.h>
  4. int main( int argc, char **argv )
  5. {
  6. char path[128];
  7. char *fin;
  8. FILE *fd;
  9. fd = fopen("/tmp/huhu","r" );
  10. fgets(path,128,fd);
  11. fin = strrchr(path, '\n');
  12. if(fin != NULL) *fin = '\0';
  13. Imlib_Image cover = imlib_load_image(path);
  14. printf("file: %s\n",(path);
  15. if(cover) printf("ok\n" );
  16. else if(!cover) printf("no\n" );
  17. fclose(fd);
  18. return 0;
  19. }


 
Et tout fonctionne désormais parfaitement =)
 
Merci beaucoup à vous deux !!

Reply

Marsh Posté le 24-07-2008 à 01:36:41    

ben ouais, man fgets, c'est pas pour les kangourous ouzbèques comme dirait un certain Joel...

Citation :

fgets() lit au plus size - 1 caractères depuis stream et les place dans
       le   tampon  pointé  par  s.  La  lecture  s’arrête  après  EOF  ou  un
       retour-chariot. Si un retour-chariot (newline) est  lu,  il  est  placé
       dans le tampon. Un caractère nul ’\0’ est placé à la fin de la ligne.


Bonne continuation.

 


et le:

Code :
  1. if (!fd)
  2. {
  3.     fprintf(stderr,"fopen a lamentablement foiré\n" );
  4.     return 1;
  5. }

Il est où?
sans parler du:

Code :
  1. if(!fgets(...))
  2. {
  3.     fprintf(stderr,"Ben c'est au tour du fgets maintenant\n" );
  4.     fclose(fd);
  5.     return 1;
  6. }
 


(pu***n encore un edit, j'y arrive jamais du premier coup, ni du deuxième!) merci d'avoir mis "résolu".


Message édité par ptitchep le 24-07-2008 à 02:06:28

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 24-07-2008 à 08:56:49    

Ils sont pris en charge par une gestion des erreurs signée bibi que j'ai eu la flemme de coller vu la longueur du code et le peu que ça apporte au sujet ;)
 
(pour fgets, la page man m'a pourtant beaucoup servi, je me demande encore comment j'ai pu zapper le retour-chariot :sarcastic:

Reply

Marsh Posté le 24-07-2008 à 10:38:42    

Bof, ça arrive, c'est toujours des petites erreurs à la con qui font perdre le plus de temps parce qu'on ne sait pas où chercher.
La prochaine fois utilise un debugger plutôt que des printf, tu le verras le caractère en trop.


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed