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
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.
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.
C'est pas très clair. En admettant que j'aie { 1,2,3,4 }, cherches-tu à obtenir :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 1,2 3,4
?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 1,2 2,3 3,4
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.
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.
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 :
N'oublier pas de mettre le fichier txt dans le même repertoire.
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; }
Bon courage
Simo
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:
2)stdio.h
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"); }
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 !
@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
Oui, mais ces mots, pour pouvoir les classer dans une hash table, il va bien falloir les extraire d'abord, n'est-ce pas ?enfin moi je vais parcourir le fichier texte et mettre tous les mots voisins dans un hash table.
Ensuite, en quoi est-ce relatif au problème que tu exposes (paires de mots) ?
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 :
j'attends vos reponses
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; }
merci
Le jour est le père du labeur et la nuit est la mère des pensées.
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"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 . . .
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.
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.
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.
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.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
une idée svp
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; }
merci
cordialement
Le jour est le père du labeur et la nuit est la mère des pensées.
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.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager