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 de fgets


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut problème de fgets
    coucou,

    voilà j'ai une erreur que je n'explique pas avec un fgets

    voici mon 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
    23
    24
    if(TableauCarte!=NULL) //allocation réussie
        {
            for(i=0;i<NbLigne;i++)
            {
                //on récupère les données
     
                printf("%s\n",fgets(buffer, MAX_CHAR, fp));
                if(fgets(buffer, MAX_CHAR, fp)==NULL);
                {
                    printf("Erreur, impossible de récupérer les infos de la carte pour la ligne: %d",i+1);
                    exit(-1);
                }
                //initialisation du 1er element de la ligne
                TableauCarte[i][0] = strtol(buffer, &endChar, 10);
                for(j=1;j<NbCol;j++)
                {
                  TableauCarte[i][j] = strtol(endChar + 1, &endChar, 10);
     
                }
            }
     
            fclose(fp);
            return TableauCarte;
        }
    le problème se trouve à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%s\n",fgets(buffer, MAX_CHAR, fp));
                if(fgets(buffer, MAX_CHAR, fp)==NULL);
    en fait j'ai ajouté un printf pour voif ce que ca affiche, et là ca m'affiche ma ligne de données. Or (en enlevant mon printf) ma condition if est validée, pourtant mon fgets renvoie bien quelque chose.
    Pourquoi?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Dans ton printf tu fais appel à fgets() et tu lis une ligne, dans ton 'if' tu refais appel à fgets() mais tu lis la ligne suivante.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    non...
    Or (en enlevant mon printf)

  4. #4
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Si ...
    Citation Envoyé par Arpivu
    Dans ton printf tu fais appel à fgets() et tu lis une ligne, dans ton 'if' tu refais appel à fgets() mais tu lis la ligne suivante.
    Combien vaut NbLigne ? '1' par hasard ?

  5. #5
    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
    tu as un ; tout de suite après le if...

    Donc ça ne fait ren....

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Citation Envoyé par femtosa
    Si ...
    non

    tu as un ; tout de suite après le if...
    oui désolé

    merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    erf j'ai toujours un souci...
    maintenant je vois plus ce qu'il y a dans le if mais ca plante


    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
        if(TableauCarte!=NULL) //allocation réussie
        {
            for(i=0;i<NbLigne;i++)
            {
                //on récupère les données
     
                //printf("%s\n",fgets(buffer, MAX_CHAR, fp))
                if(fgets(buffer, MAX_CHAR, fp)==NULL)
                {
                    printf("Erreur, impossible de récupérer les infos de la carte pour la ligne: %d",i+1);
                    exit(-1);
                }
                printf("hu");
                //initialisation du 1er element de la ligne
                TableauCarte[i][0] = strtol(buffer, &endChar, 10);
                printf("hu2");
                for(j=1;j<NbCol;j++)
                {
                  TableauCarte[i][j] = strtol(endChar + 1, &endChar, 10);
     
                }
            }
     
            fclose(fp);
            return TableauCarte;
        }

    siand je fais mon if(fgets....) il effectue bien un fgets? car apres mon souci vient de la ligne entre mon printf de "hu" et "hu2"

    voici mon endchar (sa declaration)
    mais ca vient pas de là (enfin je pense pas) car dasn un autre code semblable j'utilise ca comme ca et pas de prbolème


    EDIT : j'ai ptet une idée sur d'où peut venir le problème mais je le vois pas...

    voici quelques autres info de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int **TableauCarte;
     
    NbLigne = strtol(buffer, &endChar, 10);//nombre de lignes du tableau...
    NbCol = strtol(endChar + 1, &endChar, 10);
     
    TableauCarte = malloc(sizeof(Ennemi)*NbLigne*NbCol);

    ca vient peut etre du malloc? pourtant si ca vient de là je devrait pas rentrer das mon code tout en haut car je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(TableauCarte!=NULL) //allocation réussie
    voilà...

  8. #8
    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
    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
                p = strtok ( buffer, " \n\t");
                if ( p == NULL )
                  {
                     fprintf ( stderr, "\n Mauvause ligne\n");
                     continue ;
                  }
    
                sscanf (p, "%d", &TableauCarte[i]);
                for(j=1;j<NbCol;j++)
                  {
                      p = strtok ( NULL, " \n\t");
                      if ( p != NULL )
                          sscanf ( p, "%d", &TableauCarte[i*NbCol+j] );
                  }

  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 Elstak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int **TableauCarte;
     
    TableauCarte = malloc(sizeof(Ennemi)*NbLigne*NbCol);
    C'est faux.

    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    ok merci,

    je suis allé voir la page mais j'ai un peu de mal il faut dire


    j'ai fais comme ca mais ca va toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int **TableauCarte;
     
    size_t k;
     
    **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
       for (k = 0; k < NbLigne; k++)
       {
          TableauCarte[k] = malloc (sizeof *TableauCarte[k] * NbCol);
       }
    c'est qu'n fait dasn ta page je comprend pas trop ce qu'est le 'T' du 'T **pp' c'est un type quelconque?

    autre question, quand on déclare size_t i ca donne quoi? size_t est un type? chui un peu pommé sur ce truc

  11. #11
    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 Elstak
    je suis allé voir la page mais j'ai un peu de mal il faut dire

    j'ai fais comme ca mais ca va toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int **TableauCarte;
     
    size_t k;
     
    **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
       for (k = 0; k < NbLigne; k++)
       {
          TableauCarte[k] = malloc (sizeof *TableauCarte[k] * NbCol);
       }
    Ca me parait correct. Qu'est-ce qui ne va pas ?
    c'est qu'n fait dasn ta page je comprend pas trop ce qu'est le 'T' du 'T **pp' c'est un type quelconque?
    C'est le type d'un élément du tableau (ici, int).
    EDIT : Site modifié.
    autre question, quand on déclare size_t i ca donne quoi? size_t est un type? chui un peu pommé sur ce truc
    Il faut être un peu curieux...

    http://emmanuel-delahaye.developpez....tes.htm#size_t

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    ok merci pour le size_t


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
    ca merde ici (j'ai mis un printf avant et un autre apres et celuis d'apres n'apparait pas ... donc c'est pendant cette ligne)

    l'erreur est "la mémoire ne peut pas etre read"

    voilà

    EDIT : je comprend pas pourquoi tu utilise un size_t ici, un int ne conviendrait pas? et en y repensant, les entiers non signés on peut les déclarer, donc dans quel cas sert size_t ? je veux dire pourquoi sizeof renvoit un type size_t (entier non signé) alors que ca existe déjà (je sais plus ce que c'est exactement mais un truc du genre unsigned int non?)

  13. #13
    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 Elstak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
    ca merde ici (j'ai mis un printf avant et un autre apres et celuis d'apres n'apparait pas ... donc c'est pendant cette ligne)

    l'erreur est "la mémoire ne peut pas etre read"
    Peux-tu poster le code exact et compilable qui pose problème à l'exécution.

    EDIT : je comprend pas pourquoi tu utilise un size_t ici
    Il faut que je recopie l'article sur size_t ? Il y a des mots que tu n'as pas compris ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    oublions le size_t

    voilà le code de ma fonction :

    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
    int** RecupInfoCarte(char *NomFic,int nombre)
    {
        FILE *fp = fopen(NomFic,"r");
        int NbLigne;//nombre de lignes de la carte
        int NbCol;//nombre de col
        int i=0;
        int j;
        int **TableauCarte;//tableau d'ennemis (qui contient les info)
        //déclarations nécessaires à la récupération des info du fichier
        char  *endChar;
        char  buffer[MAX_CHAR];
        char  *Repertoire;
     
        size_t k;
     
     
        if( (Repertoire = _getcwd( NULL, 0 )) == NULL )
            printf("erreur : %s\n",strerror( errno ));
     
        if(NULL == fp)
        {
           printf("Erreur, impossible de trouver le fichier : %s\\%s\n",Repertoire,NomFic);
           exit(-1);
        }
        //on 'saute' les lignes qui ne nous interessent pas
        //c'est a dire les données des ennemis, le nombre d'ennemis et la position joueur
        while(i<nombre+2)
        {
            fgets(buffer, MAX_CHAR, fp);
            i++;
        }
     
     
     
        //on récupère la taille de la carte
        if(fgets(buffer, MAX_CHAR, fp)==NULL)
        {
            printf("Erreur, impossible de récupérer les dimensions de la carte");
            exit(-1);
        }
     
     
     
     
     
        //PASSER EN PARAM POUR LA SUITE
        NbLigne = strtol(buffer, &endChar, 10);
        NbCol = strtol(endChar + 1, &endChar, 10);
     
    //    TableauCarte = malloc(sizeof(Ennemi)*NbLigne*NbCol);
     
     
     /*   T **pp = malloc (sizeof *pp * N);
     
       size_t i;*/
    printf("hu");
    printf("%d",NbLigne);
       **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
     
       for (k = 0; k < NbLigne; k++)
       {
          TableauCarte[k] = malloc (sizeof *TableauCarte[k] * NbCol);
       }
     
     
     
     
        if(TableauCarte!=NULL) //allocation réussie
        {
            for(i=0;i<NbLigne;i++)
            {
                //on récupère les données
     
                //printf("%s\n",fgets(buffer, MAX_CHAR, fp))
                if(fgets(buffer, MAX_CHAR, fp)==NULL)
                {
                    printf("Erreur, impossible de récupérer les infos de la carte pour la ligne: %d",i+1);
                    exit(-1);
                }
                printf("hu");
                //initialisation du 1er element de la ligne
                TableauCarte[i][0] = strtol(buffer, &endChar, 10);
                printf("hu2");
                for(j=1;j<NbCol;j++)
                {
                  TableauCarte[i][j] = strtol(endChar + 1, &endChar, 10);
     
                }
            }
     
            fclose(fp);
            return TableauCarte;
        }
        fclose(fp);
        return NULL;     
     
    }
    ca ira?

    EDIT : voici les warnings

    D:\travail C\Projet\Principal.c(200) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
    D:\travail C\Projet\Principal.c(202) : warning C4018: '<' : signed/unsigned mismatch
    D:\travail C\Projet\Principal.c(200) : warning C4700: local variable 'TableauCarte' used without having been initialized
    la ligne 200 c'est celle là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);

  15. #15
    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 Elstak
    la ligne 200 c'est celle là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       **TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
    Ben oui. J'ai donné une syntaxe, il faut la suivre...
    on peut couper en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       T** p;
     
       p = malloc(...);
    mais ici, ce n'est pas utile. Il suffit de définir la variable en début de bloc. Si il n'y a pas de bloc, on peut le créer...

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    donc tu voudrais que je remplace ma ligne 200 par ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int** TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
    ?

    car si je fais ca, j'ai l'erreur :
    D:\travail C\Projet\Principal.c(200) : error C2143: syntax error : missing ';' before 'type'

    en fait il aime pas qu'on déclare des truc après qu'on ai commencé à ecrire du code c'est normal? jme souvient avoir programmé dans d'autre langages et je pense pas qu'il y avait ce problème...

    donc je m'en sort comment?

    EDIT : tu viens d'avoir 50 ans?

  17. #17
    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 Elstak
    donc tu voudrais que je remplace ma ligne 200 par ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int** TableauCarte = malloc (sizeof *TableauCarte * NbLigne);
    ?
    Par exemple.
    car si je fais ca, j'ai l'erreur :
    D:\travail C\Projet\Principal.c(200) : error C2143: syntax error : missing ';' before 'type'
    C'est possible.
    en fait il aime pas qu'on déclare des truc après qu'on ai commencé à ecrire du code c'est normal?
    En C90, oui.
    jme souvient avoir programmé dans d'autre langages et je pense pas qu'il y avait ce problème...
    J'ai donné la solution :
    Citation Envoyé par -ed-
    Il suffit de définir la variable en début de bloc. Si il n'y a pas de bloc, on peut le créer...
    Tu ne sais pas ce qu'est un bloc ?

    EDIT : tu viens d'avoir 50 ans?
    euh, ... depuis le 18 octobre...

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    non je ne sais pas ce qu'est un bloc (ou alors je ne connais pas ce terme)

  19. #19
    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 Elstak
    non je ne sais pas ce qu'est un bloc (ou alors je ne connais pas ce terme)
    C'est ce qu'il y a entre un
    {
    et un
    }
    (inclus).

    Il n'est pas inutile de relire son livre de C de temps en temps...

    K&R2 : Chapitres 3.1 et 4.8

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    super,

    merci ca marche
    Il n'est pas inutile de relire son livre de C de temps en temps...
    euh... j'en n'ai pas

    Ps : oui je savais que c'était ca un bloc mais je pensais pas que tu parlais de ca ca m'etonne que ca fonctionne comme ca mais bon

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probléme avec fgets
    Par Lucas42 dans le forum C
    Réponses: 2
    Dernier message: 18/11/2007, 03h08
  2. Problème avec fgets() et strlen()
    Par condor_01 dans le forum C
    Réponses: 6
    Dernier message: 28/10/2007, 12h41
  3. Problème avec fgets
    Par fabpeden dans le forum C
    Réponses: 13
    Dernier message: 15/05/2007, 10h25
  4. problème avec fgets
    Par salseropom dans le forum C
    Réponses: 1
    Dernier message: 03/08/2006, 14h54
  5. Problème avec fgets et tube...
    Par tchingoo dans le forum POSIX
    Réponses: 5
    Dernier message: 22/08/2003, 17h03

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