IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Un petitproblème avec la fonction SearchStringInBigFile


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Un petitproblème avec la fonction SearchStringInBigFile
    Salut Les développeurs!!!!
    J'ai ouvert un sujet dans ce forum a propos de la recherche dans les fichier binaire....
    "ShaiLeTroll" Ma donner une fonction très fantastiques mais le problème c'est que je peux juste faire la recherche une fois, et il me faut beaucoup de recherche des tableaux dans le fichier ouvert
    J'ai essayé plusieurs modifications mais aucune résultats...
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    procedure TForm1.Button1Click(Sender: TObject);  
    const
    A1: array[1..12] of Byte = ($F5,$38,$7E,$EF,$CC,$EC,$EE,$64,$B3,$49,$26,$0F);
    A2: array[1..12] of Byte = ($13,$9C,$FF,$BA,$38,$17,$D8,$52,$CA,$05,$D6,$94);
    var
      SourceFileName: string;
      HexaString: AnsiString;
      OffSets: TIntegerDynArray;
      I,Position,J: Integer;
    begin
     edit1.Clear;
     if opendialog1.Execute then
     edit1.Text:=opendialog1.FileName ;
    begin
      SetLength(HexaString, Length(A1));
      CopyMemory(@HexaString[1], @A1[1], Length(A1));
      SourceFileName := edit1.Text;
      if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
      begin
        for I := Low(OffSets) to High(OffSets) do
        begin
          ShowMessage(IntToStr(OffSets[i]));
     
      begin
      SetLength(HexaString, Length(A2));
      CopyMemory(@HexaString[1], @A2[1], Length(A2));
      SourceFileName := edit1.Text;
      if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
      begin
        for J := Low(OffSets) to High(OffSets) do
        begin
          ShowMessage(IntToStr(OffSets[J]));
     
     end;
     end;
     end;
     end;
     end;
     end;
     end;
    dans ce code là, je me donne juste la première occurrence et il s'arrête
    comment le rendre chercher plusieurs tables ??
    Merci


    Smith
    THX

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    utilise la fonction SearchBinaryInFile , cela sera plus simple

    Attention, OffSets est effacé à chaque appel !

    Soit recopier dans un autre tableau ou remplacé la directive "out" par "var" dans la fonction SearchBinaryInFile

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    ShaiLeTroll
    -----------------
    j'ai presque fini mon programme + j'ai utilisé la fonction SearchStringInBigFile
    Ou est la faute dans mon code???




    Smith
    THX

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    je dirais tous les "end" mis n'importe comment

    si j'indente ton code comme il est compris par le compilateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    procedure TForm1.Button1Click(Sender: TObject);  
    const
    A1: array[1..12] of Byte = ($F5,$38,$7E,$EF,$CC,$EC,$EE,$64,$B3,$49,$26,$0F);
    A2: array[1..12] of Byte = ($13,$9C,$FF,$BA,$38,$17,$D8,$52,$CA,$05,$D6,$94);
    var
      SourceFileName: string;
      HexaString: AnsiString;
      OffSets: TIntegerDynArray;
      I,Position,J: Integer;
    begin
     edit1.Clear;
     if opendialog1.Execute then
       edit1.Text:=opendialog1.FileName ;
      begin
        SetLength(HexaString, Length(A1));
        CopyMemory(@HexaString[1], @A1[1], Length(A1));
        SourceFileName := edit1.Text;
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
        begin
          for I := Low(OffSets) to High(OffSets) do
          begin
            ShowMessage(IntToStr(OffSets[i]));
     
            begin
              SetLength(HexaString, Length(A2));
              CopyMemory(@HexaString[1], @A2[1], Length(A2));
              SourceFileName := edit1.Text;
     
              if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
              begin
     
                for J := Low(OffSets) to High(OffSets) do
                begin
                  ShowMessage(IntToStr(OffSets[J]));
     
                end;
              end;
            end;
          end;
        end;
      end;
    end;
    et voici le code que tu voulais écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TForm1.Button1Click(Sender: TObject);  
    const
    A1: array[1..12] of Byte = ($F5,$38,$7E,$EF,$CC,$EC,$EE,$64,$B3,$49,$26,$0F);
    A2: array[1..12] of Byte = ($13,$9C,$FF,$BA,$38,$17,$D8,$52,$CA,$05,$D6,$94);
    var
      SourceFileName: string;
      HexaString: AnsiString;
      OffSets: TIntegerDynArray;
      I,Position,J: Integer;
    begin
      edit1.Clear;
      if opendialog1.Execute then
      begin
        edit1.Text:=opendialog1.FileName ;  
        SourceFileName := edit1.Text;
     
        SetLength(HexaString, Length(A1));
        CopyMemory(@HexaString[1], @A1[1], Length(A1));
     
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
          for I := Low(OffSets) to High(OffSets) do
            ShowMessage(IntToStr(OffSets[i]));
     
        SetLength(HexaString, Length(A2));
        CopyMemory(@HexaString[1], @A2[1], Length(A2));
     
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
          for J := Low(OffSets) to High(OffSets) do
            ShowMessage(IntToStr(OffSets[J]));
       end;
    end;

    Il vraiement nécessaire que tu reprennes les bases, surtout au niveau de la syntaxe au lieu de t'attaquer à des trucs qui te dépassent

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut aider moi a optimiser mon code
    Dans le code ci-dessus, il y a un petit problème avec la fonction de la recherche, est ce qu'il y a une methode pour faire arréter la fonction de recherche quand elle trouve une chaine des chaines (A1,A2,A3)
    >>> quand la recherche trouve une des chaine déclarer elle donne juste l'offset et le message c tous
    je pence que vous me comprenez bien après la lecture du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
    A: array[1..12] of Byte = ($6D,$61,$69,$6E,$63,$6F,$64,$65,$00,$FF,$FF,$FF);
    B: array[1..12] of Byte = ($6D,$61,$69,$6E,$63,$6F,$64,$65,$43,$00,$FF,$FF);
    E: array[1..12] of Byte = ($6D,$61,$69,$6E,$63,$6F,$64,$65,$43,$53,$00,$FF);
    var
      SourceFileName: string;
      HexaString: AnsiString;
      OffSets: TIntegerDynArray;
      I,J,K: Integer;
    begin
      edit1.Clear;
      if opendialog1.Execute then
      begin
        edit1.Text:=opendialog1.FileName ;
        SourceFileName := edit1.Text;
     
        SetLength(HexaString, Length(A));
        CopyMemory(@HexaString[1], @A[1], Length(A));
     
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
          for I := Low(OffSets) to High(OffSets) do
              ShowMessage(IntToStr(OffSets[I]));
              ShowMessage('A1');
     
     
        SetLength(HexaString, Length(B));
        CopyMemory(@HexaString[1], @B[1], Length(B));
     
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
          for J := Low(OffSets) to High(OffSets) do
            ShowMessage(IntToStr(OffSets[J]));
            ShowMessage('A2');
     
        SetLength(HexaString, Length(E));
        CopyMemory(@HexaString[1], @E[1], Length(E));
     
        if SearchStringInBigFile(SourceFileName, HexaString, OffSets, True) > 0 then
          for K := Low(OffSets) to High(OffSets) do
            ShowMessage(IntToStr(OffSets[K]));
            ShowMessage('A3');
     
       end;
    end;

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut Search in big files
    Ton problème est récurant dans les recherches
    Les fonctions de positionnement s'arrête toutes a la première occurrence.
    Pour à palier a cela on modifie l'adresse de début de la recherche et on recommence.Mais cela n'est pas satisfaisanr et lent.
    Mais on peut faire beaucoup mieux si on le fait à la main. L'usage de fonction de la RTL te garantie la pérenité et la maintenance de ton code.
    Mais on ne change pas de systeme de fichier

    Si tes fichiers sont plus petits que ta mémoire tu peux les traiter en une fois
    le principe est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    procedure Charge_Bons;
    var a, i, J: Longint; OutFile: file;
    begin
      AssignFile(OutFile, 'CribleNP.dat');
      Reset(OutFile, 1);
      J := Filesize(OutFile);
      try
        Blockread(OutFile, Buffer[1], J);
      finally
        CloseFile(OutFile);
      end;
    end;
    Si le fichier est trop grand tu divise la taille pour avoir un j plus petit et
    tu fais deux fois le traitement
    On recherche une chaine 'Anniversaire'
    donc tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    S1:!= 'Anniversaire';
    for i:= i th j do
     if bons[i]='A' then
      begin
    present = true
      for z:=2 to length(S1) do
      if bons[i+z]<> S1[z]then
      present := false ;
     if présent then
      begin
       Inc(trouve)
       Position[trouve]:=i;
      end;
      end;
    A la sortie tu as une table Position avec les offset de ta chaine
    Au lieu de faire une bête recherche avec un for tu as le droit d'optimiser
    ce n'est pas tres dur. Mais la deja tu as toutes les
    occurrences d'un coup et rapidement

    Boris

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Citation Envoyé par FullSpeed Voir le message
    Ton problème est récurant dans les recherches
    Les fonctions de positionnement s'arrête toutes a la première occurrence.
    Non, pas SearchString... par défaut, cela balaye TOUT le fichier et stocke les offsets, ... il y a un paramètre Threshold (c'est ce que tu veux Smith, la fonction est documenté par un cartouche, lit le donc) pour limiter la recherche, je n'ais pas prévu de d'index de démarrage, la fonction n'en n'ayant pas besoin ...

    Sinon, charger l'intégralité d'un fichier est une mauvaise idée, et vouloir réduire le packet ajoute implicitement la gestion de chevauchement de la donnée sur deux packets ... SearchString le fait de mieux en mieux ... et SearchBinaryInFile est plus adéquat pour ce problème et surtout c'est la dernière version corrigée ...

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    ok, j'éssei de travaillé avec "SearchBinaryInFile", j'ai lu la documentation mais j'ai toujours des problèmes quand je veux utiliser une fonction et l'appliqué dans mon programmes..
    On applique cette fonction comme SearchStringInBigFile ????

    Merci

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Smith_4400, Shai a donné un exemple d'utilisation dans le topic où il a écrit la fonction, ici.

    Essayes de chercher un peu plus s'il te plait.

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Smith_4400, Shai a donné un exemple d'utilisation dans le topic où il a écrit la fonction, ici.

    Essayes de chercher un peu plus s'il te plait.
    oui J'ai vu ce message et j'ai travaillé sur, mais il marche pas

    Regarde les messages d'erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Construction
      [Conseil] Unit1.pas(37): La variable 'UpSearchString' est déclarée mais jamais utilisée dans 'SearchBinaryInFile'
      [Erreur] Unit1.pas(143): Les types des paramètres VAR originaux et formels doivent être identiques
      [Erreur] Unit1.pas(144): Identificateur non déclaré : 'CountLn'
      [Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    A Mon avis Smith, tu veux faire quelque chose qui te dépasse, commence déjà à comprendre ce que te dis le Compilateur, en cherchant, tu aurais vu que SearchBinaryInFile a changé depuis l'exemple, et utilise TIn64DynArray au lieu de TIntegerDynArray, que CountLn c'est juste Count ... et que 'UpSearchString' n'est qu'un déchet laissé lors de la transformation SearchStringInBigFile vers SearchBinaryInFile ... ce code étant dans une appli à bordel, j'ai bien trop de warning ou hint à m'occuper ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TFrmTestFichier.BtnSearchBinaryInFileClick(Sender: TObject);
    var
       SearchBuf: TByteDynArray;
       OffSets: TInt64DynArray;
       iOff, Count: Integer;
    begin
       SetLength(SearchBuf, 4);
       SearchBuf[0] := 1;
       SearchBuf[1] := 2;
       SearchBuf[2] := 3;
       SearchBuf[3] := 4;
     
       Count := SearchBinaryInFile(EdPathSearch.Text, SearchBuf, OffSets, True);
       ShowMessage(IntToStr(Count));
     
       Memo1.Lines.BeginUpdate();
       try
          Memo1.Lines.Add('---');
          for iOff := Low(OffSets) to High(OffSets) do
             Memo1.Lines.Add(IntToStr(OffSets[iOff]));
       finally
          Memo1.Lines.EndUpdate();
       end;
    end;

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  3. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo