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 :

TFileStream avec ReadBuffer sur longueur strings déterminé


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut TFileStream avec ReadBuffer sur longueur strings déterminé
    Bonjour à toutes et à tous,

    J'essaie de lire un fichier txt par TfileStream, je souhaiterais envoyé la taille de la chaine à retourner, mais cela ne fonctionne pas.

    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
    function ReadFilesTxt(Fichier: TStringList; NbCar:Integer): String;
    Var
      Stream : TFileStream;
      i: Integer;
    begin
    //  Result := '';
      for i := 0 to Fichier.Count - 1 do
      begin
        with TFileStream.Create(Fichier[i],
          fmOpenRead or fmShareDenyWrite) do begin
          try
            ReadBuffer(Result[NbCar],Sizeof(Result[NbCar]));
          Finally
            Free;
          end;
        end;
      end;
    end;


    Par contre si je fais cela sa fonctionne :

    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
    function ReadFilesTxt(Fichier: TStringList; NbCar:Integer): String;
    Var
      Stream : TFileStream;
      i: Integer;
      Value: String[20];
    begin
      Result := '';
      for i := 0 to Fichier.Count - 1 do
      begin
        with TFileStream.Create(Fichier[i],
          fmOpenRead or fmShareDenyWrite) do begin
          try
            ReadBuffer(Value,Sizeof(Value));
            Result := Value;
          Finally
            Free;
          end;
        end;
      end;
    end;

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    ce que je comprend pas c'est que ta fonction, ne renverra que la derniere ligne du dernier fichier ... ?!

    sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SetLength(BufferString, NbChar);
     
    {...}
      Read(BufferString[1], NbChar);
    {...}
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      BufferString : string ou AnsiString;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    ce que je comprend pas c'est que ta fonction, ne renverra que la derniere ligne du dernier fichier ... ?!
    En fait j'ai fais cela entre temps :

    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
    function ReadVersion(FileName: TFileName): Integer;
    Var
      i,j: Integer;
      Value: String[180];
    begin
      Result := -1;
      with TFileStream.Create(FileName,
        fmOpenRead or fmShareDenyWrite) do begin
        try
          Try
            ReadBuffer(Value,SizeOf(Value));
            Value := Copy(Value,PosEndMot(Value,'#VER'),3);
            Result := StringInInteger(Value);
          Except
            Result := -1;
          End;
        finally
          Free;
        end;
      end;
    end;
    Pour info mon fichier comporte X lignes, je ne suis interresser que par la deuxième ligne, et surtout dans cette deuxieme ligne je souhite ressortir le chiffre qui se trouve à droite de '#VER'.
    La ligne 2 ressemble à cela
    #VER 5
    ou
    #VER 14

    Comme je n'arrive pas a prendre que le deuxieme ligne, j'utilise ma procédure pour
    1) rechercher ici dans les 180 premières caractères la position de la fin du mot #VER
    2) de transformer la suite en nombre.

    Sa parrait compliquer mais cela fonctionne.

    Mes autres procedures :
    PosEndMot
    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
    function PosEndMot(S:String; searchS: String): Integer;
    Var
      i: integer;
      nbS, nbSearch: Integer;
    begin
      Result := -1;
      nbS := Length(s);
      nbSearch := Length(searchS);
      i := 1;
      while (i <= nbS) do
      begin
        if Copy(S,i,nbSearch) = SearchS then
        begin
          Result := i + nbSearch;
          Break;
        end;
        Inc(i);
      End;
    end;
    StringInInteger
    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
    function StringInInteger(S:String): Integer;
    Var
      i   : integer;
      nbS : integer;
      DebPos, FinPos: integer;
    begin
      result := -1;
      nbS := Length(s);
      i   := 1;
      while (i <= nbS) do
      begin
        if (Ord(s[i]) >= 48) And (Ord(s[i]) <= 57) then
        begin
          DebPos := i;
          FinPos := 0;
          while (i <= nbS) And (Ord(s[i]) >= 48) And (Ord(s[i]) <= 57) do // de 0 à 9 do
          begin
            inc(FinPos);
            inc(i);
          end;
          break;
        end;
        inc(i);
      end;
      Try
        result := StrToInt(Copy(S,DebPos,FinPos));
      Except
        Result := -1;
      End;
    end;
    Je vais essayer ton SetLength.

    Merci.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Pour info mon fichier comporte X lignes, je ne suis interresser que par la deuxième ligne, et surtout dans cette deuxieme ligne je souhite ressortir le chiffre qui se trouve à droite de '#VER'.
    La ligne 2 ressemble à cela
    #VER 5
    ou
    #VER 14
    Dans ReadVersion() après avoir créé ton FileStream il faut préciser la Position à laquelle se trouve le début de la 2ième ligne qui t'intéresse avant de faire la lecture avec ReadBuffer(). A cet effet, si tu déclares une var FS : TFilestream, il suffira d'ajouter la ligne FS.Position:=LongueurDeLaPremiereLigne;
    tu peux aussi utiliser FS.Seek(LongueurDeLaPremiereLigne, soFromBeginning);
    Ceci suppose que tu connaisses la LongueurDeLaPremiereLigne.
    Mais si tu ne la connais pas une parade consisterait à lire à partir de FS.Position:=0 un nombre de caractères supérieur à la somme des deux premières lignes et en supposant qu'on appelle Lu la string correspondante, repérer la position de '#VER' avec
    PosVer:=pos('#VER',Lu);<- PosVer du type integer, suivi par :
    sNum:=copy(Lu,PosVer+5,2); <- sNum du type string
    sNum:=Trim(snum);
    et le nombre qui se trouve à droite de '#VER' est donc :
    MonNombre:=StrToInt(sNum);

    A+.

    P.S : Je suppose ici que que la partie numérique de #VER 14 ne dépasse pas 2 caractères
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Gilbert..

    Citation Envoyé par Gilbert Geyer Voir le message
    ....
    Mais si tu ne la connais pas une parade consisterait à lire à partir de FS.Position:=0 un nombre de caractères supérieur à la somme des deux premières lignes ...
    C'est justement ce que j'ai fais avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            SetLength(BufferString,NbCar);
            ReadBuffer(BufferString[1],NbCar);
    NbCar dépasse la deuxième ligne

    Citation Envoyé par Gilbert Geyer Voir le message
    ....
    P.S : Je suppose ici que que la partie numérique de #VER 14 ne dépasse pas 2 caractères
    C'est là mon problème, j'en suis pas sur à 100% d'où ma procédure :
    function StringInInteger(S:String): Integer;
    Qui fais en sorte de retourner les chiffres qui sont coller l'un a l'autre apres la position de "#VER"

    Par contre je pourrais eviter ma procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function PosEndMot(S:String; searchS: String): Integer;
    Avec ta proposition : PosVer:=pos('#VER',Lu);

    Mais je peux pas l'utiliser, en effet ma première ligne c'est '#COMP....' et si j'utilise Pos('#VER',Lu); il me retournera toujours 1 car la fonction pos recherche que le première caractère de subStr, mais cela tu pouvais pas le savoir (je parle de ma premiere ligne).
    Donc j'utilse ma fonction :
    function PosEndMot(S:String; searchS: String): Integer; qui me garantie de me retourner la bonne position.

    Je te remercie pour ta réflexion, qui me permet de confirmer la mienne, faut toujour demander au spécialiste leur façon de faire.

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    ... il me retournera toujours 1 car la fonction pos recherche que le première caractère de subStr, ...
    Gnéé et depuis quand mon cher Buzz ?

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Gnéé et depuis quand mon cher Buzz ?
    Depuis que je viens de le testé Le claude..., justement moi aussi je trouves bizard... mais c'est le cas.

    Bon evidement tu viens de me mettre un super doute... je reteste...


  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Gnéé et depuis quand mon cher Buzz ?
    Effectivement...

    enfin bref j'ai du me planter sur mes essais.

    Merci.

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    ...ta proposition : PosVer:=pos('#VER',Lu);
    ... je peux pas l'utiliser, en effet ma première ligne c'est '#COMP....' et si j'utilise Pos('#VER',Lu); il me retournera toujours 1 car la fonction pos recherche que le première caractère de subStr,
    ... décidément ton Delphi est vraiment bizarre en supposant que ton test ait été correct
    ... Pos renvoie la valeur d'index du premier caractère de la sous-chaîne spécifiée qui se trouve dans une chaîne et la sous-chaine ne peut s'y trouver que si tous les caractères de la sous-chaine y sont présents donc Pos ne peut se contenter de rechercher uniquement le premier caractère de la sous-chaine. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
              Lu:='xxxx#COMPoooooooooo#VER 14';
              PosVer:=pos('#VER',Lu);
              ShowMessage('i = '+IntToStr(i)); //Affiche i = 20
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @ Gilbert,

    Non t'inkiete c'est moi le fautif , (post juste au dessus).


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. déterminer la taille de memoire vive(RAM) avec java sur windows
    Par ahmed.j2ee dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 25/09/2009, 11h03
  2. Problème avec startsWith sur un String
    Par s-ehtp dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/08/2009, 01h45
  3. Erreur de compilation sur std::string avec Dev C++
    Par dada57 dans le forum Dev-C++
    Réponses: 4
    Dernier message: 20/03/2006, 18h06
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43

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