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 :

controle de la taille d'un fichier avant de le lire


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut controle de la taille d'un fichier avant de le lire
    Bonjour,
    je suis newbie en programmation C.
    Dans le cadre scolaire, je dois réaliser un vérificateur de mot avec des propositions si le mot entré ne differe pas de plus de quelques lettres.
    Cependant, je dois controler la taille du dictionnaire fourni pour utiliser le programme et je ne vois pas du tout comment vérifier cela.

    Si vous pouvez m'aider..

    Merci beaucoup !

  2. #2
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut et bienvenue sur les forums de developpez.com


    Qu'entend tu par "la taille du dictionnaire" ? La taille du fichier ? Le nombre de mots dans le dictionnaire ?
    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 !

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Salut,
    merci pour la bienvenue

    Je ne sais pas trop en fait, le cahier des charges est vague la dessus.
    Je pense que la vérification du nombre de mots dans le fichier est la meilleure chose.
    Je ne vois pas comment faire, puisque le contrôle de la longueur des mots et donc la longueur totale n'a rien a voir avec le nombre de mots.


    Merci !!

  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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ok donc au choix:

    Taille du fichier :
    Comment connaître la taille d'un fichier (ISO)?
    ou
    http://man.developpez.com/man2/fstat.2.php une fois une structure stat initialisée, tu peux lire la valeur du champ st_size de la structure pour connaître la taille du fichier !


    Nombre de mots :
    Cette solution uniquement si le dictionnaire ne comporte qu'un mot par ligne !
    1. Tu ouvres ton fichier en mode texte en lecture
    2. Dans une boucle while, tu parcours le fichier ligne par ligne avec la fonction fgets et tu boucles tant que fgets ne retourne pas NULL
    3. A chaque tour de boucle, tu incrémentes un compteur, une simple variable de type int suffit
    4. Tu fermes le fichier une fois sorti de la boucle



    Voilà, code et postes ton code
    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
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    merci pour ta réponse,
    je viens d'essayer de faire la boucle, j'utilisais deja la meme solution pour parcourir tout le fichier.
    J'ai donc fais au début un while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (fgets!=NULL && limit<constant){constant++}
    et apres une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if limit>constant{warning}
    else{lance la while avec detection des mots}
    Mais ca ne marche pas.
    Doit-on vider une memoire ou quelque chose du genre apres l'utilisation d'un fgets ?

    Désolé pour cette question de bas étage.

    Merci

  6. #6
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Montre ton code ce sera plus simple... de toutes manière rien que l'utilisation de fgets montré n'est pas bonne ! Je t'ai fournit un lien vers cette fonction dont son prototype est présenté !

    Faut faire attention sur comment tu programmes, là c'est complètement faux !
    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 !

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Voila ce que j'ai fait.
    Avant d'utiliser la première boucle while ça marchait, je n'arrive pas a comprendre pourquoi.
    Merci

    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
     
      FILE *fp;
      int c;
      int i;
      int compteur=0,limit=0;
      char s[256];
      char u[256];
      char t[256];
      beginning :
     
      fp = fopen("dic.txt","r");
      while ((fgets(t,sizeof(t),fp)!= NULL)&&(limit<3001)){
            limit++;
      }
      if(limit>3000){
      printf("\nToo many words in the dictionnary ! \n"); 
      printf("Type q to quit or Enter to continue \n");
      char answer = getchar();
              if(answer!='q'){
    		           goto beginning;
    		  }               
      }
      else{
             limit=0;  
             printf("\nEnter your word : \n");
             fgets(s, sizeof s, stdin);
                     while ((fgets(u,sizeof(u),fp)!= NULL)){
                            if((strlen(s))==(strlen(t))){
                                   if(!strcasecmp(s,t)){
                                           printf("mot exact");
                                           break;
                                   }
                                   else{
                                           for ( i = 0; i < strlen(t)-1 ; i++){
                                                   if ( (s[i] != t[i])&&(compteur<2)){
                                                           compteur++;
                                                   }         
                                           }
                                           if(compteur==1){
                                                   printf("\n Proposition %s",t);
                                                   compteur=0;
                                           }
                                           else{
                                                   compteur=0;
                                           }
                                    }
                             }
     
                   }
     
      printf("\n Type q to quit or Enter to continue \n");
      char answer = getchar();
              if(answer!='q'){
                      goto beginning;
              } 
     
      }
      fclose(fp);
      return 0;
    }

  8. #8
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon la boucle me semble correcte par rapport à avant mais par contre, avec tes goto, je suis pas très chaud. Il faut concevoir le programme avant de l'implémenter !

    Le mieux serait de découper le programme en plusieurs fonctions. J'ai pû voir que tu lis toujours sur le flux ouvert, tu ne le fermes pas entre deux boucles, il faut donc le rembobiner jusqu'au début, voir fseek avant de le faire relire par une autre boucle sinon il reste à la fin où à l'endroit où la dernière boucle qui l'a lue s'est arrêtée !

    Par exemple, voici deux fonctions pour déterminer le nombre de mots avec un mot par ligne. La première le détermine d'après un fichier déjà ouvert en lecture, la seconde ouvre et ferme elle même le fichier:

    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
    size_t nb_words (FILE const * p_file)
    {
       size_t size = 0;
       char buf [50];
     
       if (p_file != NULL)
       {
          while (fgets (buf, sizeof (buf), p_file) != NULL)
          {
             size++;
          }
       }
     
       return size;
    }
    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
    size_t nb_words (const char * s_filename)
    {
       size_t size = 0;
       char buf [50];
     
       if (s_filename != NULL)
       {
          FILE * p_file = fopen (s_filename, "r");
     
          if (p_file != NULL)
          {
             while (fgets (buf, sizeof (buf), p_file) != NULL)
             {
                size++;
             }
     
             fclose (p_file);
          }
       }
     
       return size;
    }
    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 !

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Rebonjour,
    j'ai utilisé la fonction fseek pour "rembobiner" la lecture, ais cela ni fait rien.
    Je vous joins mon code actuel juste au cas où je n'ai pas utilisé fseek correctement.

    Merci encore.


    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
     
      FILE *fp;
      int c;
      int i;
      int compteur=0,limit=0;
      char s[256];
      char u[256];
      char t[256];
      beginning :
     
      fp = fopen("dic.txt","r");
      while ((fgets(t,sizeof(t),fp)!= NULL)&&(limit<3001)){
            limit++;
      }
      fseek(fp, 0L, SEEK_SET);
      fclose(fp);
      if(limit>3000){
      printf("\nToo many words in the dictionnary ! \n"); 
      printf("Type q to quit or Enter to continue \n");
      char answer = getchar();
              if(answer!='q'){
    		           goto beginning;
    		  }               
      }
      else{
     
             fp = fopen("dic.txt","r");
     
             limit=0;  
             printf("\nEnter your word : \n");
             fgets(s, sizeof s, stdin);
                     while ((fgets(u,sizeof(u),fp)!= NULL)){
                            if((strlen(s))==(strlen(t))){
                                   if(!strcasecmp(s,t)){
                                           printf("mot exact");
                                           break;
                                   }
                                   else{
                                           for ( i = 0; i < strlen(t)-1 ; i++){
                                                   if ( (s[i] != t[i])&&(compteur<2)){
                                                           compteur++;
                                                   }         
                                           }
                                           if(compteur==1){
                                                   printf("\n Proposition %s",t);
                                                   compteur=0;
                                           }
                                           else{
                                                   compteur=0;
                                           }
                                    }
                             }
     
                   }
     
      printf("\n Type q to quit or Enter to continue \n");
      char answer = getchar();
              if(answer!='q'){
                      goto beginning;
              } 
     
      }
      fclose(fp);
      return 0;
    }

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    C'est bon désolé je me suis corrigé.

    Bonne journée.

  11. #11
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut


    Ton code est horrible, mais vraiment horrible, illisible, utilisation de goto (le pire je crois), indentation execrable, imbrication sur trop de niveau enfin bref.

    En ce qui concerne le fseek ben tu te places au début de ton fichier et juste après tu le fermes, c'est pas très logique.

    Que veux tu faire exactement ?
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  12. #12
    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
    Citation Envoyé par juju03 Voir le message
    Rebonjour,
    j'ai utilisé la fonction fseek pour "rembobiner" la lecture, ais cela ni fait rien.
    Je vous joins mon code actuel juste au cas où je n'ai pas utilisé fseek correctement.
    Tu es obligé de présenter ton code aussi mal ? Que dirais-tu de
    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
     
    include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (int argc, char *argv[])
    {
       FILE *fp;
       int c;
       int i;
       int compteur = 0, limit = 0;
       char s[256];
       char u[256];
       char t[256];
     beginning:
     
       fp = fopen ("dic.txt", "r");
       while ((fgets (t, sizeof (t), fp) != NULL) && (limit < 3001))
       {
          limit++;
       }
       fseek (fp, 0L, SEEK_SET);
       fclose (fp);
       if (limit > 3000)
       {
          printf ("\nToo many words in the dictionnary ! \n");
          printf ("Type q to quit or Enter to continue \n");
          char answer = getchar ();
          if (answer != 'q')
          {
             goto beginning;
          }
       }
       else
       {
          fp = fopen ("dic.txt", "r");
     
          limit = 0;
          printf ("\nEnter your word : \n");
          fgets (s, sizeof s, stdin);
          while ((fgets (u, sizeof (u), fp) != NULL))
          {
             if ((strlen (s)) == (strlen (t)))
             {
                if (!strcasecmp (s, t))
                {
                   printf ("mot exact");
                   break;
                }
                else
                {
                   for (i = 0; i < strlen (t) - 1; i++)
                   {
                      if ((s[i] != t[i]) && (compteur < 2))
                      {
                         compteur++;
                      }
                   }
                   if (compteur == 1)
                   {
                      printf ("\n Proposition %s", t);
                      compteur = 0;
                   }
                   else
                   {
                      compteur = 0;
                   }
                }
             }
     
          }
     
          printf ("\n Type q to quit or Enter to continue \n");
          char answer = getchar ();
          if (answer != 'q')
          {
             goto beginning;
          }
     
       }
       fclose (fp);
       return 0;
    }
    C'est pas de la magie. Il y a des outils pour ça....

    http://emmanuel-delahaye.developpez....tm#indentation

    Sinon, pour ta question initiale, utilises rewind(), c'est fait pour... Et je ne veux pas voir ces goto. Le C dispose de toutes les structures de code répétitives qu'il faut pour éviter ça.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Vérifier la taille d'un fichier avant upload
    Par omar344 dans le forum Flash
    Réponses: 0
    Dernier message: 01/10/2012, 15h04
  2. Vérifier taille d'un fichier avant upload
    Par libuma dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 05/08/2010, 16h08
  3. Réponses: 3
    Dernier message: 26/01/2010, 12h50
  4. Vérifier taille d'un fichier avant upload
    Par Guillaume_Caldera dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/11/2009, 09h32
  5. Controler la taille d'un fichier avant l'envoi
    Par kahya dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/04/2007, 12h45

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