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 :

Lire un nom de fichier et tenter d'ouvrir ce dernier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut Lire un nom de fichier et tenter d'ouvrir ce dernier
    Bonjour a tous !
    J'espere que vous pourrez me sortir de mon petrin actuel !
    J'essaie actuellement de lire d'un fichier une liste de noms de fichiers (sorte de batchlist) pour ouvrir les uns apres les autres les fichiers que je trouve.
    Tout marche a priori, sauf que lorsque je fais passer ma chaine de caracteres ,qui est un char* au passage, eh bien en faisant un fopen dessus mon pointeur renvoye est null, autrement dit le fichier est cense ne pas exister du tout. Or en faisant un printf pour verifier exactement ce qui arrive dans le fopen avant celui ci il s'agit en apparence bien de ma chaine de caractere qui reference un fichier qui existe bien dans mon repertoire courant Ma question est donc la suivante: est-ce qu'en lisant le contenu d'un fichier avec la fonction fgets comme je le fais (donc ligne par ligne, chaque ligne devant etre en fait un nom de fichier lisible) je n'ajoute pas de caracteres speciaux ou quoique ce soit qui rende la chaine differente au final et donc ne puisse pas ouvrir un fichier ?

    Mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mafilelist = "mabatchliste.bl";
    FILE *batchweightfile;
    FILE *file;
    batchweightfile = fopen(mafilelist, "r");
    const int MAX_SIZE = 512;
    char currentnet[MAX_SIZE];
     
    while (fgets (currentnet, MAX_SIZE, batchweightfile)) {
    file = fopen(currentnet,"rb");
    if (file==NULL) {fprintf(stderr,"Y en avoir un pb, jtrouve pas ton fichier !");}
    }
    Je me prends donc mon erreur super sympa " Y en avoir un pb, jtrouve pas ton fichier!"

    Please help !

    déplacer du forum C++ par bigboomshakala

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    fgets() lit toute une ligne, retour-chariot compris ('\n').
    Il faut donc que tu trouves ce retour-chariot (strchr) et que tu le remplaces par le caractere terminateur '\0'. A ce moment la, tu auras une vraie chaine de caractere comme le C l'entend (i.e. tableau de caracteres termine par un '\0').

  3. #3
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Oui exact c bien ce que je pensais, mais pourrais tu me donnais rapidement un petit code d'exemple utilisant ce strchr stp ? Merci d'avance !

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Benjy
    Oui exact c bien ce que je pensais, mais pourrais tu me donnais rapidement un petit code d'exemple utilisant ce strchr stp ? Merci d'avance !
    Plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(buffer, MAX_BUFFER, stdin);
    buffer[strlen(buffer)-1] = '\0';
    Peut-etre un petit if avant pour voir si le caractere est bien un \n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fgets(buffer, MAX_BUFFER, stdin);
    if(buffer[strlen(buffer)-1] == '\n')
         buffer[strlen(buffer)-1] = '\0';

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Non !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char buffer[MAX_BUFFER];
    char *p;
    fgets(buffer, MAX_BUFFER, stdin); 
    if ((p = strchr(buffer, '\n')) != NULL)
      *p = 0;
    else
    {
      // là le buffer de lecture est trop petit
      // à toi de voir ce que tu veux !
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Merci bcp ca marche maintenant, j'aurais du y penser, j'ai vraiment pas la peche today

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Trap D
    Non !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char buffer[MAX_BUFFER];
    char *p;
    fgets(buffer, MAX_BUFFER, stdin); 
    if ((p = strchr(buffer, '\n')) != NULL)
      *p = 0;
    else
    {
      // là le buffer de lecture est trop petit
      // à toi de voir ce que tu veux !
    }
    Pourquoi NON !

    Je verifie bien si le buffer etait assez grand avec mon if. Si le \n est present alors c'est bien que le buffer etait assez grand, non?

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    j'ai dis non un peu abruptement car il n'est pas très prudent de supposer que la chaîne est valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer[strlen(buffer)-1]
    suppose qu'on trouvera un 0 avant la fin du tableau, c'est vrai qu'avec fgets on est assuré de le trouver, mais pas forcément avec d'autres méthodes. (Tu me feras remarquer que strchr suppose aussi que la chaîne est valide, c'est vrai, mais j'ai beaucoup de réticence à faire str[strlen(str)...] = ).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Skyrunner
    Citation Envoyé par Trap D
    Non !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char buffer[MAX_BUFFER];
    char *p;
    fgets(buffer, MAX_BUFFER, stdin); 
    if ((p = strchr(buffer, '\n')) != NULL)
      *p = 0;
    else
    {
      // là le buffer de lecture est trop petit
      // à toi de voir ce que tu veux !
    }
    Pourquoi NON !

    Je verifie bien si le buffer etait assez grand avec mon if. Si le \n est present alors c'est bien que le buffer etait assez grand, non?
    Et si le '\n' se retrouve en première position, tu fais quoi?

    Par contre, encore mieux serait de tester le retour de fgets... Il pourrait rendre NULL et laisser buffer non initialisé...

    Jc

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fearyourself
    Et si le '\n' se retrouve en première position, tu fais quoi?
    Impossible avec la spec de fgets(). Soit le '\n' est absent (tableau plein), soit il est présent présent à la fin.

    C'est pourquoi la méthode idiomatique est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *p = strchr (ligne, '\n');
    if (p != NULL)
    {
       *p = 0;
    }
    else
    {
       /* purge, agrandissement... */
    }
    Par contre, encore mieux serait de tester le retour de fgets... Il pourrait rendre NULL et laisser buffer non initialisé...
    Oui.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    je pensais que depuis le temps que je publie ces liens, le problème était réglé...

  11. #11
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Par défaut
    Dans ce cas il faudrait tester avec un if si la longueur de la chaine est d'au moins 2 (un caractere plus un retour chariot) ? mais ca devient complique pour rien :S

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Benjy
    Dans ce cas il faudrait tester avec un if si la longueur de la chaine est d'au moins 2 (un caractere plus un retour chariot) ? mais ca devient complique pour rien :S
    Non. Tu prends mon code et ça marche toujours. C'est simple.

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Pour que fgets sur l'entrée clavier renvoie NULL, il faut le vouloir Ctrl Z + Entrée sous DOS, et ça ne planterait qu'en ayant initialisé le buffer de saisie à blanc, mais bon, ça finirait toujours par planter.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    Pour que fgets sur l'entrée clavier renvoie NULL, il faut le vouloir Ctrl Z + Entrée sous DOS, et ça ne planterait qu'en ayant initialisé le buffer de saisie à blanc, mais bon, ça finirait toujours par planter.
    stdin peut être redirigé d'un fichier texte.
    Celui-ci a une fin... C'est une façon simple de faire des tests unitaires...

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par fearyourself
    Et si le '\n' se retrouve en première position, tu fais quoi?
    Impossible avec la spec de fgets(). Soit le '\n' est absent (tableau plein), soit il est présent présent à la fin.
    Oui c'est lundi soir mais je pensais que si le '\n' se retrouvait au début du tableau (c'est une ligne qui ne contient que le '\n'), cela ferait planter le reste du code...

    Mais, la fatigue prend le dessus... strlen aurait rendu 1 et donc le reste marche correctement...

    Jc

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par fearyourself
    Oui c'est lundi soir <...> Mais, la fatigue prend le dessus...
    Déjà fatigué le lundi, ça promet ! Demain, pas de manif. Un suppo et au lit !

  17. #17
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par fearyourself
    Oui c'est lundi soir <...> Mais, la fatigue prend le dessus...
    Déjà fatigué le lundi, ça promet ! Demain, pas de manif. Un suppo et au lit !
    Oui papa! Sauf pour le suppo, j'aime pas ça...

    Jc

Discussions similaires

  1. Lire le nom des fichiers présents
    Par ylonar dans le forum Fortran
    Réponses: 2
    Dernier message: 11/01/2010, 22h41
  2. lire le nom des fichiers qui se trouvent dans un dossier
    Par foufoulol dans le forum Langage
    Réponses: 6
    Dernier message: 05/05/2008, 11h38
  3. lire le nom des fichiers dans un répertoire
    Par wonderboutin123 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/11/2007, 04h22
  4. [Configuration] Parcourir un dossier afin de lire le nom des fichiers qu'il contient
    Par 2berte dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 14/06/2007, 14h07
  5. Comment lire le nom d'un fichier ?
    Par Mister_FX dans le forum ASP
    Réponses: 2
    Dernier message: 13/05/2005, 10h27

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