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 :

Piocher un mot au hasard dans un fichier


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut Piocher un mot au hasard dans un fichier
    Bonjour,

    L'objectif est de chercher un mot au hasard dans un fichier texte.

    La fonction fgets me semble tout indiqué pour faire ce genre de chose.

    J'ai un warning dans ma fonction et je sais pourquoi, seulement, je souhaite à tout pris que ma fonction chercher ne renvoie rien.

    J'aime pas les warnings, même si j'entends par ci par là que lors de grand projet c'est presque inévitable.

    Bref voici mon code, si amélioration, préférence de fonction (en étant explicite du pourquoi) ou autre, bien évidemment, je suis ouvert à toutes suggestions.

    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
    void chercher(char *mot, FILE *file, int n_line)
    {
        int counter = 0;
        if (file == NULL)
        {
            puts("Erreur de lecture");
            exit(1);
        }
        while (counter != n_line)
        {
            fgets(mot, MAX_CHAR, file);
            if(mot == NULL)
            {
                puts("Ligne non trouvée");
                exit(1);
            }
            counter++;
        }
    }
    Voilà une initialisation exemple

    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
    int main(void)
    {
        int aleatoire;
        char fichier[] = "/home/fred1599/Desktop/test.txt";
        char word[MAX_CHAR];
        FILE *fic;
        srand ( time(NULL) );
     
        fic = fopen(fichier, "r");
     
        n_alea(MAX, &aleatoire);
     
        chercher(word, fic, aleatoire);
     
        printf("%d\n", aleatoire);
     
        printf("%s\n", word);
     
        return 0;
    }
    EDIT : J'ai oublié de mettre le warning

    /home/fred1599/Desktop/test.c|26|warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result [-Wunused-result]|
    EDIT 2 : Rajout de srand

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    Je ne comprends pas très bien. Tu veux prendre un mot quelconque dans un fichier ou bien chercher un mot parmi une liste de mots pré-définis?

    Si c'est la première proposition alors je commencerai par compter le nombre de mots existants dans le fichier (avec redondance ou pas). Ce nombre servira pour extraire un nombre aléatoire compris entre [1, NOMBRE]. Une fois récupérer ce nombre te servira à extraire le dit mot.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Tu veux prendre un mot quelconque dans un fichier
    Oui c'est tout à fait ça

    Si c'est la première proposition alors je commencerai par compter le nombre de mots existants dans le fichier (avec redondance ou pas)
    Je suis tout à fait d'accord avec toi, et c'est prévu de le faire, mais mon soucis et plutôt mon warning que je souhaiterais voir disparaître...

    Voici mon code actuel

    test.c

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
    #include "test.h"
     
    #define MAX_CHAR 100
     
    void n_alea(int maxi, int *n)
    {
        *n = rand() % maxi + 1;
    }
     
    int calculer(FILE *file)
    {
        int counter = 0;
        char *line = malloc(MAX_CHAR * sizeof(char));
        while(fgets(line, MAX_CHAR, file)) ++counter;
        free(line);
        return counter;
    }
     
    void chercher(char *mot, FILE *file, int n_line)
    {
        int counter = 0;
        if (file == NULL)
        {
            puts("Erreur de lecture");
            exit(1);
        }
        while (counter != n_line)
        {
            fgets(mot, MAX_CHAR, file);
            if(mot == NULL)
            {
                puts("Ligne non trouvée");
                exit(1);
            }
            counter++;
        }
    }
     
    int main(void)
    {
        int aleatoire, MAX;
        char fichier[] = "/home/fred1599/Desktop/test.txt";
        char word[MAX_CHAR];
        FILE *fic;
        srand ( time(NULL) );
     
        fic = fopen(fichier, "r");
        MAX = calculer(fic); /* Nombre de lignes du fichier de mots */
     
        n_alea(MAX, &aleatoire); /* Générer un nombre aléatoire entre 1 et le nombre de lignes du fichier */
     
        chercher(word, fic, aleatoire); /* Cherche un mot dans le fichier */
     
        printf("%s\n", word); /* Affichage du mot */
     
        return 0;
    }
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    void n_alea(int maxi, int *n);
    void chercher(char *mot, FILE *file, int n_line);
    int calculer(FILE *file);
     
    #endif
    EDIT : Ajout du code

  4. #4
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut définition du problème
    Je pense comme gerald3d, ou alors ce que tu dis de ton problème est à la fois incomplet (tu connais d'avance la taille du texte en mots ou en lignes) et erronné (ce qui est aléatoire c'est la ligne où tu pioches, pas le mot).

    Sinon, en ce qui concerne le warning et la valeur de retour de fgets:
    On success a pointer to the string is returned. On error a null pointer is returned. If the end-of-file occurs before any characters have been read, the string remains unchanged.
    Ca veut dire que tu ne peux pas ignorer "sainement" la valeur de retour car elle peut indiquer un échec de lecture. Tu dois non seulement la lire, mais la vérifier.
    Enfin, si tu pouvais savoir à coup sûr qu'il ne peut pas y avoir d'échec, pour faire taire le warning rien de plus simple je crois qu'utiliser fgets comme il est prévu malgré tout, c'est_à-dire en réaffectant le résultat dans ta chaîne (sans la contrôler). Ca n'a pas de rapport direct avec le retour de ta fonction, d'ailleurs.

    Denis

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    @denispir,

    Merci de ta réponse

    ce qui est aléatoire c'est la ligne où tu pioches, pas le mot
    Dans mon cas c'est la même chose, c'est un fichier texte du style

    bonjour
    hello
    tchao
    bye
    astalavista
    Ca veut dire que tu ne peux pas ignorer "sainement" la valeur de retour car elle peut indiquer un échec de lecture
    Il me semble l'avoir pris en compte, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(mot == NULL)
    {
        puts("Ligne non trouvée");
        exit(1);
    }
    Enfin, si tu pouvais savoir à coup sûr qu'il ne peut pas y avoir d'échec, pour faire taire le warning rien de plus simple je crois qu'utiliser fgets comme il est prévu malgré tout, c'est_à-dire en réaffectant le résultat dans ta chaîne (sans la contrôler)
    Ok je pense avoir compris, en tout cas, j'ai pu de warning, merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot = fgets(mot, MAX_CHAR, file);

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Du coup j'ai remodifié mon code car certaine chose buggée, comme le fait que mon curseur se trouvait en fin de ligne, j'ai dû placer un fseek (j'ai cherché pendant au moins 1 heure )

    test.c

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
    #include "test.h"
     
    #define MAX_CHAR 100
     
    void n_alea(int maxi, int *n)
    {
        *n = rand() % maxi + 1;
    }
     
    int calculer(FILE *file)
    {
        int counter = 0;
        char *line = malloc(MAX_CHAR * sizeof(char));
        while(fgets(line, MAX_CHAR, file))
        {
            counter++;
        }
        free(line);
        return counter;
    }
     
    char *chercher(FILE *file, int n_line)
    {
        int counter=0;
        char *mot = malloc(MAX_CHAR * sizeof(char));
        fseek(file, 0, SEEK_SET);
        for(; counter < n_line; counter++)
        {
            mot = fgets(mot, MAX_CHAR, file);
        }
        return mot;
    }
     
    int main(void)
    {
        int aleatoire, MAX;
        char fichier[] = "/home/fred1599/Desktop/test.txt";
        char *word = malloc(MAX_CHAR * sizeof(char));
        FILE *fic;
        srand ( time(NULL) );
     
        fic = fopen(fichier, "r");
        MAX = calculer(fic); /* Nombre de lignes du fichier de mots */
     
        n_alea(MAX, &aleatoire); /* Générer un nombre aléatoire entre 1 et le nombre de lignes du fichier */
     
        word = chercher(fic, aleatoire); /* Cherche un mot dans le fichier */
     
        printf("%s\n", word); /* Affichage du mot */
     
        fclose(fic);
        free(word);
     
        return 0;
    }
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    void n_alea(int maxi, int *n);
    char *chercher(FILE *file, int n_line);
    int calculer(FILE *file);
     
    #endif
    Merci pour vos réponses, je peux continuer mon projet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2017, 08h26
  2. Expiration Mot de passe dans un fichier .htaccess
    Par gege87270 dans le forum Apache
    Réponses: 1
    Dernier message: 17/01/2008, 15h08
  3. sécuriser un mot de passe dans un fichier de config
    Par vegas dans le forum Sécurité
    Réponses: 5
    Dernier message: 26/10/2007, 09h31
  4. Lire une enregistrement au hasard dans un fichier
    Par bonjour69 dans le forum Langage
    Réponses: 27
    Dernier message: 26/09/2006, 18h54
  5. apache su mot de passe dans un fichier
    Par jean-jacques varvenne dans le forum Apache
    Réponses: 4
    Dernier message: 31/01/2005, 20h07

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