begin process at 2010 02 10 03:40:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > TROUVER UNE CHAINE DE CARACTÈRES

TROUVER UNE CHAINE DE CARACTÈRES


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Classé sous :recherche, chercher, chaine, caractères Niveau :Débutant Date de création :28/12/2003 Date de mise à jour :29/06/2006 20:19:01 Vu / téléchargé :12 611 / 638

Auteur : vecchio56

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce programme permet de chercher une chaine de caractères n'importe ou dans un disque dur ou un autre volume. Le principal intérêt est que la recherche ne s'arrête pas au premier zéro binaire d'un fichier comme le fait l'outil de Windows.


 Conclusion

Merci BruNews

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 juin 2006 16:18:26 :
Ajout options
29 juin 2006 20:19:01 :
Ajout options

 Sources du même auteur

Source avec Zip COLORATION DE CODE C/C++ POUR LE FORUM DE CPPFRANCE
Source avec Zip SUPPRIMER LES # AJOUTÉS LORS D'UN COPIER/COLLER
Source avec Zip Source avec une capture CRÉER UN FICHIER ISO À PARTIR D'UN RÉPERTOIRE (WIN32)
Source avec Zip Source avec une capture EXPLORATEUR DE FICHIERS ISO
Source avec Zip Source avec une capture CHARGER UNE POLICE DEPUIS UN FICHIER OU UNE RESSOURCE (WIN32...

 Sources de la même categorie

Source avec Zip Source avec une capture ID3 TAG COVER ALBUM IMAGE par nanonavich
FILEREADER par FrancoisGauthier
Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip Source avec une capture Source .NET (Dotnet) INFILESEEKER par swonder
Source avec Zip Source avec une capture USB DETECTION par abandonware

 Sources en rapport avec celle ci

Source avec Zip RECHERCHE D'ANNAGRAMMES par Torin
Source avec Zip Source avec une capture [C/WIN32] GÉNÉRATEUR DE CODE POUR UNE INITIALISATION SPÉCIAL... par deck_bsd
SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER par buno
Source avec Zip ALGORITHME DE RECHERCHE DICHOTOMIQUE par deck_bsd
Source avec Zip TROUVER UNE CHAINE DE CARACTÈRES(2) (WIN32) par BruNews

Commentaires et avis

Commentaire de cppdupdup34 le 28/12/2003 14:53:46

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

Commentaire de BruNews le 28/12/2003 15:21:59 administrateur CS

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.

Commentaire de vecchio56 le 28/12/2003 15:25:17 administrateur CS

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

Commentaire de BruNews le 28/12/2003 15:41:16 administrateur CS

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().

Commentaire de vecchio56 le 28/12/2003 15:51:16 administrateur CS

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

Commentaire de BruNews le 28/12/2003 15:59:52 administrateur CS

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
}

Commentaire de vecchio56 le 28/12/2003 16:16:20 administrateur CS

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

Commentaire de BruNews le 28/12/2003 16:34:48 administrateur CS

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

Commentaire de vecchio56 le 28/12/2003 17:21:21 administrateur CS

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

Commentaire de vecchio56 le 28/12/2003 17:33:50 administrateur CS

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

Commentaire de BruNews le 28/12/2003 17:47:54 administrateur CS

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.

Commentaire de vecchio56 le 28/12/2003 18:03:02 administrateur CS

Je vais essayer avec HeapAlloc mais il faut avouer que l'erreur qu j'ai est bizarre

Commentaire de vecchio56 le 28/12/2003 18:28:26 administrateur CS

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é?

Commentaire de Thaeron le 28/12/2003 19:34:36

Yop, BruNews tes critiques sont a chaques fois tres constructives pour chacun de nous mais soit aimable un peu ça coute rien.

Commentaire de BruNews le 28/12/2003 19:44:04 administrateur CS

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.

Commentaire de vecchio56 le 28/12/2003 19:46:44 administrateur CS

de toutes facons j'ai bien mérité ces critiques vu ce que j'ai produit...

Commentaire de morgandetoi06 le 28/12/2003 21:10:56

>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" )...

Commentaire de vecchio56 le 28/12/2003 21:32:03 administrateur CS

tiens un fan de tuning :)

Commentaire de Thaeron le 28/12/2003 21:53:30

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.

Commentaire de BruNews le 28/12/2003 22:06:00 administrateur CS

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.

Commentaire de vecchio56 le 28/12/2003 22:11:26 administrateur CS

tuning -> va voir le site de morgandetoi06
c'est un truc de bofs qu'on peut aussi appeler des jacky

Commentaire de Thaeron le 28/12/2003 22:13:39

BruNews le programmeur philosophe, ou c'est plutot le philosophe programmeur ?

Commentaire de BruNews le 28/12/2003 22:24:23 administrateur CS

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.

Commentaire de vObjects le 29/12/2003 00:06:34

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 ...

@++;

Commentaire de vObjects le 29/12/2003 00:09:37

Problème avec la fin de mon commentaire

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

Correction:
'ou non un 0 dans la'

Commentaire de vObjects le 29/12/2003 00:13:43

Class pour manipuler le heap;
http://www.cppfrance.com/code.aspx?ID=17202


@++;

Commentaire de BruNews le 02/01/2004 13:17:36 administrateur CS

autre version ici:
http://www.cppfrance.com/code.aspx?ID=19169

Commentaire de MAXICHE le 19/09/2005 22:31:55

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

recherche une chaine de caractères dans un fichier [ par Tamahoma ] Bonjour, Je voudrais rechercher une chaine de caractères dans un fichier, il prend le début de cette chaine jusqu'à ce qu'il rencontre chercher la position d'un caractère dans une chaine [ par Vishnouu ] Bonjour, je suis encore débutant en c/c++ je vous explique ce que je veux faire : voici une chaine de caractères string alpha = abcdefgh conversion vers chaine de caractères..urgent..SVP [ par othland ] salut c'est vraiment urgentpour faire la conversion d'un entier ou d'un float vers une chaine de caractères, j'ai utilisé les fonctions découpage de chaine de caractères [ par eldred ] Bonjour!! voila dans l'optique du dévelopement d'une appli client serveur, je programme un fonction qui doit comparer deux chaines puis sépa message WM_ENTER [ par samia82 ] bonjour a tous novice dans le visual c++ je cherche à créer une sorte de moteur de recherche dans une base de donnée ...je souhaiterai pour lancer ma chaine de caractères et expressions régulières [ par Neufran ] Bonjour à tous,Voilà mon problème : Admettons que j'ai une chaine de caractères. Dans celle-ci il y a le nom d'un fichier et son extension séparés par Suppression de caractères (extension) dans une chaine C++ [ par klitzounet ] Bonjour J'ai un code C++ qui fonctionne parfaitement (j'ai travaillé longtemps à partir d'une source -> je suis plutôt débutant, pour réussir à l'a Manipulation chaine de caractères [ par banane_rose ] bonjour, voilà j'ai ça par exemple : zéro;un;deux;trois comment je peux faire pour "extraire" de cette chaîne de caractère l opérations dans une chaine de caractères [ par bagaz ] Bonjour à tous.Voila j'aimerais faire un programme qui fasse l'évaluation d'une expression qui tient dans un char * et qui retourne le resultat.un exe


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,201 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales