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 :

fgets & co... prog lit dans mes pensées :s:s !!


Sujet :

C

  1. #1
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut fgets & co... prog lit dans mes pensées :s:s !!
    re !

    je ne comprends pas l'affichage d'un code que j'ai fait :

    voici le 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include<stdio.h>
     
    #include<stdlib.h>
     
    #include<string.h>
     
    void sauterdeuxlignes(char*,FILE*);
     
    static void clean (char*,FILE*);
     
    int main (void)
    {
     
     FILE*fpaero;
     
     int i=0,j=0,k=0;
     
     char *chaine=  (char *)malloc(200*sizeof(char)+1),*IDtemp=  (char *)malloc(200*sizeof(char)+1);
     
     if((fpaero=fopen("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\testlogincorrigé\\tlogcorr\\FicCaracteristiquesAeroport.txt","r"))==NULL)
     {
     
      fprintf(stderr,"\nerreur impo lire fich FicCaracteristiquesAero.txt\n");
     
      return(EXIT_FAILURE);
     } 
     
     sauterdeuxlignes(chaine,fpaero);
     
     while(fgets(chaine,sizeof (chaine),fpaero)!=NULL)
     {
     
      clean(chaine,fpaero);
     
      puts(chaine);
     }
     return 0;
    }

    avec les fonctions clean et sauterdeux lignes:

    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
     
    void sauterdeuxlignes(char* chaine,FILE *flot)
    {
     fgets(chaine,sizeof chaine,flot);
     
     clean(chaine,flot); 
     
     fgets(chaine,sizeof chaine,flot);
     
     clean(chaine,flot); 
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
     
      if (p != NULL)
      {
       /* ... and kill */
       *p = 0;
      }
      else
      {
       /* purge */
       int c;
     
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
      }
    }

    le fichier que j'ouvre est le suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Num Aeroport  Nom Aeroport  Fuseau horaire  Heure ouverture  Heure Fermeture
    ====================================================================================================
    2  Roissy  GMT + 0  00:00  23:59
    3  Bruxelles  GMT + 0  06:00  22:59
    5  Sydney  GMT + 10  00:00  23:59
    6  Le Caire  GMT + 2  03:00  22:59
    7  New York  GMT - 5  00:00  23:59
    8  Montreal  GMT - 5  01:00  23:59
    9  Mexico  GMT - 6  03:00  22:30
    10  Tunis  GMT + 0  05:00  23:00
    11  Cape Town  GMT + 0  02:00  23:59
    12  Kigali  GMT + 0  04:00  21:45
    13  Abidjan  GMT + 0  01:00  23:59
    champs séparés par deux tabulations

    et le probleme c'est que mon code m'affiche seulement les numeros au debut de chaque ligne...

    bon en soi c'est bien vu que par la suite je dois les isoler et les mettre dans un tableau mais bon je sais pas comment le programme lit dans mes pensées et les isole tout seul lool

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    sizeof(chaine) te reverra la taille occupé par une variable du type de chaîne : soit en général 4 (puisque c'est un pointeur, donc en général sur 4octets)

    et non la taille allouée pour chaine...

    il faudrait donc mettre 200

    de plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *chaine=  (char *)malloc(200*sizeof(char)+1)
    tant qu'à faire utiliser sizeof(char) (même si ça vaut toujours 1 ), autant l'utiliser jusqu'au bout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *chaine=  (char *)malloc((200+1)*sizeof(char))
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    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 BnY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     char *chaine=  (char *)malloc(200*sizeof(char)+1),*IDtemp=  (char *)malloc(200*sizeof(char)+1);
     
    sauterdeuxlignes(chaine,fpaero);
     
     while(fgets(chaine,sizeof (chaine),fpaero)!=NULL)
     {
    Comme il a été expliqué 4000 fois, l'opérateur sizeof sert à évaluer la taille d'un objet. Evidemment, le resultat n'est pas le même avec un tableau et un pointeur sur le tableau...

    Il faut passer la taille à la fonction.

    Il a aussi été expliqué un nombre incalculable de fois que malloc() pouvait échouer (retourne NULL). De plus, pourquoi une allocation pour un tableau de taille fixe ?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Encore plus court:

    char * chaine = malloc (201);
    Mais c'est vrai que si la taille n'évolue pas au cours du programme un tableau static suffit largement !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    alors a chaque appel a fgets qui remplit chaine, sa taille ne change pas ??

    je comprends pas bien ...: si le fichier a des lignes de taille differente n'est il pas mieux de faire une allocation dynamique plutot qu'un tableau de taille fixe ?? vous pouvez m'expliquer ?

    et oki donc il faut que je passe la taille a ma fonction fgets c'est ca ?? d'un coté je comprends pas alors pourquoi ma fonction afficher_fichier() suivante me l'affiche correctement ...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void afficher_fichier(FILE *flot)
    {
     char *chaine =  (char *)malloc(2*sizeof(char)+1);
     
     while(fgets(chaine,sizeof (chaine),flot)!=NULL)
     {
      printf("%s",chaine);
     }
    }
    la il m'affiche toute la ligne... je comprends pas pourquoi il ne le fait pas dans l'autre cas...

    bon et si j'ai fait malloc c'est parcequ'on me l'a proposé pour resoudre un probleme de debug assertion failed... et il est vrai que si je l'enleve je retrouve ce probleme que j'arrive pas a resoudre ... donc bon si ce n'est pas dérangeant, l'allocation dynamique ira pour cette fois :

    je precise : la je cherche pas a rendre un projet le plus optimal qui soit, mais un projet qui marche lol et il doit marcher pour mardi donc, je verrais l'optimisation de la memoire et tout plus tard pour ma curiosité personnelle ...

  6. #6
    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 BnY
    alors a chaque appel a fgets qui remplit chaine, sa taille ne change pas ??
    Ben non. Tu voudrais la faire changer sur quel critère ?[1]
    je comprends pas bien ...: si le fichier a des lignes de taille differente n'est il pas mieux de faire une allocation dynamique plutot qu'un tableau de taille fixe ?? vous pouvez m'expliquer ?
    Si les longueurs de lignes sont très différentes, oui, il faut un système souple ([1]). Mais dans la majorité des cas, une taille 'raisonnable' suffit. (128, 256...)
    et oki donc il faut que je passe la taille a ma fonction fgets c'est ca ??
    Oui.
    d'un coté je comprends pas alors pourquoi ma fonction afficher_fichier() suivante me l'affiche correctement ...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void afficher_fichier(FILE *flot)
    {
     char *chaine =  (char *)malloc(2*sizeof(char)+1);
     
     while(fgets(chaine,sizeof (chaine),flot)!=NULL)
     {
      printf("%s",chaine);
     }
    }
    Ce code est incorrect. Tu alloues 2 char et tu passes sizeof (char*) (probablement 4 sur ta machine). Tu ments à fgets() qui evidemment va écrire au delà des 2 char alloués (on lui a autorisé 4). Le comportement est indéfini. Tout peut arriver (y compris une apparence de bon fonctionnement).
    bon et si j'ai fait malloc c'est parcequ'on me l'a proposé pour resoudre un probleme de debug assertion failed... et il est vrai que si je l'enleve je retrouve ce probleme que j'arrive pas a resoudre ...
    Mais c'est n'importe quoi. Tu n'as rien compris ! On t'a déjà dit que tu avais un problème si tu passais NULL à fgets(). Mais si tu passes un nom de tableau, aucun problèmes. Tu n'as donc jamais vu de genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char line[123];
       fgets (line, sizeof line, stdin);
    Alors qu'est ce que tu attends pour le transposer à ton problème au lieu de bricoler avec des malloc() inutiles (ici) et que tu maitrise pas (valeur non testé, blocs non libérés...). Reste simple. Tableau de char. Point.

    Commence par apprendre à lire un fichier texte ligne par ligne avec fgets() d'un façon simple et directe... Une fois que tu maitrises une étape, attaque la suivante. Tu veux tout faire sans rien maitriser, tu n'y arrivera jamais.

    Ton histoire d'aéroport ça fait plus d'un mois que ça dure. Il y a un problème non ? Ben si : tu n'apprends pas les choses dans l'ordre et une par une comme tu le devrais. C'est tout.
    je precise : la je cherche pas a rendre un projet le plus optimal qui soit, mais un projet qui marche lol et il doit marcher pour mardi donc, je verrais l'optimisation de la memoire et tout plus tard pour ma curiosité personnelle ...
    Mais il ne faut pas non plus rendre un projet plus compliqué que nécessaire... La simplicité est gage de réussite.

    -----------------------------------
    [1] En réalité, il est possible de lire une ligne de taille qulequonque en combinant malloc(), la taille et fgets() dans un algo astucieux, mais tu n'en es pas encore là...

  7. #7
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    Ton histoire d'aéroprt ça fait plus d'un mois que ça dure. Il y a un problème non ? Ben si : tu n'apprends pas les choses dans l'ordre et une par une comme tu le devrais. C'est tout.
    oui il y a un probleme: le probleme c'est que je suis nul, que je comprends rien et que moi qui aimait un tant soit peu la programmation, ce projet men degoute!!!!
    j'en peux plus, y a toujours des bugs, j'arrive pas a faire ce que jveux et la ca commence vraiment a me gonfler!!!!!

    ca me casse les c**** cette histoire et si je reste encore autant motivé pour rendre un truc bien et chercher jusqu'a la derniere seconde a regler mes problemes c'est parceque on est en binome et que je ne veux pas faire ma p***!!!!

    maintenant c'est pas parceque je suis motivé que je vais devenir bon en programmation en un mois!!!!!!!

    autrement :

    Citation:
    bon et si j'ai fait malloc c'est parcequ'on me l'a proposé pour resoudre un probleme de debug assertion failed... et il est vrai que si je l'enleve je retrouve ce probleme que j'arrive pas a resoudre ...

    Mais n'importe quoi. On t'a déjà dit que tu avais un problème si tu passais NULL à fgets().
    desolé mais tu n'étais pas la pendant deux heures avec moi pour essayer de regler un probleme dans la nuit de vendredi a samedi alors que doudouallemand l'était... et t'es bien gentil de dire "mais nimportequoi" mais en attendant il m'a reglé mon probleme!!! et tu n'es pas a ma place: si je te dis que je retrouvais ce probleme de debug assertion failed c'est que je le retrouvais!!!

    et désolé de ne pas atteindre ton niveau en informatique, que je n'atteindrais surement jamais tellement ca commence a me degouter cette histoire de projet et de gens qui preferent t'engueuler plutot que de comprendre que t'en as plus raz le bol qu'eux...

    merci quand meme pour le tableau, au moins ca marche pour afficher mon fichier... meme si c'était pas trop ca le probleme de base que je rencontrais, mais plus de la curiosité sur un comportement bizarre, je crois que je vais m'abstenir de poser mes autres questions sur ce sujet.

  8. #8
    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 BnY
    oui il y a un probleme: le probleme c'est que je suis nul,
    Rien à voir. Je t'ai déjà expliqué comment il fallait procéder.
    • prendre un problème
      • Passer du temps pour le maîtriser
        • Algo
        • Fonctions
        • Doc
        • Essais
    • passer au suivant.
    Tu ne t'en sortiras pas autrement. C'est sûr. On en passe tous par là. C'est pas une question d'être bon ou mauvais, c'est une question de savoir s'organiser, c'est tout. Si aucun prof ne t'a appris ça, tu peux leur demander des comptes...
    que je si je te dis que je retrouvais ce probleme de debug assertion failed c'est que je le retrouvais!!!
    Exemple typique de problème non maitrisé. Dès le lendemain de ta nuit blanche (je dormais, désolé, ça m'arrive parfois), je t'ai expliqué le problème. Je te garantis qu'en passant un nom de tableau, le fonctionnement est correct. C'est la méthode de base pour utiliser cette fonction.

    J'ai peur que tu confondes avec un autre problème qui était dû un mauvais nom de fichier ce qui fait que le 3ème paramètre (le flux) se retrouvait avec un NULL, traité de la même façon par ton implémentation de fgets()...

    Ce genre de problème se résout en écrivant un code minimum qui met en oeuvre les fonctions sans se noyer dans les détails de ton application...

  9. #9
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    mais je suis entierement d'accord avec toi sur ce principe mais plus maintenant a deux jours de l'échéance... la je suis las de ce projet qui, comme tu dis, me pose vraiment un probleme... et plus je suis las moins je comprends... et quand tu te fais recaler comme de la m**** parceque tu comprends rien, meme au bout de 10000 fois, et ben au lieu de te motiver ca te fais plutot reflechir à :

    "finalement je comprends rien, et y a ptet pas d'issu pour cette fois la vu que ca fait un mois... faut ptet que j'arrete de rever pour rendre un projet a temps..."

    donc si tu veux la je suis pas en mode "c'est cool je comprends tou c'est facile" mais plutot en mode "je fais de mon mieux, et tant pis pour la casse"...

  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 BnY
    "finalement je comprends rien, et y a ptet pas d'issu pour cette fois la vu que ca fait un mois... faut ptet que j'arrete de rever pour rendre un projet a temps..."
    Est-ce que au moins tu as appris quelque chose ? C'est le but d'un projet. La note importe peu, sauf si elle conditionne un examen ou un passage en classe supérieure, mais sil il te faut un an de plus, pourquoi pas. C'est un drame ?

  11. #11
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    la note M' importe peu, mais comme precisé plus haut, je suis en binome... et un an de plus pour lui n'est pas pareil que pour moi ( l'école coute cher), donc par respect, je vais faire de mon mieux.

    pour ce qui est d'un an de plus pour moi, ce serait pas la premiere fois... donc bon... et de toute maniere mon avenir n'est pas forcement dans cette ecole... enfin ce n'est pas le sujet,

    je dirai juste que je cherche plus a arriver au bout de ce projet par fierté que pour la note: on n'est quand meme plus satisfait de voir son taff aboutir a quelquechose, et avec un projet fini qui marche, meme s'il comporte encore un peu d'erreurs normales pour des debutants, que de ne pas finir un taff...

    bon sinon j'ai un probleme sur strtok:

    dans mon livre de C elle est définie comme suit: char* strtok(s,ct)
    s de type char* et ct de type const char*.

    dans mon prog je declare donc les tableaux suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine[200,]ID1[4],ID2[4],dist[10];
    et ct ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* tabul="\t";
    et j'utilise cette fonction comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      while(fgets(chaine,sizeof chaine,fpcorres)!=NULL)
      {
       ID1=strtok(chaine,tabul);
       ID2=strtok(NULL,tabul);
       dist=strtok(NULL,tabul);
      }
    et j'obtiens les erreurs: left operand must be l-value... dois-je declarer ID1, ID2 et dist non pas comme des tableaux mais vraiment comme des pointeurs char* ??? alors que le nom d'un tableau est un pointeur (ici vers des char)...
    je comprends pas d'ou vient l'erreur ..

  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 BnY
    bon sinon j'ai un probleme sur strtok:

    dans mon livre de C elle est définie comme suit: char* strtok(s,ct)
    s de type char* et ct de type const char*.

    dans mon prog je declare donc les tableaux suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine[200,]ID1[4],ID2[4],dist[10];
    et ct ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* tabul="\t";
    et j'utilise cette fonction comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      while(fgets(chaine,sizeof chaine,fpcorres)!=NULL)
      {
       ID1=strtok(chaine,tabul);
       ID2=strtok(NULL,tabul);
       dist=strtok(NULL,tabul);
      }
    et j'obtiens les erreurs: left operand must be l-value... dois-je declarer ID1, ID2 et dist non pas comme des tableaux mais vraiment comme des pointeurs char* ???
    Oui.
    alors que le nom d'un tableau est un pointeur (ici vers des char)...
    Le nom du tableau est un pointeur non modifiable. Il ne peut peut donc pas être une L-value (partie gauche d'une expression comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ID1=strtok(chaine,tabul);

  13. #13
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    oki bon c'est ce que j'ai fait en attendant de toute maniere, mais maintenant je sais a quoi c'est dû

    par contre je crois que j'ai de nouveau un probleme avec mon fgets...

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define MAX_AEROPORTS 23
     
    void sauterdeuxlignes(char*,FILE*);
    static void clean (char*,FILE*);
    void afficher_fichier(FILE *);
     
    int main (void)
    {
        FILE*fpaero;
        FILE*fpcorres;
        int tab[MAX_AEROPORTS];
        int i=0,j=0,k=0,l=0;
        const char* tabul="\t";
        char chaine[200];
        char *ID1,*ID2,*dist;
        int tableau[MAX_AEROPORTS][MAX_AEROPORTS];
     
        if((fpaero=fopen("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\testlogincorrigé\\tlogcorr\\FicCaracteristiquesAeroport.txt","r"))==NULL)
        {
           fprintf(stderr,"\nerreur impo lire fich FicCaracteristiquesAero.txt\n");
     
           return(EXIT_FAILURE);
        } 
     
        sauterdeuxlignes(chaine,fpaero);
     
        while(fgets(chaine,sizeof (chaine),fpaero)!=NULL)
        {
            tab[i]=atoi(chaine);
     
            i++; 
        }
     
        for(i=0;i<MAX_AEROPORTS;i++)
        {
            printf("\nvoila:%d",tab[i]);
     
            tableau[j][0]=tab[i];
     
            tableau[0][j]=tab[i];
     
            j++;
       }
     
       if((fpcorres=fopen("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\testlogincorrigé\\tlogcorr\\FicCorrespondanceAeroport.txt","r"))!=NULL)
     {
          afficher_fichier(fpcorres);
     
          while(fgets(chaine,sizeof chaine,fpcorres)!=NULL)  // c'est par la que ca foire
          {  
              ID1=strtok(chaine,tabul);
     
              ID2=strtok(NULL,tabul);
     
              dist=strtok(NULL,tabul);
     
              i=atoi(ID1);
     
              j=atoi(ID2);
     
             tableau[i][j]=atoi(dist);  
          }
     
          for(i=0;i<MAX_AEROPORTS;i++)
          {
              for(j=0;j<MAX_AEROPORTS;j++)
              {
                  printf("\t%d",tableau[i][j]);
              }
          }
     
     } else {
      fprintf(stderr,"\nerreur impo lire fich FicCaracteristiquesAero.txt\n");
     
      return(EXIT_FAILURE);
     }
     
     return 0;
    }
    je sais pas si je merde encore certains trucs avec fgets ou si c'est du a strtok ou autre chose encore..
    pourriez m'aidez ??

  14. #14
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    comment tester mon fgets ??

  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 BnY
    par contre je crois que j'ai de nouveau un probleme avec mon fgets...
    Code incomplet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Compiling: main.c
    main.c: In function `main_':
    main.c:16: warning: unused variable `k'
    main.c:16: warning: unused variable `l'
    main.c:83:2: warning: no newline at end of file
    main.c: At top level:
    main.c:8: warning: 'clean' declared `static' but never defined
    Linking console executable: C:\dev\forums\OP\01.exe
    .objs\dev\forums\OP\main.o: In function `main_':
    C:/dev/forums/OP/main.c:29: undefined reference to `sauterdeuxlignes'
    C:/dev/forums/OP/main.c:51: undefined reference to `afficher_fichier'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)

  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 BnY
    comment tester mon fgets ??
    En affichant ce qu'il a lu ?

  17. #17
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    c'est sur que je n'ai pas mis les fonctions qui vont avec dans tous les post lol : les voici:

    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
     
    void sauterdeuxlignes(char* chaine,FILE *flot)
    {
     fgets(chaine,sizeof chaine,flot);
     clean(chaine,flot); 
     fgets(chaine,sizeof chaine,flot);
     clean(chaine,flot); 
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
      if (p != NULL)
      {
       /* ... and kill */
       *p = 0;
      }
      else
      {
       /* purge */
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
      }
    }
     
    void afficher_fichier(FILE *flot)
    {
     char *chaine =  (char *)malloc(2*sizeof(char)+1);
     
     while(fgets(chaine,sizeof (chaine),flot)!=NULL)
     {
      printf("%s",chaine);
     }
    }
    a rajouter en fin de code precedent

  18. #18
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    oki donc deja le fgets a un problm:

    dans ma boucle while seulement deux fgets sont executés... je vois pas pourquoi cela marche deux fois et pas trois ????? :s :s :s

  19. #19
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    bon rectification il en affiche plus que trois: presque tout le fichier est bien lu comme ca sauf les deux dernieres lignes... ce dont je ne connais toujours pas la cause.. !!

  20. #20
    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 BnY
    a rajouter en fin de code precedent
    Ben oui, mais la derniere fonction est fausse, comme déjà expliqué. Si tu ne corriges pas le code, on y arrivera jamais.

    Et je n'allais pas reprendre du code faux, je ne suis pas maso...

    Ceci fonctionne à peu près :
    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
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define MAX_AEROPORTS 23
     
    #if 0
    #define F_AIRPORTS "C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\testlogincorrigé\\tlogcorr\\FicCaracteristiquesAeroport.txt"
    #else 
    /* simplicite... */
    #define F_AIRPORTS "airport.txt"
    #endif
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
     
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
     
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    static int sauterdeuxlignes(FILE *flot)
    {
       int n = 0;
       int c;
     
       while ((c = fgetc(flot)) != '\n' && c != EOF && n < 2)
       {
          if (c == '\n')
          {
             n++;
          }
       }
       return c;
    }
     
    static void afficher_fichier(FILE *flot)
    {
       char chaine[128];
     
       while (fgets(chaine, sizeof (chaine), flot) != NULL)
       {
          printf("%s", chaine);
       }
    }
     
    int main (void)
    {
       int ret = EXIT_SUCCESS;
       FILE*fpaero = fopen(F_AIRPORTS, "r");
     
       if (fpaero != NULL)
       {
          int c = sauterdeuxlignes(fpaero);
     
          if (c != EOF)
          {
             int tableau[MAX_AEROPORTS][MAX_AEROPORTS];
             int tab[MAX_AEROPORTS];
             {
                int i = 0;
                char chaine[200];
                while (fgets(chaine, sizeof (chaine), fpaero) != NULL)
                {
                   tab[i] = atoi(chaine);
                   i++;
                }
                printf ("%d airports loaded\n", i);
             }
     
             {
                int i;
                int j;
                for (i = 0, j = 0;i < MAX_AEROPORTS;i++)
                {
                   printf("%4d\n", tab[i]);
                   tableau[j][0] = tab[i];
                   tableau[0][j] = tab[i];
                   j++;
                }
             }
    #if 0
             FILE*fpcorres;
             int i = 0, j = 0;
             const char* tabul = "\t";
             char *ID1, *ID2, *dist;
             int tableau[MAX_AEROPORTS][MAX_AEROPORTS];
    #endif
    #if 0
     
             if ((fpcorres = fopen("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\testlogincorrigé\\tlogcorr\\FicCorrespondanceAeroport.txt", "r")) != NULL)
             {
                afficher_fichier(fpcorres);
     
                while (fgets(chaine, sizeof chaine, fpcorres) != NULL)  // c'est par la que ca foire
                {
                   ID1 = strtok(chaine, tabul);
     
                   ID2 = strtok(NULL, tabul);
     
                   dist = strtok(NULL, tabul);
     
                   i = atoi(ID1);
     
                   j = atoi(ID2);
     
                   tableau[i][j] = atoi(dist);
                }
     
                for (i = 0;i < MAX_AEROPORTS;i++)
                {
                   for (j = 0;j < MAX_AEROPORTS;j++)
                   {
                      printf("\t%d", tableau[i][j]);
                   }
                }
     
             }
             else
             {
                fprintf(stderr, "\nerreur impo lire fich FicCaracteristiquesAero.txt\n");
     
                return (EXIT_FAILURE);
             }
    #endif
          }
          fclose (fpaero), fpaero = NULL;
       }
       else
       {
          perror(F_AIRPORTS);
          ret = EXIT_FAILURE;
       }
       return ret;
    }
    Mais le comportement est indéfini. En effet, il y a 12 enregistrements dans le fichier et tu fais un traitement (copie, affichage) comme si il y en avait 23. Pourquoi ?

    En tout cas, ça explique cet affichage étrange :
    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
     
    12 airports loaded
       0
       2
       3
       5
       6
       7
       8
       9
      10
      11
      12
      13
    50463490
    50463008
    117835012
    185207048
    252579084
    319951120
    387323156
    454695192
    522067228
    589439264
    656811300
    Pose des questions si tu ne comprends pas (mais reflechi un peu avant de poser la question...)

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/04/2007, 11h30
  2. Réponses: 3
    Dernier message: 01/03/2006, 15h23
  3. [Apache] Erreur dans mes scripts CGI
    Par GLDavid dans le forum Apache
    Réponses: 2
    Dernier message: 28/08/2004, 06h14
  4. [CR] Oubli dans mes jours
    Par sbis dans le forum SAP Crystal Reports
    Réponses: 10
    Dernier message: 06/08/2004, 14h07
  5. [Process] Probleme d'execution d'un prog c dans un prog java
    Par Elmilouse dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/06/2004, 14h26

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