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 :

Récupérer une ligne aléatoire avec fgets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut Récupérer une ligne aléatoire avec fgets
    Bonjour,

    Je souhaite récupérer une ligne dans un fichier avec fgets, mais une ligne aléatoire. Par exemple mon fichier sujets.txt contient cela :

    Citation Envoyé par sujets.txt
    Un chien
    Cet arbre
    Une fleur
    Je désire obtenir aléatoirement dans une chaine de caractères "Un chien", "Cet arbre" ou bien "Une fleur". Je me doute qu'il faut déplacer le pointeur mais je ne sais pas comment écrire "Déplacer le pointeur au 4 ième \n" par exemple.

    Merci

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Il faut d'abord bufferiser le fichier dans un tableau de pointeur vers des chaines de caractères du type "char* t[]" de taille le nombre de ligne du fichier; puis choisir une ligne du tableau au hasard.

  3. #3
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut
    Edit : Emmanuel Delahaye, je regarde ça ^^
    Oui ça semble une bonne solution mais j'ai des problèmes. D'abord, je crois que mon nombre aléatoire n'est pas généré correctement (j'en génère un de 0 à 3) et ça fait 3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1 etc. Je tiens à préciser qu'il s'agit d'un script qui tourne en boucle, mais que je récupère le contenu du fichiers en-dehors de la boucle.

    Pour le nombre aléatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    srand(time(NULL));
    random = (rand() % (3 - 1 + 1)) + 1;
    Ensuite, pour la lecture du fichier comme tu me l'as suggéré, j'ai tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *fichier = NULL;
    fichier = fopen("sujets.txt", "a+");
    char *chaine[100] = {NULL};
    for (i = 0; i <= 200; i++)
    {
           fgets(chaine[i], 100, fichier);
    }
    Et là normalement chaque case du tableau devrait contenir une ligne non? Parce que ce n'est pas du tout le cas, le tableau apparaît vide.

  4. #4
    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 Alexbad
    Oui ça semble une bonne solution mais j'ai des problèmes. D'abord, je crois que mon nombre aléatoire n'est pas généré correctement (j'en génère un de 0 à 3) et ça fait 3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1 etc. Je tiens à préciser qu'il s'agit d'un script qui tourne en boucle, mais que je récupère le contenu du fichiers en-dehors de la boucle.

    Pour le nombre aléatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    srand(time(NULL));
    random = (rand() % (3 - 1 + 1)) + 1;
    srand() doit être appelé une seule fois au début du programme (donc hors de toute boucle).
    Ensuite, pour la lecture du fichier comme tu me l'as suggéré, j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FILE *fichier = NULL;
    fichier = fopen("sujets.txt", "a+");
    Une lecture, c'est "r", c'est pas "a+".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *chaine[100] = {NULL};
    for (i = 0; i <= 200; i++)
    {
           fgets(chaine[i], 100, fichier);
    }
    Je ne t'ai jamais parlé de tableau de pointeurs. C'est inutile et il manque de la mémoire (un pointeur non initialisé pointe n'importe où, le comportement est indéterminé).

    Par contre, il faut passer à fgets() l'adresse du premier élément d'un tableau de char de taille suffisante.

    Enfin, il faut tester le retour de fgets() pour savoir si on une fin de lecture s'est produite.

    Si tu ne connais pas une fonction, il faut lire son mode d'emploi avant de l'utiliser, sinon, tu cours à la catastrophe...

    http://man.developpez.com/

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nombre_de_ligne=0;
    char buffer[256]={};
    while(fgets(buffer,sizeof(buffer),fichier)){nombre_de_ligne++;}
    devrait aller pour déterminer le nombre de ligne dans le fichier.

  6. #6
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut
    Ok et après, pour lire la ligne concernée je fais quelque chose du genre? (me corriger si je fais des erreurs de syntaxe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    rewind(fichier);
    int i = 0;
    for (i = 0; i < nombre_de_lignes; i++)
    {
         fgets(chaine, 100, fichier);
         if (i == random)
         {
              //J'affiche la ligne
         }
    }
    EDIT: je sais pas pourquoi, mais il refuse de piger dans plus que les 5 premières lignes :s .

  7. #7
    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 Alexbad
    Je souhaite récupérer une ligne dans un fichier avec fgets, mais une ligne aléatoire.
    Tu peux compter les lignes (fgetc()), tirer une ligne au hasard, revenir au début (rewind()) et lire la ligne concernée (en comptant les fgets()).

Discussions similaires

  1. [MySQL] Récupérer une ligne aléatoire dans MySQL
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/01/2012, 16h39
  2. Récupérer une ligne aléatoirement
    Par Cyanatide dans le forum Requêtes
    Réponses: 6
    Dernier message: 29/11/2011, 10h28
  3. [HTML] comment récupérer une ligne d'un tableau avec HTML?
    Par jaafarerraji dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/10/2007, 00h21
  4. [VBA-E]selectionner une ligne repérée avec activecell
    Par titou007 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/03/2006, 15h24
  5. comment obtenir une ligne aléatoirement
    Par titoumimi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2005, 15h52

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