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 :

Problème d'ouverture de fichier texte


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Par défaut Problème d'ouverture de fichier texte
    Bonsoir à tous, j'ai un petit problème d'ouverture de fichier texte:
    Voici le code de mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fgets(choix, sizeof(choix), stdin);
     
            switch(choix[0]){
     
            case 'o':
            verifcharg = charger_texte(&req_total, &choix[2]);
     
                    if(verifcharg == 0)
                                printf("\tErreur d'ouverture du fichier texte\n");
     
            break;
    En paramètre, je passe l'adresse de la case 2 du tableau car dans les cases 0 et 1 se trouvent le nom de la commande.

    Dans ma fonction j'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int charger_texte(file_req *req, char *nomfichier){
     
    int temps, depart, arrivee; //fichiers temporaires
    char temp[40];
    char tempnom[20];
     
     
     
    /* Déclaration du fichier logique */
    FILE *entree = fopen(nomfichier, "r");
     
        if(entree == NULL)
                return 0;
     
     
        return 1;
     
     
    }
    Le chargement ne marche pas. Or si à la place de la variable nomfichier, je met directement le nom du fichier ça marche. J'arrive également à afficher le texte passé en paramètre.

    Je ne sais plus quoi faire. Merci de m'aider.

    Bonne soirée.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Par défaut
    Personne ne sait ?
    C'est un problème avec fgets ?


    J'ai aussi essayé de copier dans une autre chaîne sans succès.

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Est-ce que tu as debugger au pas à pas pour voir ce qui se passe et que vaut &choix[2] au moment de l'appel. Je ne crains pour toi que choix[2] représente un caractère et pas une chaîne qui pourrait être le nom d'un fichier.

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par sebdu94
    C'est un problème avec fgets ?
    Le fgets lit aussi le retour à la ligne, et d'aprés ton code tu ne gére pas ceci !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Par défaut
    Merci pour vos réponses. J'ai résolu en utilisant gets. C'est pas très propre mais ça marche.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sebdu94 Voir le message
    Merci pour vos réponses. J'ai résolu en utilisant gets. C'est pas très propre mais ça marche.
    bah :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( fgets(choix, sizeof(choix), stdin) != NULL )
     {
        choix[strlen(choix)-1] = '\0' ;
        .........
     }
    t'enlèves le \n et c'est pas si compliqué que ça

  7. #7
    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
    Citation Envoyé par sebdu94 Voir le message
    Merci pour vos réponses. J'ai résolu en utilisant gets. C'est pas très propre mais ça marche.
    C'est une blague ????
    gets est un bug très connu du C, il n'y a aucune vérification de la longueur de la saisie donc dépassement de capacité potentiel.
    "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

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Aucun programme ne "marche" avec gets(). Il tombe en marche, ce n'est pas la même chose.

    Et le \n ne s'enlève pas avec strlen(), mais avec strchr(). Chercher la fonction fclean() sur le forum.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    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 sebdu94 Voir le message
    Le chargement ne marche pas. Or si à la place de la variable nomfichier, je met directement le nom du fichier ça marche. J'arrive également à afficher le texte passé en paramètre.
    Je conseille d'ajouter un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf ("'%s'\n", nomfichier);
    dans la fonction charger_texte() afin de lever tout doute sur ce qui est réellement passé à cette fonction.

    Est-tu bien conscient que fgets() lit aussi le '\n' ?

    La procédure recommandée est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(...);
    fclean(...);
    Le code de la dernière fonction a été publié sur le forum à de nombreuses reprises...

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Et le \n ne s'enlève pas avec strlen(), mais avec strchr(). Chercher la fonction fclean() sur le forum.
    comme fgets s'arrête au \n inclus, faire chaine[strlen(chaine)-1] = '\0' est valide....

  11. #11
    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
    sauf qu'il faut tester que le '\n' figure bien dans la chaîne (saisie trop longue pour un buffer trop court ..).
    "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

  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 Médinoc Voir le message
    Aucun programme ne "marche" avec gets(). Il tombe en marche, ce n'est pas la même chose.

    Et le \n ne s'enlève pas avec strlen(), mais avec strchr(). Chercher la fonction fclean() sur le forum.
    En fait ce n'est ni strlen() ni strchr() qui 'retire' le '\n', mais l'écriture d'un 0 à sa place.

    Il me semble qu'on en a déjà parlé, Souviron, mais le problème de strlen() est qu'il ne vérifie pas la présence du '\n', ce qui fait qu'en cas d'absence, non seulement on n'est pas prévenu et on ne peut agir en conséquence, mais de plus, un caractère valide est supprimé.

    Cette méthode est donc incorrecte.

    Je rappelle l'algorithme de fclean() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    chercher '\n' dans la chaine
    Si on l'a trouvé
     l'éliminer
    sinon
     lire les caractères non lus jusqu'au '\n'.
    Ce qui répond exactement à ce qu'on cherche ici.

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trap D Voir le message
    sauf qu'il faut tester que le '\n' figure bien dans la chaîne (saisie trop longue pour un buffer trop court ..).
    Citation Envoyé par Emmanuel Delahaye Voir le message
    En fait ce n'est ni strlen() ni strchr() qui 'retire' le '\n', mais l'écriture d'un 0 à sa place.

    Il me semble qu'on en a déjà parlé, Souviron, mais le problème de strlen() est qu'il ne vérifie pas la présence du '\n', ce qui fait qu'en cas d'absence, non seulement on n'est pas prévenu et on ne peut agir en conséquence, mais de plus, un caractère valide est supprimé.
    Ok ici je n'ai pas mis, mais ce que je fais systématiquement SANS strchr, ET qui répond à Trap D ET est plus court que Emmanuel est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if ( chaine[strlen(chaine)-1] == '\n' )
         chaine[strlen(chaine)-1] = '\0' ;
    comme ligne suivante après le fgets...

  14. #14
    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
    Tu sais, on ne doute pas (moi en tout cas) que tu le fasses correctement, mais comme on est sur un forum, il faut essayer d'être le plus précis possible dans ses explications, ce qui n'est pas toujours évident, j'en sais quelque chose
    "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

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je sais, et vos remarques m'ont 1) permis de voir que j'avais oublié de le mettre et 2) sont ok , je sais bien....

    Don't worry, be happy

  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 souviron34 Voir le message
    Ok ici je n'ai pas mis, mais ce que je fais systématiquement SANS strchr, ET qui répond à Trap D ET est plus court que Emmanuel est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if ( chaine[strlen(chaine)-1] == '\n' )
         chaine[strlen(chaine)-1] = '\0' ;
    comme ligne suivante après le fgets...
    Et tu parcours 2 fois la chaine avec strlen() ? Et si il n'y a pas de '\n' ? Tu ne purges pas ? Crois moi, notre petite fonction fclean() est le résultat de beaucoup d'expérience partagée et il n'y a pas plus simple ni plus efficace à notre connaissance.

    Je rappelle ma version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include "fclean.h"
     
    #include <string.h>
     
    int fclean (char *s_buffer, FILE * stream)
    {
       int err = 0;
       if (s_buffer != NULL && stream != NULL)
       {
          char *pc = strchr (s_buffer, '\n');
     
          if (pc != NULL)           /* La saisie n'a pas ete tronquee */
          {
             /* On remplace '\n' par le caractere nul '\0' */
             *pc = 0;
          }
          else
          {
             /* La saisie a ete tronquee, on purge le flux d'entree */
             int c;
             while ((c = fgetc (stream)) != '\n' && c != EOF)
             {
             }
             err = 1;
          }
       }
       return err;
    }
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #ifndef H_ED_FCLEAN_20070915175800
    #define H_ED_FCLEAN_20070915175800
     
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     
    /* fclean.h */
     
    #include <stdio.h>
     
    /* made from 100% recycled bits */
       int fclean (char *s_buffer, FILE * stream);
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif                          /* guard */
     
    /* Guards added by GUARD (c) ED 2000-2005 Jan 17 2005 Ver. 1.7 */
    Quand à l'usage, il est trivial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (fgets(choix, sizeof(choix), stdin) != NULL )
    {
       fclean(choix, stdin) ;
    }
    ou plus complexe si on traite l'erreur de longueur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int  err;
    do
    {
       /* prompt */
       if (fgets(choix, sizeof(choix), stdin) != NULL )
       {
          err = fclean(choix, stdin) ;
          if (!err)
          {
             /* traitement normal */
          }
          else
          {
             /* traitement en cas d'erreur */
          }
       }
    }
    while (err);

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Par défaut
    Merci pour toutes vos réponses. J'ai remis fgets et supprimé le \n en fin de ligne.
    ça marche très bien.

Discussions similaires

  1. Problème avec l'ouverture de fichiers texte
    Par mithrendil dans le forum C#
    Réponses: 3
    Dernier message: 16/07/2007, 08h00
  2. Réponses: 6
    Dernier message: 12/04/2007, 14h22
  3. Ouverture de fichier text
    Par lerouzes dans le forum Langage
    Réponses: 17
    Dernier message: 13/01/2006, 10h48
  4. Problème de réouverture de fichier texte
    Par EssaiEncore dans le forum Langage
    Réponses: 15
    Dernier message: 14/12/2005, 10h51
  5. [JAR]ouverture de fichier texte depuis executables jar
    Par julien31 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 01/03/2005, 15h53

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