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 incompréhensible! Fichier + liste [Débutant(e)]


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 135
    Points : 110
    Points
    110
    Par défaut Problème incompréhensible! Fichier + liste
    Bonjour!
    Tout d'abord voici la source :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
     
    //Cette structure représente une conversion lettre--> morse
    struct conversion{ char lettre;
    		   char morse[3];
    		};
    typedef struct conversion Convers;
     
    //Cette structure représente un maillon de la liste.
    struct element{ Convers convers;
    		struct element *suiv;
    		};
    typedef struct element Element;
    typedef Element *Liste;
     
     
    Convers lireConversion(FILE *F)
    {
    	Convers conv;
    	char lettre;
    	char morse[3];
    	char *p;
    	int i;	
     
    	fscanf(F,"%c",lettre);
    	printf("lettre :%c",lettre);
    	conv.lettre= lettre;
     
    	fscanf(F,"%c",morse);
    	printf("morse :%c",morse);
    	for(i=0;i<3;i++)
    	{
    		conv.morse[i]=morse[i];
    	}
     
    	return(conv);
    }
     
    void inserFin (Convers conv, Liste *l)
    {
    Liste p, q;
     
    if (*l == NULL) //Si la liste est vide, on initialise le premier élement de la liste
    	{       //avec l'élément donné.
    	p = (Element*) malloc (sizeof(Element));
    	p->convers = conv;
    	p->suiv = NULL;
    	*l = p;
    	}
     
    else //Sinon on cherche le dernier élément de la liste puis on place l'élément donné à la suite.
    	{
    	p = *l;
     
    	//Recherche du dernier élément de la liste.
    	while (p->suiv != NULL){
    		p = p->suiv; 
    	}
     
    	q = (Element *) malloc (sizeof(Element)); //On place notre élément à la suite.
    	q->convers=conv;
    	q->suiv=NULL;
    	p->suiv = q;
    	}
    }
     
     
    void afficher(Liste l)
    {
    	Liste p=l;
    	while(p->suiv != NULL)
    	{
    		printf("%c %s\n",p->convers.lettre,p->convers.morse);
    		p= p->suiv;
    	}
    }
     
    Liste CreeListe()
    {
    	FILE *fp;
    	Liste l = NULL;
    	Convers conv;
     
    	fp=fopen("source.txt","r");
    	if(fp==NULL) //Si le fichier n'existe pas
    	{
    		printf(" Le fichier n'existe pas \n ");
    	}
    	else //sinon on insère dans la liste chaînée
    	{
    		while (!feof(fp))
    		{
     
    			conv=lireConversion(fp);
     
    			inserFin(conv, &l); //On lit les informations d'une conversion puis
    		}       	                      //on l'insère à la fin de la liste des conversions.
    	}
    	fclose(fp);
     
    	return(l);
    }
     
     
    main()
    {
    Liste l;
    l=CreeListe();
    afficher(l);
    }
    Voila alors j'ai comme erreur : Mon fichier source .txt contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A ..
    B .-
    C ...-
    Voila mon but est de mettre ce que je lis dans mon fichier dans ma structure et aussi dans l'arbre.

    J'espere que vous me répondrez rapidement!

    Merci d'avance

    Benoît

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [C][DEBUTANT] Problème incompréhensible! Fichier + liste
    Citation Envoyé par djsbens
    Voila alors j'ai comme erreur :
    Tu devrais apprendre à mieux configurer ton compilateur :
    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
     
    Compiling: main.c
    main.c:26: warning: no previous prototype for 'lireConversion'
    main.c: In function `lireConversion':
    main.c:33: warning: format argument is not a pointer (arg 3)
    main.c:38: warning: int format, pointer arg (arg 2)
    main.c:30: warning: unused variable `p'
    main.c: At top level:
    main.c:48: warning: no previous prototype for 'inserFin'
    main.c:77: warning: no previous prototype for 'afficher'
    main.c:87: warning: function declaration isn't a prototype
    main.c:114: warning: return type defaults to `int'
    main.c: In function `lireConversion':
    main.c:26: warning: function returns an aggregate
    main.c:28: warning: 'lettre' might be used uninitialized in this function
    main.c: In function `CreeListe':
    main.c:102: warning: function call has aggregate value
    main.c: In function `main_':
    main.c:118: warning: control reaches end of non-void function
    Linking console executable: C:\dev\forums\OP\01.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 12 warnings
    Bref, il se passe n'importe quoi...

    Commentaires, corrections, sécurisation... Je n'ai pas le fichier de donnée...
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    /* -ed-
       Reformattage
       Suppression commentaires //
       ajoute 'static' aux fonctions privees 
    */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    /* Cette structure représente une conversion lettre--> morse */
    struct conversion
    {
        char lettre;
        char morse[3];
    };
    typedef struct conversion Convers;
     
    /* Cette structure représente un maillon de la liste. */
    struct element
    {
        Convers convers;
        struct element *suiv;
    };
    typedef struct element Element;
    typedef Element *Liste;
     
    static Convers lireConversion(FILE *F)
    {
        Convers conv;
        char lettre;
        char morse[3];
        /* -ed- non utilise
        char *p;
        */
        int i;
     
        /* -ed- ajoute '&' */
        fscanf(F,"%c",&lettre);
        printf("lettre :%c",lettre);
        conv.lettre= lettre;
     
        /* -ed- mis "%s" */
        fscanf(F,"%s",morse);
        printf("morse :%s",morse);
     
        /* -ed- et strcpy() ? */
        for(i=0;i<3;i++)
        {
            conv.morse[i]=morse[i];
        }
     
        return(conv);
    }
     
    static void inserFin (Convers conv, Liste *l)
    {
        Liste p, q;
     
        if (*l == NULL) //Si la liste est vide, on initialise le premier élement de la liste
        {       //avec l'élément donné.
            p = (Element*) malloc (sizeof(Element));
            p->convers = conv;
            p->suiv = NULL;
            *l = p;
        }
     
        else //Sinon on cherche le dernier élément de la liste puis on place l'élément donné à la suite.
        {
            p = *l;
     
            //Recherche du dernier élément de la liste.
            while (p->suiv != NULL)
            {
                p = p->suiv;
            }
     
            q = (Element *) malloc (sizeof(Element)); //On place notre élément à la suite.
            q->convers=conv;
            q->suiv=NULL;
            p->suiv = q;
        }
    }
     
    static void afficher(Liste l)
    {
        Liste p=l;
        while(p->suiv != NULL)
        {
            printf("%c %s\n",p->convers.lettre,p->convers.morse);
            p= p->suiv;
        }
    }
     
    /* -ed- ajoute void */
    static Liste CreeListe(void)
    {
        FILE *fp;
        Liste l = NULL;
        Convers conv;
     
        fp=fopen("source.txt","r");
        if(fp==NULL) //Si le fichier n'existe pas
        {
            printf(" Le fichier n'existe pas \n ");
        }
        else //sinon on insère dans la liste chaînée
        {
            while (!feof(fp))
            {
     
                conv=lireConversion(fp);
     
                inserFin(conv, &l); //On lit les informations d'une conversion puis
            }                                //on l'insère à la fin de la liste des conversions.
     
            /* -ed- deplace. fclose(NULL) = comportement indefini */
            fclose(fp);
        }
     
        return(l);
    }
     
    /* -ed- ajoute int  et void */
    int main(void)
    {
        Liste l;
        l=CreeListe();
     
        /* -ed- ajoute protection */
        if (l != NULL)
        {
            afficher(l);
        }
     
        /* -ed- ajoute */
        return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 337
    Points : 130 285
    Points
    130 285
    Billets dans le blog
    1
    Par défaut
    Il faut savoir chercher un peu soi-même quand le programme plante. Nous ne sommes pas là pour faire du débuggage. Néanmoins, voici quelques indices.

    Comme tu as une erreur "Segmentation fault", je suppose que tu travailles sous Unix, avec gcc.

    Toujours penser à utiliser, au minimum, l'option -Wall de gcc pour activer les avertissements les plus pertinents.

    J'obtiens déjà ça en compilant ton programme avec cette option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test.c: Dans la fonction « lireConversion »:
    test.c:28: attention : l'argument de format n'est pas un pointeur (arg 3)
    test.c:33: attention : format int, arg pointeur (arg 2)
    test.c:25: attention : unused variable `p'
    test.c: Hors de toute fonction :
    test.c:109: attention : return type defaults to `int'
    test.c: Dans la fonction « main »:
    test.c:113: attention : control reaches end of non-void function
    En effet à la ligne 28 :
    Grave erreur ! fscanf a besoin d'un pointeur vers la variable à remplir. Tu as oublié un & devant lettre, ceci provoquera certainement un Segfault.

    Ligne 33:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("morse :%c",morse);
    Encore une erreur "grave". morse n'est pas un caractère, c'est un tableau de 3 caractères. Utilisé comme "morse", tu obtiens un pointeur vers un tableau, et non pas un caractère. Si tu voulais afficher le premier caractère, tu aurais dû faire "morse[0]". Si tu voulais afficher la chaîne, tu aurais dû faire "%s" au lieu de "%c". Cette erreur ne t'aurait pas fait un segfault, mais tu aurais obtenu n'importe quoi.

    Corrige déjà ces erreurs que gcc peut détecter de lui-même à condition de lui demander d'afficher les avertissements courants avec l'option -Wall et ça ira déjà bien mieux !

    Et si ça ne suffit pas, il ne faut pas hésiter à faire tourner ton programme sous gdb. Gdb peut pointer là où ton programme a planté.

    Bon courage.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

Discussions similaires

  1. [XL-2010] Problème envoie fichier, liste déroulante
    Par XiaoGouGou dans le forum Excel
    Réponses: 3
    Dernier message: 14/06/2013, 14h57
  2. Réponses: 3
    Dernier message: 25/10/2007, 21h57
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

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