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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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