TROUVER UNE CHAINE DE CARACTÈRES

cppdupdup34 Messages postés 212 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 13 mai 2006 - 28 déc. 2003 à 14:53
MAXICHE Messages postés 1 Date d'inscription vendredi 27 février 2004 Statut Membre Dernière intervention 19 septembre 2005 - 19 sept. 2005 à 22:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19039-trouver-une-chaine-de-caracteres

MAXICHE Messages postés 1 Date d'inscription vendredi 27 février 2004 Statut Membre Dernière intervention 19 septembre 2005
19 sept. 2005 à 22:31
vraiment genial comme programme . sa me fait penser au programme "Desktop Search" .vraiment bravo c est tres utile et de plus c'est tres rapide
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 janv. 2004 à 13:17
vObjects Messages postés 17 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 29 décembre 2003
29 déc. 2003 à 00:13
Class pour manipuler le heap;
http://www.cppfrance.com/code.aspx?ID=17202


@++;
vObjects Messages postés 17 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 29 décembre 2003
29 déc. 2003 à 00:09
Problème avec la fin de mon commentaire

Problème:
'ou non un '' dans la '

Correction:
'ou non un 0 dans la'
vObjects Messages postés 17 Date d'inscription samedi 11 octobre 2003 Statut Membre Dernière intervention 29 décembre 2003
29 déc. 2003 à 00:06
bool NEngine::WordIsInFile(const char *file, const char *str)
{

NMemoryMapping mm;
MappingPointers mp;
unsigned long index = 0;
unsigned long size = 0;
long len = 0;
bool bFound = false;
char* pzBuffer = NULL;

if ( str && file ) {

len = strlen(str);
void* p = mm.CreateReadMap(file, mp);

if ( p ) {

// pzBuffer = (char*)p;
pzBuffer = reinterpret_cast<char*>(p);

if ( pzBuffer ) {

size = ::GetFileSize(mp.pFile, 0);

if ( size > 0 && size >= (unsigned long)len ) {
len--;

for ( index = 0; !bFound && (index+len) < size; index++ ) {
bFound ( memcmp(pzBuffer+index, str, len) 0 );
}

}

}

mm.FreeMap(mp);

}

}

return bFound;

}

ceci n'est qu'une parti d'un code, NEngine que l'on peut retrouver sur le site(www.cppfrance.com), créé par NitRic ...

Pour trouver un mot(chaine) dans un fichier, peu importe la taille, s'il y à ou non un '' dans la chaine, etc ...

@++;
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 22:24
J'ai vu le 'tuning', jolis bolides qui ne m'interessent en rien.
Ferrari, Porche etc travailleraient-ils les portes ouvertes par hasard ? N'ont-ils plus de technologies protégées ? Si c'est le cas, fermeture de ces marques a prevoir.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
28 déc. 2003 à 22:13
BruNews le programmeur philosophe, ou c'est plutot le philosophe programmeur ?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 22:11
tuning -> va voir le site de morgandetoi06
c'est un truc de bofs qu'on peut aussi appeler des jacky
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 22:06
vecchio, tuning, c'est quoi ???

Autres systemes ? simple je n'en pense rien car j'ignore. Par contre je sais que je suis pour la propriete intellectuelle et materielle, pour la LIBERTE contre le 'libre'. Ceci n'est evidemment comprehensible que par les gens qui doivent s'assumer materiellement.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
28 déc. 2003 à 21:53
Balance moi les liens morganedetoi je veux lire ça.
Lorsque je dis constructif c'est qu'il met en évidence les problemes et aide a les résoudres. Mais personne n'est parfait.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 21:32
tiens un fan de tuning :)
morgandetoi06 Messages postés 389 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 17 décembre 2004 1
28 déc. 2003 à 21:10
>Thaeron tu n as pas vu les "remarques tres constructives" de BruNews sur les autres systemes d'exploitation que windows ( ça remet en question le mot "constructif" )...
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 19:46
de toutes facons j'ai bien mérité ces critiques vu ce que j'ai produit...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 19:44
Faut pas prendre la mouche, je ne pense pas avoir ete desagreable avec qui que ce soit. Si c'est pour le 1er commentaire, c'etait juste une plaisanterie que je savais pouvoir faire depuis le temps qu'on communique, rien de plus.
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
28 déc. 2003 à 19:34
Yop, BruNews tes critiques sont a chaques fois tres constructives pour chacun de nous mais soit aimable un peu ça coute rien.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 18:28
j'ai une question a propos de HeapAlloc:

HANDLE hHeap = GetProcessHeap();
char* pmem = (char*)HeapAlloc(hHeap, 0, dwBlockSize);
pmem++;
HeapFree(hHeap, 0, pmem);

Est-ce que je peux faire ca sachant que pmem a changé?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 18:03
Je vais essayer avec HeapAlloc mais il faut avouer que l'erreur qu j'ai est bizarre
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 17:47
if(!dwNumberOfBytesRead) return;
pas de liberation de memoire ici ???
mets un label
relMem: freeMem();
en bas de ta fonction et du moment que buffer alloue alors DOIT passer par la. Si on te dit que 'goto' n'est pas beau, tu laisses dire car c'est stupide.
Je te conseille HeapAlloc(), HeapFree() plutot que new,delete dans du C pour win32, de toutes les manieres ils finissent par y aller. new est utile pour instancier une classe car provoque appel du constructeur mais ici... Si tu n'utilises que API tu te liberes de la dependance a la version de la msvcrt, exemple si je compile ton code je devrais livrer ma msvcrt7.dll V2, avec API rien.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 17:33
comme ca ce sera peut etre plus lisible:

void FindTextInFile(HWND hDlg, const char* szText, const char* szFile)
{
HANDLE hFile = CreateFile(szFile, FILE_ALL_ACCESS, 0, 0, OPEN_EXISTING, 0, 0);

if(hFile == INVALID_HANDLE_VALUE)
return;

DWORD dwFileSize = GetFileSize(hFile, NULL);

UINT l = strlen(szText);
if(l > dwFileSize)
return;

DWORD dwBlockSize = 1000, dwNumberOfBytesRead;
char* szBuffer = new char[dwBlockSize];
char* szBuffer2 = szBuffer;

while(dwFileSize)
{
if(dwFileSize >= dwBlockSize)
{
DWORD d = dwBlockSize;
ReadFile(hFile, szBuffer, dwBlockSize, &dwNumberOfBytesRead, NULL);
if(!dwNumberOfBytesRead)
return;
szBuffer[dwBlockSize] = 0;
while(d)
{
if(!*szBuffer)
{
++szBuffer;
--d;
}
else
{
if(strstr(szBuffer, szText))
{
SendMessage(GetDlgItem(hDlg, IDC_LIST), LB_ADDSTRING, 0, (LPARAM)szFile);
delete[] szBuffer2;
CloseHandle(hFile);
return;
}
l = strlen(szBuffer);
d -= l;
szBuffer += l;
}
}
dwFileSize -= dwBlockSize;
}
else
{
DWORD d = dwFileSize;
ReadFile(hFile, szBuffer, dwFileSize, &dwNumberOfBytesRead, NULL);
if(!dwNumberOfBytesRead)
return;
szBuffer[dwFileSize] = 0;
while(d)
{
if(!*szBuffer)
{
++szBuffer;
--d;
}
else
{
if(strstr(szBuffer, szText))
{
SendMessage(GetDlgItem(hDlg, IDC_LIST), LB_ADDSTRING, 0, (LPARAM)szFile);
delete[] szBuffer2;
CloseHandle(hFile);
return;
}
l = strlen(szBuffer);
d -= l;
szBuffer += l;
}
}
dwFileSize = 0;
}
}

CloseHandle(hFile);
delete[] szBuffer2;
return;
}
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 17:21
je crois qu'il y a un truc qui commence a m'énerver
Maintenant il y a une erreur à l'éxécution quand je fais un delete[] sur un pointeur valide (delete[] szBuffer2;)

void FindTextInFile(HWND hDlg, const char* szText, const char* szFile)
{
HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);

if(hFile == INVALID_HANDLE_VALUE)
return;

DWORD dwFileSize = GetFileSize(hFile, NULL);

UINT l = strlen(szText);
if(l > dwFileSize)
return;

DWORD dwBlockSize = 1000, dwNumberOfBytesRead;
char* szBuffer = new char[dwBlockSize];
char* szBuffer2 = szBuffer;

while(dwFileSize)
{
if(dwFileSize >= dwBlockSize)
{
DWORD d = dwBlockSize;
ReadFile(hFile, szBuffer, dwBlockSize, &dwNumberOfBytesRead, NULL);
if(!dwNumberOfBytesRead)
return;
szBuffer[dwBlockSize] = 0;
while(d)
{
if(!*szBuffer)
{
++szBuffer;
--d;
}
else
{
if(strstr(szBuffer, szText))
{
SendMessage(GetDlgItem(hDlg, IDC_LIST), LB_ADDSTRING, 0, (LPARAM)szFile);
delete[] szBuffer2;
CloseHandle(hFile);
return;
}
l = strlen(szBuffer);
d -= l;
szBuffer += l;
}
}
dwFileSize -= dwBlockSize;
}
else
{
DWORD d = dwFileSize;
ReadFile(hFile, szBuffer, dwFileSize, &dwNumberOfBytesRead, NULL);
if(!dwNumberOfBytesRead)
return;
szBuffer[dwFileSize] = 0;
while(d)
{
if(!*szBuffer)
{
++szBuffer;
--d;
}
else
{
if(strstr(szBuffer, szText))
{
SendMessage(GetDlgItem(hDlg, IDC_LIST), LB_ADDSTRING, 0, (LPARAM)szFile);
delete[] szBuffer2;
CloseHandle(hFile);
return;
}
l = strlen(szBuffer);
d -= l;
szBuffer += l;
}
}
dwFileSize = 0;
}
}

CloseHandle(hFile);
delete[] szBuffer2;
return;
}
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 16:34
bien entendu pmem ne contiendra pas tout le fichier, alloue 1 Mo, ira bien, HeapAlloc que tu trouveras dans mes sources.
tu dois calculer avant le lancement le nbr a lire par passe 'toread' qui doit etre multiple de strlen(strFind) le plus proche de (1 Mo - 1).
chaqueFichier:
hfl = CreateFile(...);
fromFL: // boucage ici
dwread = 0; ReadFile(hfl, pmem, toread, &dwread, 0);
if(!dwread) goto nextFL;
pout = pmem + dwread;
*pout = 0;
c = pmem;
a partir d'ici a coups de strstr() sur c et poussant c si strstr donne 0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 16:16
strstr rend NULL s'il n'y a pas d'occurence donc je ne pourrai pas l'utiliser, j'ai plutot pensé à utiliser strlen
J'avais pensé a ce que tu dis la mais ca pose un problème pour les gros fichiers puisque si je comprends bien, pmem contient tout le fichier...
Si ce n'et pas le cas, peux-tu me dire exactement d'ou vient pmem
En fait j'était parti dans une autre direction, dis moi ce que tu en penses:
Je crée un buffer de taille arbitraire 1000 par exemple et je lis des blocs de 1000 caractères et a chaque fois je cherche la chaine
Si j'ai un zéro avant la vrai fin de la chaine, j'avance de strlen(buffer) et je rappelle strstr jusqu'a ce que j'arrive à la fin de la chaine
J'espere que je ne suis pas complement désépérant
Merci en tout cas de ton aide
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 15:59
char *pmem; // tu alloues 1 seule fois pour toute la recherche
char *c, *pout;
pout = pmem + lenread;
c = pmem;
while(c < pout) {
je te laisse chercher ici
strstr() donne un pointeur, ok ? alors sers t'en
pense a pousser c au dela des zeros possibles
}
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 15:51
Oui mais le problème c'est qu strstr s'arrête au premier zéro rencontré
et puis j'ai pas trop compris comment tu voudrais que j'utilises strstr
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 15:41
strstr() suppose un ZERO final sur buffer (string C) faudra donc penser a le mettre.
Pourquoi FILE_ALL_ACCESS vu que tu dois juste le lire ? Toujours demander un droit d'acces au minimum du besoin, ici GENERIC_READ ira impec, mets aussi FILE_FLAG_SEQUENTIAL_SCAN pour le flag qui va preparer la suite de la lecture et accelerer pour les gros fichiers. Une fois ouvert, ne referme pas pour reouvrir, sers toi de ReadFile().
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2003 à 15:25
Je devine que c'est toi cppdupdup34 qui a mis une note et je t'en remercie.
BruNews je suis sincerement désolé, tu veux dire qu'en fait j'aurais du faire des appels successifs à strstr(). C'est vrai je vais changer cela avant que trop de monde ne voie ce que j'avais fait
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2003 à 15:21
Salut,
'pas optimisé' est le minimum que tu pouvais dire, on mettra cela sur le compte des fatigues dues aux exces des fetes. Lire un par un les octets des fichiers pour comparaison porte a des temps de reponse redhibitoires, alloue un buffer au depart et aspire dedans un multiple de la longueur de la chaine recherchee. Tu pourras ainsi employer strstr() qui lui est optimise, le fait qu'il puisse y avoir des ZEROS dans le buffer ne gene en rien si tu reflechis 1 seconde.
cppdupdup34 Messages postés 212 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 13 mai 2006
28 déc. 2003 à 14:53
ca marche et c'est tres utile
pour les fonctionnalité tu peux t'inspirer de grep sous linux
la presentation est super
j'ai pas regarder mais on peut l'executer en ligne de commande?
ce qu serait bien et que fait grep c'est de mettrte la ligne dans le fichier ou il trouve le string
bonne continuation