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
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
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 espaceje 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
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; }
Partager