schap25
Messages postés21Date d'inscriptionmercredi 21 mai 2008StatutMembreDernière intervention28 mai 2008
-
26 mai 2008 à 09:54
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 2009
-
26 mai 2008 à 15:58
Bonjour,
J'ai un petit soucis, je cherche a comparé deux chaine de caractère donc je commence par faire :
strcpy(mot,"MIME-Version: 1.0 ");
Le deuxieme mot est recherché caractere par caractere dans un texte afin d'y etre comparé
donc plus loin je fais :
if(!(strcmp(s_read,mot)))
{
blabla++;
}
En gros, j'ai l'impression que le code ne prend pas en compte le ".0"
pour faire la comparaison, et donc je ne rentre jamais dans le if,
malgré que s_read soit identique a mot (normalement), car quand je
compare seulement avec "MIME-Version", ca fonctionne .. (c'est pour un
code de recherche de mot dans un fichier txt).
schap25
Messages postés21Date d'inscriptionmercredi 21 mai 2008StatutMembreDernière intervention28 mai 2008 26 mai 2008 à 10:03
Pardon, je viens de voir que strcmp s'arretai au premier 0 trouvé, je
sais donc d'ou vien le probleme, mais je ne vois pas quel fonction je
doit utilisé pour remplacé strcmp..
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mai 2008 à 11:08
Bonjour,
1) Il ne faut pas confondre le caractère "0" (zéro) avec le code binaire 0 qui marque la fin d'une chaîne ! Le contenu de la chaîne "mot" peut contenir autant de caractères "0" que possible, ça n'arrêtera pas la comparaison.
2) Il y a un espace derrière le "0" dans le code strcpy(mot,"MIME-Version: 1.0 ");. S'il n'existe pas aussi dans s_read, la comparaison sera toujours négative !
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mai 2008 à 11:46
Certainement pas ! Seul le zéro binaire stoppe la comparaison. Est-ce qu'il n'y aurait pas un problème de casse (majuscules/minuscules) ? stricmp() pour ne pas tenir compte de la casse.
BunoCS
Messages postés15394Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention29 septembre 2023102 26 mai 2008 à 11:48
Salut,
Une petite précision concernant les fonctions de comparaison: elles sont case-sensitives. Pour ne pas prendre en compte les majuscules et miniscules, il faut utiliser stricmp()
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mai 2008 à 12:56
En tout cas c'est une manipulation de fichier qui est extrèmement bizarre !!! - Une première lecture pour connaître la taille du fichier via la lecture d'entiers : getw() lit un "int" 4 octets 4 caractères, donc une taille de fichier fausse 3 fois sur 4 (le fichier n'a aucune raison d'avoir une taille systématiquement multiple de 4).
- Une seconde lecture qui lit des blocs de caractères en se décallant d'un caractère à chaque fois : si "l_mot" = 18 caractères, grosso-modo le fichier est lu 18 fois !
Comme c'est un fichier texte vu l'open("r") il suffit de faire (si la sous-chaîne n'est sensée être trouvée qu'une seule fois par ligne) :
l_file = 0; // si besoin de la taille du fichier par la suite
ref = 0;
char* szMot = "MIME-Version: 1.0";
FILE* pFile = fopen(file_t,"r");
if (pFile == NULL) return; // ERREUR
char szLigne[1024]; // buffer de lecture d'une ligne
while(true)
{
if (fgets(szLigne,1024,pFile) == NULL) break; // EOF
l_file += strlen(szLigne) + 1; // +1 pour NL
if (strstr(szLigne,szMot)) ++ref;
}
fclose(pFile);
cout << szMot << " trouvé " << ref << " fois" << endl;
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mai 2008 à 14:32
C'est pas normal que cela ne marche pas avec "r" seul (ou "rt").
Je viens de tester et ça marche bien avec ou sans le "b" puisque fgets() lit jusqu'au premier NL rencontré, donc il lit bien le fichier ligne par ligne. Par contre avec le "b" la taille du fichier est fausse (il ne faut plus le + 1).
schap25
Messages postés21Date d'inscriptionmercredi 21 mai 2008StatutMembreDernière intervention28 mai 2008 26 mai 2008 à 15:13
Merci pour ton aide Jfrancois, mon programme fonctionne ... mais est beaucoups trops long a l'execution :'(
(je devais rechercher le nombre de fois qu'apparaissai un mot dans un
ensemble de fichier de 4 a 10Go, afin de compter un nombre de mails,
fin bref ..)
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mai 2008 à 15:58
Alors il faudrait limiter les accès disque en lisant les fichiers par gros blocs, mais on court le risque (très faible mais pas nul) du texte coupé en 2 entre 2 blocs. Ou alors lire les fichiers en une seule fois s'il ne sont pas trop gros individuellement. Ensuite c'est de la recherche en mémoire.