Lecture d'un fichier et probleme divers

Résolu
Lacharlottinne Messages postés 5 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 15 mai 2005 - 14 mai 2005 à 21:24
Lacharlottinne Messages postés 5 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 15 mai 2005 - 15 mai 2005 à 15:14
Bonjour , je vous explique vite fait ce que je dois faire :



J'ai un fichier texte, dans le quel on doit trier des mots ..

la premier étape est => ouverture d'un fichier

la deuxieme étape est => lit mot par mot et rentre le dans un tableau

si il est present ajoute à la frequence plus 1

sinon ajoute le au tableau



Il y a une erreur mais je ne la trouve pas



Voici le code source



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <ctype.h>



/*

-------------------------------------Declaration--------------------------------

*/





int trouve;

int N,i;

char word[256]; // word est le mot lu

struct mot_frequence

{

char mot[180000];

int frequence;

};

struct mot_frequence tableau[10000];

FILE *f1;







/*

----------------------Commande l'ouverture d'un fichier-------------------------

*/

void ouverture (FILE *f)

{

char fichier[32];

FILE *f1=NULL;



while (f==NULL)

{

printf ("Entrer le chemin du fichier\n");

scanf ("%s",fichier);

f=fopen(fichier,"r");

if (f==NULL)

{

printf ("/!\ Erreur: Probleme d'ouverture en lecture /!\ ");

}

else

{

printf ("Ouverture reussite !! \n ");

printf ("\n");

}

}

}



/*

---------- Renvoie la position du dernier octets du flot stream-----------------

*/

long filesize(FILE *stream)

{

long curpos,length;



curpos =
ftell(stream);
// garder la position courante

fseek(stream, 0, SEEK_END);
// on place le curseur a la fin

length = ftell(stream);
// on prend le
nombre de caractères dans la fichier (ie la taille)

fseek (stream, curpos, SEEK_SET); // on remet comme c'était au début



return length;

// on retourne la taille du fichier (en octet ie en
nombre de char)

}





/*

-----------------------------Detecte la ponctuation-----------------------------

*/



int estseparateur(char c)

{

char sep[]=".,;:!?\n\t\r\'"\[]\0";

char *sz;



sz=sep;

while(*sz!=0)

{

if(c==*sz) return
1; // c est un caractere
séparateur, on renvoie donc true

sz++;

}



return 0;

// c n'est pas un caractère séparateur, on renvoie
donc false

}



/*

----------Converti Majuscule => Minscule + retire la ponctuation----------------

*/



void convert(char tab [])

{



char *sz;

sz=tab;

while(*sz != 0)

{

if(('A' <=
*sz)&&(*sz<='Z')) // si le pointeur fait parti des
majuscules compris entre A et Z alors remplace le par une minusule

*sz = 'a' + (*sz - 'A');



if(estseparateur(*sz)==1) *sz='
'; //si le caractere est un separateur remplace le par un espace



sz++;

}

}

/*

------------------------------Comptage des mots---------------------------------

*/

void comptage(FILE *f)

{

int i=0;

int N=0; // N étant le nombre de mot

char word[32];

for(i=0,N=0; !feof(f); i++)

{

fscanf(f, "%s", word);

//printf("word=%s\n",word); pour verifier si il affiche bien les mots

N++;

}

}







/*

-------------------------------Programme principale-----------------------------

*/



int main()

{

trouve == 1;

ouverture(f1);

//comptage(f1); <= fonctionne pas







/**

*** EXTRACTION

**/



for(i=0;feof(f1);i++)

{



fscanf(f1, "%s", word); // prend un mot et met le dans le tableau word

convert(word); // enleve les majuscules et la ponctuation



if ( strcmp ((char *)
word,tableau[i].mot) ) // Regarde si le mot est pas déjà dans le tableau

{


trouve = 1; // si oui


tableau[i].frequence++; // augmente sa frequence de + 1

}



else

{

strcpy (word,tableau[i].mot); // sinon ajoute le au tableau

tableau[i].frequence++; // et augment sa frequence

}



printf ("%s : %d",tableau[i].mot,tableau[i].frequence); // affiche le resultat

}





return 0;

system("pause");

}



Voici mon mail : lacharlottinne@aol.com

et mon adresse msn : lacharlottinne@hotmail.com ( si vous preferez passer par la pour m'aider :)



Je vous remercie beaucoup :)

7 réponses

cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
15 mai 2005 à 15:11
Bonjour,



Dans la liste de tes séparateurs n'aurais tu pas oublié l'espace ???

Sinon, ton fichier à "parser" est il gros ? Car la taille de ton tableau est très grande. (256 + 4 + 4) * 1000000 octets...

Pourquoi tu ne charges pas directement (en fonction de la taille bien
sur) ton fichier en mémoire et tu peux ainsi travaille avec, par
exemple, strtok pour récuperer tes mots.

Matt...
3
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
14 mai 2005 à 21:50
j'ai pas regarder ton code en détail mais ton struct "mot_frequence" tu
veut que "tableau" soit un tableau de chaine de caractère ?



car si c'est le cas ton "tableau" est un tableau 1 seul caratère. si tu veut avoir une chaine tu dois le déclaré comme ça :



char* tableau[180000];



et attention aux allocations mémoire.

Voili,Voilou
0
Lacharlottinne Messages postés 5 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 15 mai 2005
14 mai 2005 à 21:56
bah je v faire un tableau de structure



je sais pas cmt ca marche la déclaration de tableau de structure
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
14 mai 2005 à 22:07
non c'est pas ça que je dis, tu dois faire un tableau de chaine de caractère donc avec :



char* tableau[180000];



ou "tableau" est un tableau de pointeur "pointant" sur un word.

Voili,Voilou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
14 mai 2005 à 22:36
Bonsoir,



Tu n'y vas pas par le dos de la cueillere pour tes
tableaux 180000 x 10000 car un mot de 180000 caracteres balaize,
Admettons.



As tu compilé ton code, car chez moi, il ne compile pas, poste un code qui compile...



Matt...
0
Lacharlottinne Messages postés 5 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 15 mai 2005
15 mai 2005 à 11:22
voici un code qui compile je ne comprends pas pk , il m'affiche pas le bon nombre de mot dans un texte et pourquoi il ne les distingues pas bien

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define N 1000000
/*
-------------------------------------Declaration--------------------------------
*/


FILE *f;
int size;
char sep[15]=".,;:!?\n\t\r\'"\[]\0";



struct mot_frequence
{
char mot[256];
int frequence;
int taille;

};
struct mot_frequence tableau[N];


int nb_mots=0;
FILE *f1=NULL;


/*
----------------------Commande l'ouverture d'un fichier-------------------------
*/
void ouverture ()
{
char fichier[32];


while (f==NULL)
{
printf ("Entrer le chemin du fichier\n");
scanf ("%s",fichier);
f=fopen(fichier,"r");
if (f==NULL)
{
printf ("/!\\ Erreur: Probleme d'ouverture en lecture /!\\ \n");
}
else
{
printf ("Ouverture reussite !! \n ");
printf ("\n");
}
}
}


/*
---------- Renvoie la position du dernier octets du flot stream-----------------
*/
long filesize(FILE *stream)
{
long curpos,length;


curpos = ftell(stream); // garder la position courante
fseek(stream, 0, SEEK_END); // on place le curseur a la fin
length = ftell(stream); // on prend le nombre de caractères dans la fichier (ie la taille)
fseek (stream, curpos, SEEK_SET); // on remet comme c'était au début

return length; // on retourne la taille du fichier (en octet ie en nombre de char)
}



/*
------------------------Detecte un caratere dans un tableau---------------------
*/


int SearchCara (char c,char tab[],int i)
{
if (tab[i]=='\0')
{
return 0; // à cet endroit tu es à la fin du fichier
}
else
{
if (tab[i] == c)
{
return 1; // à cet endroit tu as trouvé un caractere
}
else
{
return SearchCara (c, tab, i+1); // Sinon continue
}
}
}



/*
----------Converti Majuscule => Minscule + retire la ponctuation----------------
*/


void convert(char c[])
{
int i;
for(i=0; i<strlen(c); i++)
{
c[i]=tolower(c[i]); // passe les caractères en minuscules
}
}



/*
---------------------------------Extraction-------------------------------------
*/


void extraction ()
{
char motlu[256];
char c;
int trouve;
int i=0,k=0;
while (!feof(f))
{
fscanf (f, "%c", &c);
while ((SearchCara(c, sep, 0)) && (!feof(f)) )
{
fscanf(f,"%c", &c) ;
}
i=0 ;
while ((!SearchCara(c, sep, 0)) && (!feof(f))) // Tant que le caractere n'est pas un séparateur
{
motlu[i]=c;
fscanf (f, "%c", &c); // On enregistre le motlu dans un tableau motlu
i++;
}
convert(motlu); // enleve les majuscules
motlu[i]='\0';
k=0;

if (strcmp(motlu,"")!=0)
{
trouve = 0;
while ( (k < nb_mots) && (trouve==0)) // tant que le que tu n'a pas parcouru tout les mots
{
if ( strcmp(tableau[k].mot, motlu) == 0)
{
tableau[k].frequence++; // Si le mot en question est présent, on augmente la frequence de + 1
trouve=1;
}
k++;
}

if ( trouve == 0)
{
struct mot_frequence aux ;
strcpy (aux.mot, motlu); // Si on a pas trouvé le mot en question, on le place à la fin du tableau
aux.frequence = 1;
tableau[nb_mots] = aux ;
printf ("%s\n", tableau[nb_mots].mot);

tableau[nb_mots].taille=strlen(tableau[nb_mots].mot);

nb_mots++;
}
}

}
}



/*
-------------------------------Programme principale-----------------------------
*/
int i;
int main()
{

ouverture();
extraction(f);

system("pause");
return 0;
}
0
Lacharlottinne Messages postés 5 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 15 mai 2005
15 mai 2005 à 15:14
Exacte ca marche mieux :) je suis débutante ca fais à peine 3 semaines que j'en fais merci bcq :)
0
Rejoignez-nous