Fopen(pathFile,"mode") error stream!=NULL

Résolu
Signaler
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012
-
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012
-
Bonjour,

Je développe un petit programme en C et je me heurte à un problème que je pense pas incontournable mais j'ai pas d'idée là... J'ai fait un fonction getPath qui permet à l'utilisateur d'entrer le chemin du fichier qu'il veut ouvrir.
Cette fonction me retourne un string:

externe char *pathFile;

void function()
{
pathFile=getPath(1);
fopen(pathFile,"+r");//et c'est ici qu'il y a un problème
...
}

En effet lors de la compilation j'ai aucune erreur, mais quand j'execute le programme celui-ci me retourne une erreur: "stream!=NULL" et bug!
Pourtant j'ai vérifé et pathFile contien bien le chemin du fichier. Voici son code:
char *getPath(int mode)
{
    char buffer[100],*path;
    int i;
    
    /*Le variable mode, permet de déterminer dans quel cas on se trouve. càd si on ve récupérer le path
    d'un fichier ou l'emplacement dans lequel on veut l'enregistrer.*/
    switch(mode){
    case 1:
        printf("Entrez le chemin ou se trouve votre fichier a crypter:\n (ex : C:/mon_dossier/mon_fichier.txt)");
        fgets(buffer,sizeof(buffer),stdin);
        break;
    case 2:
        printf("Entrez le chemin ou vous desirez enregistrer votre fichier crypté:\n (ex : C:/mon_dossierPerso/mon_fichier_a_garder.txt)");
        fgets(buffer,sizeof(buffer),stdin);
        break;
    default:
        printf("erreur dans l'utilisation de la fonction");
        break;
    }
    printf("buffer: %s",buffer);
    system("PAUSE");
    path = (char *) malloc(sizeof(char)*strlen(buffer)+1);

    if(!path)
        exit(1);

    for (i=0;i<((int)strlen(buffer)+1);i++){
        path[i]=buffer[i];
    }
return path;
}

Quelqu'un pourrait il m'aider à résoudre ce problème?
N'hésitez pas à poser des question si je ne suis pas assez clair...
Merci.

7 réponses

Messages postés
15191
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
6 décembre 2021
101
Pffiou...Hé bé! J'ai lutté pour trouver le problème...
En fait, c'est tout bête
Quand tu fais un fgets(), ta chaine contient le caractère "entrée" que tu tapes pour valider, il faut donc l'enlever:

char *getPath(int mode)
{
    char buffer[100],*path;
    int i;

    /*Le variable mode, permet de déterminer dans quel cas on se trouve. càd si on ve récupérer le path
    d'un fichier ou l'emplacement dans lequel on veut l'enregistrer.*/
    switch(mode){
    case 1:
        printf("Entrez le chemin ou se trouve votre fichier a crypter:\n (ex : C:/mon_dossier/mon_fichier.txt)");
        fgets(buffer,sizeof(buffer),stdin);
        break;
    case 2:
        printf("Entrez le chemin ou vous desirez enregistrer votre fichier crypté:\n (ex : C:/mon_dossierPerso/mon_fichier_a_garder.txt)");
        fgets(buffer,sizeof(buffer),stdin);
        break;
    default:
        printf("erreur dans l'utilisation de la fonction");
        break;
    }
    printf("buffer: %s",buffer);
    //system("PAUSE");

    path = (char *) malloc(sizeof(char)*strlen(buffer)-1);
    if(!path)
        exit(1);

    for (i=0;i<(int)strlen(buffer)-1;i++)
    {
        path[i]=buffer[i];
    }
    path[i]=0;
    return path;
}

NB: Attention, toutefois à la libération de la mémoire allouée. Généralement, on alloue le pointeur dans la fonction appelante et on le supprime quand on en a plus besoin...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
15191
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
6 décembre 2021
101
Hello,
T'aurais pas oublié un pointeur sur le fichier ouvert? Genre: FILE * pFile = fopen(pathFile,"+r");

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

Non ça c'est une inatention de ma part lorsque j'ai retapé le code...
j'ai bien un pointeur :
FILE *file;

file = fopen(pathFile,"+r");

dsl.
Messages postés
15191
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
6 décembre 2021
101
Pas cool... Tu as quoi exactement dans pathFile?
Si tu le fais en debug, file est-il vide ou pas? Est-ce que t'es anti-slashs sont bien doublés?
Tiens, en passant, généralement on met "r+"
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

Et bien en fait, je peux pas savoir, puisqu'il n'arrive pas à l'ouvrir. C'est d'ailleurs ça le problème. Il ne sort pas de fopen().
J'ai essayé deux façons pour le chemin: C:/test.txt  et C:\\test.txt. Les deux fonctionnent normalement sous windows. Sinon j'ai bien mis "r+" c'était une faute de frappe, mais bonne observation car j'avais peut-être mis +r par inadvertence, mais même corrigé ça ne fonctionne toujours pas.
Dis moi comment toi tu ferais par exemple, peut-être que ça m'éguillerais.
Merci pour ton attention buno.
@+
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

C'est une possibilité à laquelle j'ai pas pensé en effet... Je vais tester d'enlever fgets,car effectivement le printf() n'affiche pas \n ou \r.
Je vais donc editer ma fonction, et je te tiens au courant (avec un peu de retard peut-être car j'ai plus le net en ce moment)
Merci d'avoir prit le temps de m'aider. 
A bientôt.

Cordialement.
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

Bon, du coup j'ai pas enlevé mon fgets, mais j'ai fait un algo qui me supprime le caractère entré avant de le retourner. Maintenant ça marche du tonnerre de dieu hihi. Merci encore buno super ton idée ;)
See you later!!
Enjoy!