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 :

dénombrer les mots d'un file


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut dénombrer les mots d'un file
    bonjour,

    J'aimerais dénombrer les mots d'un file, tout en étant évitant certaines erreurs qui viendrait fausser le résultat.
    En cherchant sur internet, je suis souvent tombé sur différente variante de la fonction suivante, mais ce qui me dérange c'est que dans le cas de figure où tu as une ligne vide ou la dernière ligne sans '\n', ton résultat est faussé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int WordCounterBIS(FILE *pFile)
    {
    	int numbWord = 0;
    	char readedCharacter = '0';
     
    	while ((readedCharacter = fgetc(pFile)) != EOF)
    	{
    		if (readedCharacter == '\n')
    			numbWord++;
    	}
     
    	return numbWord;
    }
    En cherchant de mon côté, J'ai tenté ma chance avec fscanf et j'obtiens finalement la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int WordCounter(FILE *pFile)
    {
    	int numbWord = 0, attribution = 0;
    	char readedWord[100];
     
    	while ((attribution = fscanf(pFile,"%s", readedWord)) != EOF)
    	{
    		if (attribution == 1)
    			numbWord++;
    	}
     
    	return numbWord;
    }
    Y a-t-il d'autres approches?

    Cordialement,
    Red'

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Salut,

    pourquoi ne pas faire l'inverse ?
    Quand tu vois un caractère, tu commences à lire un mot et incrémentes le compteur de mot, quand tu vois un délimiteur, t'es plus dans un mot.
    En partant de ton premier 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
    int WordCounterBIS(FILE *pFile)
    {
    	int numbWord = 0;
    	int isReadingWord = 0;
    	char readedCharacter = '0';
     
    	while ((readedCharacter = fgetc(pFile)) != EOF)
    	{
    		if (readedCharacter != '\n' && isReadingWord == 0)
    		{
    			++numbWord;
    			isReadingWord = 1;
    		}
    		else if (readedCharacter == '\n')
    			isReadingWord = 0;
    	}
     
    	return numbWord;
    }
    Bon bien sûr là c'est super simpliste, parce que le seul délimiteur c'est le retour à la ligne, ce qui revient à compter les lignes d'un fichier contenant quelquechose et non les mots.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Je ne comprends pas ce que vous cherchez à faire.
    Compter le nombre de ligne ? (ce que fait la première fonction)
    Ou bien compter le nombre de mots dans un fichier texte ?

    Pour les mots il faut se faire un dictionnaire des séparateurs (espace, virgule, point, ect).
    Puis chercher tout séparateur et compter.

    Edit : ah bah voilà ce que c'est de vouloir corriger ses fautes d'orthographe, on se retrouve second.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Extraire les mots d'un bloc de texte est un exercice qui revient très souvent sur le forum. Nous avons déjà donné pas mal de fonctions voire programmes en exemple, tu devrais en retrouver assez facilement.

    En règle générale, ça se résume à quelque chose du style de tant que non EOF faire :
    1. boucler pour lire le mot..
    2. faire un truc quelconque avec le mot
    3. boucler pour avancer jusqu'au prochain mot..

    Et on utilise soit strcspn / strspn, soit les outils de ctype.h pour être un peu moins « locale dependent »..

    Je te conseille de séparer le traitement de son contexte en écrivant une fonction qui opère soit sur une chaîne terminée par NUL (const char *), soit sur un buffer générique (const void *, size_t) sans t'occuper de la source des données. Là tu risques de te mélanger les pinceaux entre les bugs d'entrée-sortie et la logique du traitement que tu essaies de mettre en œuvre.

  5. #5
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    Merci pour vos interventions, c'est intéressant de voir les différentes approches possibles.

    Pour ta remarque Matt, je vais pas te cacher que je ne suis pas rendu aussi loin donc je n''ai pas du tout compris ta remarque sur le traitement. J'ai encore du pain sur la planche

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Redgard Voir le message
    Pour ta remarque Matt, je vais pas te cacher que je ne suis pas rendu aussi loin donc je n''ai pas du tout compris ta remarque sur le traitement.
    Ce qu'il explique, c'est qu'en séparant les choses tu deviens plus modulaire. Par exemple au lieu de compter les mots d'un FILE*, tu devrais juste faire une fonction qui compte les mots d'un char*.
    Ensuite, tu peux appeler cette fonction au choix avec le char* chargé à partir de la lecture d'un FILE*, ou d'autre chose (ex un pipe, un socket, etc etc etc)...

    Citation Envoyé par transgohan Voir le message
    Pour les mots il faut se faire un dictionnaire des séparateurs (espace, virgule, point, ect).

    Edit : ah bah voilà ce que c'est de vouloir corriger ses fautes d'orthographe, on se retrouve second.
    Hé oui, pas de bol. Et en plus tout n'a pas été corrigé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    bah en fait, j'ai un peu peur de trop fractionner mes fonctions.

    Sinon si j'ai bien compris:
    - Vous me conseigner d'utiliser une fonction comptant les mots à partir d'un pointer de caractères (?)
    - et De copier le contenu du FILE* dans un tableau de caractères(?)

    L'intérêt étant d'avoir une fonction plus flexible, moins spécialisé, utilisable dans d'autres circonstances.

  8. #8
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    C'est tout à fait cela.
    Cela permet d'être plus modulaire, plus lisible, plus compréhensible.
    De plus tu pourras plus facilement réutiliser cette fonction sur un autre projet sans besoin de modifications.

    C'est un peu comme si on écrivait des pavés de texte tout alignés à la suite, c'est imbuvable et peu productif.
    Par contre si on espace, qu'on fait des retours à la ligne et qu'on insère des chapitres alors c'est tout autre chose.

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

Discussions similaires

  1. [Collections]Compter les mots différents d'une ArrayList
    Par alanpix dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 21/11/2005, 22h11
  2. cacher les mots de passes...
    Par youp_db dans le forum C
    Réponses: 7
    Dernier message: 21/10/2005, 00h06
  3. Auto-complétion pour les mots clés Begin/End
    Par Alex Laforest dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2005, 21h26
  4. Le dossier qui stock les mots de passe
    Par cartonis dans le forum Sécurité
    Réponses: 21
    Dernier message: 17/08/2005, 12h49
  5. [net] recuperer les proprietes d'un File via une URL
    Par mma dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 06/05/2004, 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