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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és202Date d'inscriptionvendredi 6 juillet 2001StatutMembreDernière intervention31 octobre 2007 28 déc. 2003 à 22:13
BruNews le programmeur philosophe, ou c'est plutot le philosophe programmeur ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és202Date d'inscriptionvendredi 6 juillet 2001StatutMembreDernière intervention31 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 déc. 2003 à 21:32
tiens un fan de tuning :)
morgandetoi06
Messages postés389Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention17 décembre 20041 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és202Date d'inscriptionvendredi 6 juillet 2001StatutMembreDernière intervention31 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 déc. 2003 à 18:28
Est-ce que je peux faire ca sachant que pmem a changé?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 déc. 2003 à 17:33
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és212Date d'inscriptiondimanche 29 juin 2003StatutMembreDernière intervention13 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
19 sept. 2005 à 22:31
2 janv. 2004 à 13:17
http://www.cppfrance.com/code.aspx?ID=19169
29 déc. 2003 à 00:13
http://www.cppfrance.com/code.aspx?ID=17202
@++;
29 déc. 2003 à 00:09
Problème:
'ou non un '' dans la '
Correction:
'ou non un 0 dans la'
29 déc. 2003 à 00:06
{
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 ...
@++;
28 déc. 2003 à 22:24
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.
28 déc. 2003 à 22:13
28 déc. 2003 à 22:11
c'est un truc de bofs qu'on peut aussi appeler des jacky
28 déc. 2003 à 22:06
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.
28 déc. 2003 à 21:53
Lorsque je dis constructif c'est qu'il met en évidence les problemes et aide a les résoudres. Mais personne n'est parfait.
28 déc. 2003 à 21:32
28 déc. 2003 à 21:10
28 déc. 2003 à 19:46
28 déc. 2003 à 19:44
28 déc. 2003 à 19:34
28 déc. 2003 à 18:28
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é?
28 déc. 2003 à 18:03
28 déc. 2003 à 17:47
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.
28 déc. 2003 à 17:33
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;
}
28 déc. 2003 à 17:21
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;
}
28 déc. 2003 à 16:34
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
28 déc. 2003 à 16:16
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
28 déc. 2003 à 15:59
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
}
28 déc. 2003 à 15:51
et puis j'ai pas trop compris comment tu voudrais que j'utilises strstr
28 déc. 2003 à 15:41
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().
28 déc. 2003 à 15:25
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
28 déc. 2003 à 15:21
'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.
28 déc. 2003 à 14:53
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