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 :

Probleme d'arret du programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 28
    Par défaut Probleme d'arret du programme
    Hmm j'ai un probleme quand j'execute mon code le programme se ferme des que j'ai entrer le nom de fichier et il n'y as pas l'air d'avoir un probleme avec l'ouverture du fichier puisqu'il ne m'affiche pas "Erreur sur fichier" .
    Si quelqu'un as une idée sur l'origine de cette fermeture précipitée voici le bout de code :
    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
         char nomfichier[50];
       printf("\nIndiquez l'emplacement et le nom du fichier a verifier (ex:C:\\..\\nom.txt)\n");
       fgets(nomfichier, sizeof nomfichier, stdin);
       clean(nomfichier, stdin);
     
          FILE *fichier = fopen(nomfichier,"r");
     
          if (fichier==NULL)
          {
                      printf("Erreur sur fichier"); }
            else{
             /* compter les mots */
             char tmp[50];
             while ((fscanf(fichier, "%49s", tmp))==1)
             {
     
                printf ("%s\n", tmp);
     
                cpt++;
             }
             printf("Il y a %d mots dans le fichier \n", cpt);
    }
    Le programme a l'air de s'arretter a ma boucle while(fscanf....) mais je ne comprends pas pourquoi

  2. #2
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Je pense que clean n'est pas standard, que veux tu faire ?

    tu passes un chaîne de 50 caractères a fopen, je ne suis pas si certain que ton fichier s'ouvre.
    Il faut que tu donne seulement C:\\..\\fichier à la fonction fopen.

    Il devrait t'afficher une erreur. ( sous linux, c'est le cas )

    tu peux fair une truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int i=0;
    char *a;
    while(nomfichier[i]!='\n')
    {
        i++;
    }
    a=malloc(i);
    strcnpy(a,nomfichier,i);
    fichier=fopen(a,"r");
    free(a);
    dans ce cas, ajoutes <string.h> en en-tête
    Ce n'est peut-être pas la meilleure méthode, mais ça devrait marcher et le reste me semble être correct.

  3. #3
    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 je®ome
    tu peux fair une truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int i=0;
    char *a;
    while(nomfichier[i]!='\n')
    {
        i++;
    }
    a=malloc(i);
    strcnpy(a,nomfichier,i);
    fichier=fopen(a,"r");
    free(a);
    dans ce cas, ajoutes <string.h> en en-tête
    Ce n'est peut-être pas la meilleure méthode, mais ça devrait marcher et le reste me semble être correct.
    Sûr, tu as toutes les chances d'avoir un segfault, puisque la chaîne a ne se termine pas par le 0 terminal donc n'est pas une chaîne C valide.
    De plus tu ne verifies pas le retour de malloc.
    Pour supprimer le '\n' de fin de saisie de fgets on fait en général comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char *p;
    ....
    p = strchr(nomfichier, '\n');
    if (p != NULL)
    // on a trouvé le '\n', on le vire
      *p = 0;
    else
    / ici, le buffer de saisie de fgets est trop court
    {
       // a toi de voir ce que tu veux faire
      .......
    }
    "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

  4. #4
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Tu peux afficher le nom du fichier que tu tente d'ouvrir et voir s'il y a un probleme. Essaie aussi d'hardcoder le nom du fichier et vois quelle partie ne marche pas (lecture du fichier ou la boucle).

    Je ne comprends pas ton "a l'air de s'arreter". Le programme t'affiche quand meme "Il y a 0 mots dans le fichier" ??

    Parce qu'avec ça (nom de fichier harcodé), ça marche sous Linux:


    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
    #include <stdio.h>
     
     
    int main(void)
    {
        unsigned int cpt=0;
        const char *nomfichier="legio.c";
        FILE *fichier = fopen(nomfichier,"r");
     
        printf("Fichier: `%s'\n",nomfichier);
        if (fichier==NULL)
        {
            printf("Erreur sur fichier");
        } 
        else 
        {
            /* compter les mots */
            char tmp[50];
            while ((fscanf(fichier, "%49s", tmp))==1)
            {
                printf ("%s\n", tmp);
                cpt++;
            }
            printf("Il y a %d mots dans le fichier \n", cpt);
        }
        return 0;
    /* commentairesuperlongquidepasseles49caracteresjepensebienenfinjespere */
    }
    Citation Envoyé par ./legio
    Fichier: `legio.c'
    #include
    <stdio.h>
    int
    main(void)
    {
    unsigned
    int
    cpt=0;
    const
    char
    *nomfichier="legio.c";
    [...]
    \n",
    cpt);
    }
    return
    0;
    }
    /*
    commentairesuperlongquidepasseles49caracteresjepe
    nsebienenfinjespere
    */
    Il y a 61 mots dans le fichier

  5. #5
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Sûr, tu as toutes les chances d'avoir un segfault, puisque la chaîne a ne se termine pas par le 0 terminal donc n'est pas une chaîne C valide.
    Trap D, je suis curieux de savoir comment toi tu arrives a ouvrir un fichier inexistant.
    Du moins sous linux ceci ne marche pas
    fopen("fichier\0","r") pour ouvir fichier
    Désolé pour le retour de malloc, j'ai oublié de l'ajouter.
    Je ne comprends pas vraiment l'exemple que tu as donné, il y a erreur de segmentation dans *p=0
    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
     #include <stdio.h>
     #include <stdlib.h> 
     #include <unistd.h>
     #include <string.h> 
    
     int main()
     {    
         char *a="fichier\n";    
         char *p;     
         p=strchr(a,'\n');     
         if(p!=NULL)    
         {       
              *p=0;    
         }     
        FILE *fd=fopen(a,"r");    
        if(fd==NULL)    
        {       
              perror("fopen");       
              exit(1);   
        }  
        fclose(fd);    
       /* tester retour de fclose     */     
       return 0; 
    }

  6. #6
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par je®ome
    Je ne comprends pas vraiment l'exemple que tu as donné, il y a erreur de segmentation dans
    Normal: "fichier\n" est un const char * et non un char * ! Tu n'as pas le droit de modifier cette chaine de caractere.

    Sinon "fichier\0" est équivalent à "fichier".

  7. #7
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     char *a="fichier\n";
    Je ne savias pas que ceci était un const.

    et alors ça marche, veuillez m'excuser

    et merci

  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
    effectivement a est dans une zone mémoire non modifiable.
    Par contre
    Ici le tableau est créé dans la pile d'exécution et initialisé avec la chaîne , et là ça aurait fonctionné
    "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
    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 je®ome
    Trap D, je suis curieux de savoir comment toi tu arrives a ouvrir un fichier inexistant.
    Du moins sous linux ceci ne marche pas

    Désolé pour le retour de malloc, j'ai oublié de l'ajouter.
    Je ne comprends pas vraiment l'exemple que tu as donné, il y a erreur de segmentation dans *p=0
    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
     #include <stdio.h>
     #include <stdlib.h> 
     #include <unistd.h>
     #include <string.h> 
    
     int main()
     {    
         char *a="fichier\n";    
         char *p;     
         p=strchr(a,'\n');     
         if(p!=NULL)    
         {       
              *p=0;    
         }     
        FILE *fd=fopen(a,"r");    
        if(fd==NULL)    
        {       
              perror("fopen");       
              exit(1);   
        }  
        fclose(fd);    
       /* tester retour de fclose     */     
       return 0; 
    }
    On ne parle pas de la même chose, je te montrais la manière de supprimer le '\n', pas de la manière d'ouvrir un fichier inexistant.
    Pour le reste, il t'a déjà été répondu.
    "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

Discussions similaires

  1. [VB.NET]Arret du programme
    Par baguauda dans le forum Windows Forms
    Réponses: 12
    Dernier message: 24/10/2005, 08h12
  2. Réponses: 2
    Dernier message: 29/07/2005, 10h14
  3. Réponses: 7
    Dernier message: 16/04/2005, 08h55
  4. Réponses: 5
    Dernier message: 21/11/2004, 18h59
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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