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 :

Stream vers un Array of String


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 591
    Billets dans le blog
    65
    Par défaut Stream vers un Array of String
    Bonjour
    Comment traiter ce contenu de stream (<bh:00> remplace 00)
    DATEC=20230914121613<bh:00>FORMAT=tif<bh:00>FILENAME=F2022-6045.tif<bh:00>FTDATEM=20230116091534<bh:00>FTDATEA=20230914121602<bh:00>FTDATEC=20230116083700<bh:00>
    je pensais mettre ceci dans un Array of String, mais la manipulation entre le stream et sa destination m'échappe

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour
    Comment traiter ce contenu de stream (<bh:00> remplace 00)

    je pensais mettre ceci dans un Array of String, mais la manipulation entre le stream et sa destination m'échappe
    je n'ai pas compris ton "(<bh:00> remplace 00)"...c'est une série de PChar ?

    ton stream c'est quel type de stream ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 591
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    c'est un TFileStream et le <bh:00> est là pour indiquer qu'il s'agit d'un octet de valeur 00

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Tu peux le voir comme un array de chaine à zéro terminal

    Sinon, il faut lire le fichier en buffer
    Regarde ReadLineRaw c'est la même chose en CRLF mais avec un 0x00 ça fonctionne aussi ce type d'algo, c'est juste une lecture binaire bufferisé (le ReadLn standard de Delphi fait pareil)

    pour résumer
    - Position du début de la chaine
    - Position du séparateur
    - Extraction entre les deux
    - Position du début de la chaine devient la position du séparateur + longueur du séparateur

    Cela boucle jusqu'au dernier Zéro
    A chaque boucle, faut gérer en plus la possibilité que la chaine souhaitée soit à cheval sur deux buffers ou sur plus encore (là faut relire généralement la section complète)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 591
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 591
    Billets dans le blog
    65
    Par défaut
    J'ai fait une analyse caractère par caractère qui 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
    21
    22
    23
    24
    25
    26
    27
    procedure getinfos(const FileName : String; const M : Tmemo);
    var FS : TFileStream;
        Pos, long : Integer;
        S : String;
        B : TArray<Byte>;
        C : Char;
    begin
      M.Lines.Clear;
      if (not FileExists(FileName)) then exit;
      pos :=GetSize(FileName); // pour obtenir la position de début des infos (6 infos de type xxxxxx=xxxxxxx)
      FS := TFileStream.create(FileName, fmOpenRead or fmShareDenyWrite);
      FS.Position:=pos;
      long:=FS.Size-pos; // infos de taille variable, situées à la fin du fichier  
      SetLength(B,long);
      FS.Read(B,Long);
      S:=EmptyStr;
      for var i := low(b) to high(b) do
       begin
         if (B[i]=0)
          then begin
           if not S.IsEmpty then m.Lines.Add(S);
           S:=EmptyStr;
          end
          else S:=S+Char(B[i]);
       end;
      FS.Free;
    end;
    mais je me demande s'il n'y a pas plus simple

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Plus simple, surement avec un fichier minuscule
    Chargement du fichier entier dans un RawByteString puis conversion vers String et recherche via System.Classes.ExtractStrings (non le 0x00 ça ne lui plaira pas)
    Le zéro comme séparateur, il faut tout de même se méfier de fonction à base de PChar qui pourrait ne pas comprendre que c'est un séparateur

    Regarde ExplodeLazy cela fait la même chose, idem, petit fichier chargé en entier
    J'avais écrit les versions binaires de ExplodeLazy et SearchString pour lire les fichiers DUMP, si je le retrouve ... d'ailleurs à peu de chose près, la découpe de plusieurs buffer consécutif reçu par Socket, cela y ressemble beaucoup

    Plus rapide mais moins lisible, certains aussi
    Mémoriser les positions c'est plus rapide qu'un concat en boucle mais FastMM te sauve en perf à ce sujet.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Convertir un cell array en string
    Par Sensib dans le forum MATLAB
    Réponses: 3
    Dernier message: 09/11/2006, 13h12
  2. [D6] Conversion Array of String en String
    Par wizdom dans le forum Delphi
    Réponses: 2
    Dernier message: 23/05/2006, 17h01
  3. [FreePascal] Array of string
    Par w0lf dans le forum Free Pascal
    Réponses: 3
    Dernier message: 21/01/2006, 18h46
  4. [gtkmm] Convertir un ustring vers un array
    Par alejandro dans le forum GTK+
    Réponses: 2
    Dernier message: 17/05/2005, 13h43
  5. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37

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