Se connecter avec
S'enregistrer | Connectez-vous

[C/C++]Probleme \0 et ouverture fichier

Dernière réponse : dans Programmation

Bonjour,
J'ai un petit probleme en C.
Je lit un fichier dont je recupere tous les chaines de caractere compri en " " ou <> et finissant par .h => donc les fichiers librairies.

Je les stockent dans un tableau de char * [] dans lequel je fai un malloc car je doi les reutiliser en dehors de la fonction.
Mais le probleme c'est que quand je veux faire une ouverture du fichier precedemment lu et stocké dans le tableau, ca ne marche pas(ca compile et s execute, mais pas comme je veu). J'ai tester en metant dans une variable char * le chemin en dur (normalement identique a celui lu) et la ca marche.
Donc pour moi c'est le caractere \0 en fin de ligne du chemin qui ne passe pas dans le fopen.

Comment resoudre ce probleme? Sinon comment enlever le caractere \0?


Merci d'avance

Autres pages sur : probleme ouverture fichier

Lassé par la pub ? Créez un compte

Le code est trop long pour etre montré.
Je lit un fichier .c et j'en extrait tous les fichiers .h (entre <> ou " ") que je stocke dans un tableau (char * [])
Je parcourt chaque element de ce tableau (donc chaque .h) et je veux tester s'il est present dans le repertoire.
l element courant est stocké dans char *op. Je fais donc un fopen(op,"r"); mais ca ne marche pas.

Par contre si je fait char *op = "./test.h" et fopen(op,"r"); => la ca marche

Donc je pense que cela est du au caractere nul a la fin de la premiere chaine

boolean isIn(char *chemin){
boolean b = false;
FILE *temp = fopen(chemin,"r");
if(temp == NULL){
printf("Le fichier n'est pas à %s\n",chemin);
}
else if(temp != NULL){
printf("Le fichier est ici %s\n",chemin);
b = true;
}
return b;
}

int write(char * guill[],int taille,FILE *pFile){
....
for(q = 0;q<taille;q++){
....
isIn(guill[q]);
....
}
}
Dans ce cas il y a toujours : Le fichier n'est pas à ....
or si je met : char *op = "./test.h";isIn(op); la ca marche
Il y d'autre appel apres.

ce qui serait sympa, c'est de regarder _exactement_ ce qu'il y a dans guill[q] au moment de l'appel...

tiens au fait, si le fopen a réussi, il ne faut pas oublier de faire fclose()

Edit :
d'ailleurs, sur échec de fopen, errno est positionné à (entre autre) :
EACCES, EINTR, EMFILE, ENFILE, ... (voir man fopen pour une liste complète)

il vaut quoi errno dans ton cas ?

Je sais que le NULL est inutile mais vu que ca marchai pas j'ai tout essayé,
Je sais pour le fclose mais ca je verrai apres.
  1. boolean isIn(char *chemin){
  2. boolean b = false;
  3. FILE *temp = fopen(chemin,"r");
  4. if(temp == NULL){
  5. printf("Le fichier n'est pas à %s\n",chemin);
  6. }
  7. else{
  8. printf("Le fichier est ici %s\n",chemin);
  9. b = true;
  10. fclose(temp);
  11. }
  12. return b;
  13. }
  14.  
  15. int write(char * guill[],int taille,FILE *pFile){
  16. ....
  17. for(q = 0;q<taille;q++){
  18. ....
  19. isIn(guill[q]);
  20. ....
  21. }
  22. }
  23.  
  24. void open(char * file, FILE *pFile){
  25. char * guill[256];
  26. int si=0;
  27. ....
  28. //Je stocke chaque occurence lu dans le tableau
  29. ....
  30. write(sign,si,pFile);
  31. }

Si c'est pour le stockage des infos :
Je lit avec un fgets
je teste s'il y a un #include avec un strcmp
Je cherche la 1er occurence de < ou " avec un strstr
Je remplace le \n par un \0
Le resultat de ceci se trouve dans la variable char *pos
et pour mettre l'element dans le tableau :
  1. guill[gui] = (char *)malloc(sizeof(char)*20);
  2. strcpy(guill[gui],pos);
  3. gui++;

tu remplaces le \n par \0, ok.
mais tu supprimes bien le " ou > fermant ?
qu'en est-il si j'écris :

  1. #include <stdio.h>

(avec des espaces après le '>' ?

de plus, je doute que stdio.h soit dans ton répertoire perso non ?

Edit : zut, les espaces ne se voient pas après le '>' :) 

sanglier08 a dit :
"normalement" identique, ou identique ?
de toute façon, quand tu écrit :

char *op = "./test.h"

il y a aussi un caractère '\0' à la fin de la chaîne.


pourtant j'avais bien dit de vérifier si c'était vraiment identique... :pfff: 

bon courage pour la suite :) 
Lassé par la pub ? Créez un compte