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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 482
    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
    Membre éclairé 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
    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

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    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
    Invité de passage
    Inscrit en
    Avril 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 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 : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 482
    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
    Membre éclairé 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
    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

  9. #9
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    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;
    }

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