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 :

lire un fichier , extraire des paire de mots


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut lire un fichier , extraire des paire de mots
    Bonjour,
    je suis debutante et je sais pas commment faire pour lire un fichier texte (gros de taille de 2go) en faisant l'"extraction des paire de mots voisins.
    par exemple : bonjour les amis
    les liste mots :
    bonjour les
    les amis.
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Fais abstraction de la taille de ton fichier, dans un premier temps. Jusqu'à 2 Go, ce sera transparent. Après, ça dépendra du système que tu utilises et de sa configuration.

    Citation Envoyé par cyrine Voir le message
    par exemple : bonjour les amis
    les liste mots :
    bonjour les
    les amis.
    C'est pas très clair. En admettant que j'aie { 1,2,3,4 }, cherches-tu à obtenir :
    ou

    ?

    Bon, ce qu'il faut faire, dans l'ordre, c'est :

    - ouvrir ton fichier (ou exploiter stdin) ;
    - lire les caractères un par un (fgetc()) ;
    - décider si le caractère lu fait partie des caractères formant un mot (lettres, chiffres, ...) ou si c'est un séparateur (espace, ponctuation, ...) ;
    - engranger le caractère dans un buffer s'il fait partie d'un mot ;
    - dès que l'on rencontre le premier terminateur, c'est que le mot emmagasiné est terminé : il n'y a plus qu'à l'afficher ;
    - on remet le buffer à zéro et on avance tant que l'on rencontre des terminateurs. Puis on recommence.

    Cette procédure permet d'extraire les mots un par un. Si tu veux faire des paires comme dans mon deuxième exemple, il te faut deux buffers, que tu utiliseras en alternance. Comme ça, tu pourras toujours afficher le mot que tu viens de lire, précédé par celui que tu as traité juste avant.

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Obsidian, le cas que je traite, c'est le 2eme et c'est le cas que vous n'avez pas bien expliqué
    enfin moi je vais parcourir le fichier texte et mettre tous les mots voisins dans un hash table.
    vous pouvez m'aidez plus svp, je suis debutante .
    merci infiniment
    Le jour est le père du labeur et la nuit est la mère des pensées.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Salut a tout

    Même la 2eme il faut suivre presque les mêmes etapes que Obsidian t'as donné. Mais au lieu d'utiliser fgetc pour lire letre par letre je propose d'utiliser fscanf avec %s pour lire toute la chaine.
    Bon le principe est claire, la premiere chose qu'il faut faire est lire le premier mots, il l'affiche. Puis faut mettre une boucle infini jusqu'á la fin du fichier qui affiche le mots + \n + le même mots + une espace je pense que ca est bizare n'est ce pas mais le programe oblige de faire ca.

    bah c'est pour demain je pense . en tout cas voila 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>
     
    int main()
    {
       /* Déclarations : */
      /* Nom du fichier et pointeur de référence */
      char nom_fich[] = "text.txt"; 
      FILE *fichier;
     
      char chaine[50];
     
      /* Ouverture du nouveau fichier en écriture */
      fichier = fopen(nom_fich, "r");
       if (!fichier)
         {  
          printf("\aERREUR: Impossible d'ouvrir "
                 "le fichier: %s.\n", nom_fich);
          exit(-1);
         }
     
      int i=0;
      while (!feof(fichier))
        {
         fscanf(fichier, "%s\n", chaine);
            if(i == 0)
                 printf("%s ",chaine);
            else 
                 printf("%s\n%s ",chaine,chaine);
         i = 0 ;
         i++;
        }
     
       /* Fermeture du fichier */
      fclose(fichier);
     
      system("PAUSE");	
      return 0; 
    }
    N'oublier pas de mettre le fichier txt dans le même repertoire.

    Bon courage
    Simo

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut DarkUD
    J'ai deux solutions à te proposer. Le schema de travail est le même :

    - comptage des mots
    - enregistrement des mots dans un tableau
    - réutilisation et positionnement des mots en paires

    1) Iostream

    iostream est une bibliothèque portée sur les flux et que je te conseille d'apprendre à utiliser car elle est plus pratique qu'elle en a l'air au prime abord. mais bon ça suffit pour la pub.

    iostream fonctionne donc avec les flux et te permet d'interpréter plus facilement une chaine de caractères ou une phrase si tu préfères. 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <conio.h>
    #include <stdlib.h>
     
    using namespace std; //permet de ne pas générer l'erreur std::'fonction iostream'
     
    int main() 
    {
        system("color 0A");
     
        ifstream fichier_test("test.txt"); //creation d'une entité ifstream fichier ( c'est un peu comme FILE )
                                           //et faire un lien vers le fichier texte.
        string mot; 
     
        int i=0;
     
        //Part 1
     
        while(fichier_test >> mot) //l'opérateur >> permet de dire qu'on lit le fichier mot par mot
        {
                      i++;         //ici on vérifie le nombre de mots dans le fichier
        }
     
        string phrase[i];                 
        int nb_mots = i;
     
        fichier_test.close();
     
        ifstream fichier_lu("test.txt");
     
        i=0;
        //Part 2
        while(fichier_lu >> mot)         
        {
                  phrase[i] = mot;//cout affiche le contenu de mot et renvoie à la ligne
                  i++;
        }
     
        int j = 1;
        //Part 3
        for(i=0;i<=nb_mots-2;i++) //on affiche les paires
        {
                           cout << "Paire " << j << ": " << phrase[i] << "  " << phrase[i+1] << "\n";
                           j++;
        }
     
        cout << "\n\nDarkUD Coder Soul 2008(co)" << "\n---------------------------------";
        getch();                      //met pause au programme pour qu'on voie les résultats
        system("color 0F");
    }
    2)stdio.h

    Même processus :

    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
    #include <stdio.h>
    #include <string>
    #include <conio.h>
    #include <stdlib.h>
     
    using namespace std;
     
    FILE *fichier;
     
    int main()
    {
        fichier = fopen("test.txt","r");
     
        char mot[50];
     
        int i = 0;
        //Part 1
        while(!feof(fichier))
        {
                             i++;
                             fscanf(fichier,"%s\n",&mot);
     
        }
     
        int nb_mots = i;
     
        char phrase[i][50];
     
        fclose(fichier);
     
     
        fichier = fopen("test.txt","r");
        i = 0;
    //Part 2
        while(!feof(fichier))
        {
                             fscanf(fichier,"%s\n",&phrase[i]);
                             i++;
        }
     
        int j=1;
     
    //Part 3
        for(i=0;i<=nb_mots-2;i++)
        {
                               printf("Paire %d : %s %s \n",j,phrase[i],phrase[i+1]);
                               j++;
        }
     
        printf("\n\nDarkUD Coder Soul 2008(co)\n-------------------------------");
     
        getch();
        return 0;    
    }

    Bonne chance !

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    @DarkUD : les sources proposés sont du C++

    Le 1er est du full C++.

    le 2eme aussi mais débarrassé du "using namespace" pourrait passer en C... C99 et pas en C90 car le C90 ne supporte pas la déclaration de variable en milieu de bloc...

    Rmq : Que vient faire conio.h dans l'histoire ? C'est un header spécifique non standard et donc non portable qui n'a rien a faire la puisque aucune de ses fonctions n'est utilisée dans ton code...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    enfin moi je vais parcourir le fichier texte et mettre tous les mots voisins dans un hash table.
    Oui, mais ces mots, pour pouvoir les classer dans une hash table, il va bien falloir les extraire d'abord, n'est-ce pas ?

    Ensuite, en quoi est-ce relatif au problème que tu exposes (paires de mots) ?

  8. #8
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    bonsoir
    voilà jai fait une fonction qui extrait les 2mots voisinS:
    voila : j'ai du texte ::
    bonjour les amis .
    bonsoir ma famille .
    voila le resultat :
    bonjour les
    les amis
    amis bonsoir
    bonsoir ma
    ma famille

    or c'est faux
    j'aime extraire les mots voisin qui ont sur le meme ligne c'est à dire voila le resultat attendu :
    bonjour les
    les amis
    bonsoir ma
    ma famille
    voila la fonction d'extraction :
    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
    char* get_word(FILE *fdesc, char *buff, size_t size)
    {
    	char *ret=NULL;
     
    	if( fdesc!=NULL && buff!=NULL && size>0 )
    	{
    		int c;
    		int i=0;
    		while( ret==NULL && i<size && (c=fgetc(fdesc))!=EOF )
    		{
    			if( isalpha(c) )
    			{
    				buff[i]=c;
    				i++;
    			}
    			else if( i>0 )
    			{	/* mot */
    				buff[i]='\0';
    				ret=buff;
    			}
    		}
    	}
    	return ret;
    }
    j'attends vos reponses
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  9. #9
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    reponse

    bon aller ma vanne est pas drole, mais bon n oublie pas qu on est pas la pour faire ton boulot.

    meme si je te donne une ebauche de la solution

    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
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
     
    #define NOM_FIC "D:\\projet_C\\windows\\codeblocs\\test\\brel.txt"
     
    #define NON 0
    #define OUI 1
    #define FIN -1
     
    int get_word(FILE *fdesc, char *buff, size_t size);
     
    int main( void )
    {
        FILE* fic = fopen( NOM_FIC, "r" );
        char* buff = malloc( 512 );
        int is_last_word = NON;
     
        *buff = 0;
     
        while( ( is_last_word = get_word( fic, buff, 511 ) ) != FIN )
        {
            if( is_last_word == NON )
                fprintf( stderr, "|%s|\n", buff );
     
            *buff = 0;
        }
     
        fclose( fic );
     
        return EXIT_SUCCESS;
    }
     
    int get_word(FILE *fdesc, char *buff, size_t size)
    {
    	int ret = FIN;
     
    	if( fdesc!=NULL && buff!=NULL && size>0 )
    	{
    		int c;
    		int i=0;
    		while( i<size && (c=fgetc(fdesc))!=EOF )
    		{
    		    if( c == '\n' )
    		    {
    		        buff[i]='\0';
                    ret = OUI;
                    i = size; /* condition d arret */
    		    }
    		    else
    		    {
                    ret = NON;
                    if( isalpha(c) )
                    {
                        buff[i]=c;
                        i++;
                    }
                    else if( i>0 )
                    {	/* mot */
                        buff[i]='\0';
                        i = size; /* condition d arret */
                    }
    		    }
    		}
    	}
    	return ret;
    }
    "vaste programme"

  10. #10
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    merci BainE.
    je vous demande que vous faites mon boulot, mais une idée
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par cyrine Voir le message
    merci BainE.
    je vous demande que vous faites mon boulot, mais une idée
    merci
    Tu as pratiquement résolu ton problème toute seule. Je ne vois pas ce qui t'ennuie. Tu as une fonction get_word() qui essaie de lire un mot et, le cas échéant, le dépose dans le tampon que tu lui as indiqué.

    Si tu veux réinitialiser le processus à chaque nouvelle ligne, il te suffit d'effacer le tampon du « mot précédent » chaque fois que tu rencontres un retour à la ligne. Ensuite à l'affichage, tu écris le mot que tu viens de lire, précédé du mot lu juste avant bien sûr, mais uniquement si le tampon concerné est non-vide.

  12. #12
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    bonjour
    oula , mon encadreur ma dit de modifier la fonction à la derniere "minute";
    ben au lieu d'extraire les paires de mots successifs, on extrait les mots qui sont séparés par 2 mots, exemple on a : a b c d e f g h telque a,b,c,d , e,f,g,h sont des mots on extrait a d g
    quelqu'un peut m'aider svp?
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Si on reprends ta liste de 'phrases' (liste de mots) Tu as
    Phrase 1: a b c d
    Phrase 2: e f g h
    Tu veux extraire:
    a d g.
    Il y a-t-il une contrainte entre d et e ou d et g comme dans ton post ? g doit-il être compris comme le troisième élément ou l'avant dernier?
    Car à ce moment, tu dois :
    1/ Rajouter une fonction pour obtenir le nième mot ou l'avant-nième mot
    2/ Modifier ta condition (if(strncmp(first, last,C_TAILLE_MOT)==0))
    3/ Modifier la section d'ajout (le code {} du if) pour ajouter les trois éléments.

  14. #14
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Bonjour à tous,
    voila mon encadreur ma donné des pistes pour extraire les mots voisin de la 1ere ligne du fichier texte, il ma dit de ne pas changer le protoype de la fonction, mais de la modifier de telle facon elle extrait tous les mots voisin de tout le fichier texte.
    exemple:
    voila un exemple de texte
    bonjour les amis
    bonjour les amis du monde
    voila les resultats attendus:
    bonjour les
    les amis
    bonjour les
    les mais
    amis du
    du monde
    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
    char* get_word(FILE *fdesc, char *buff, size_t size)
    {
        assert(fdesc!=NULL);
        assert(buff!=NULL);
        assert(size>0);
     
        char c;
        size_t i=0;
     
        memset(buff, 0, size);
     
        while ((i<size-1) && ((c=fgetc(fdesc))!=EOF) && !issep(c))
        {
            buff[i++] = c;
        }
        buff[i] = '\0';
     
        printf("%s\n", buff);
     
        //while(((c=fgetc(fdesc))!=EOF) && (issep(c)));
        //fseek(fdesc, -1L, SEEK_CUR);
     
        return *buff?buff:NULL;
    }
    une idée svp
    merci
    cordialement
    Le jour est le père du labeur et la nuit est la mère des pensées.

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Reformule l'exigence sur le motif à identifier entre les deux chaînes et le résultat attendu. Outre que je n'ai pas compris ton exemple, ça te permettra de dégager un algo.

Discussions similaires

  1. Lire un fichier, extraire les infos
    Par JokerAs dans le forum C
    Réponses: 15
    Dernier message: 26/09/2014, 21h58
  2. lire un fichier texte et extraire des données
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/05/2009, 13h40
  3. Lire un fichier à partir des sources Includes
    Par Marley_T dans le forum C
    Réponses: 1
    Dernier message: 09/07/2008, 01h13
  4. Comment lire un fichier et extraire des données
    Par salut93 dans le forum MATLAB
    Réponses: 14
    Dernier message: 12/06/2007, 11h27
  5. lire fichier csv et en extraire des infos
    Par isaglada dans le forum VBScript
    Réponses: 2
    Dernier message: 12/02/2007, 13h04

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