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

 Delphi Discussion :

Tfilestream Read Problème


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut Tfilestream Read Problème
    Bonjour

    J'ai un petit souci avec le read d'un Tfilestream. J'arrive à lire la longueur (WCA_DEST_LEN - image ci dessous). Mais lorsque je veux lire ma variable test (WCA_DEST). Lorsque je fais un showmessage, j'ai seulement en retour t et non test. Alors que je définie bien la longueur de WCA_DEST.

    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
     
    Var 
      WCA_File                                     : TStream;
      WCA_Dest                                   : Array of AnsiChar;
      WCA_DEST_LEN                            : integer;
     
    Begin 
     
    WCA_File:=TFileStream.Create('d:\1.tes',fmOpenRead);
    WCA_File.Position := 0;
    WCA_File.Read(WCA_DEST_LEN,4);
    Showmessage (IntToStr(WCA_DEST_LEN)); // Retourne 4
    Setlength(WCA_Dest,WCA_DEST_LEN);
    WCA_File.Read(WCA_Dest[0],WCA_DEST_LEN);
    Showmessage (WCA_Dest[0]); // Retourne t alors que normalement cela devrait retourner test
    End;
    Nom : WCA.jpg
Affichages : 168
Taille : 62,3 Ko

    Merci d'avance pour l'aide apportée.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ça fait 3 fois que tu poses une question pour le même problème au final...tu n'apprends donc rien ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    J'en suis désolé Paul TOTH. J'aimerai vraiment avoir ta facilité dans le codage, mais malheureusement pour moi je ne l'ai pas. J'ai regardé les réponses que tu m'avais posté avant de créer ce sujet. J'ai teste avec un String, AinsiString, mais aucun n'a fonctionné.

    J'y arrive lorsque je défini la taille de mon tableau dans les variables avec WCA_Dest : Array [0..3] of AnsiChar;. Mais comme le tableau n'aura jamais la même taille, c'est pour cela que je ne défini pas la taille et que j'utilise Setlength.

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    voici un exemple qui te donne une idée de la structure interne des chaines de caractères

    Nom : Capture d’écran 2021-06-13 204838.jpg
Affichages : 108
Taille : 63,2 Ko
    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
     
    unit uVisuOctets;
     
    interface
     
    uses
      sysutils ;
     
    function VisuXOctets(pDepart : pointer; nbOctet : integer = 64 ): string;
     
    implementation
     
    function VisuXOctets(pDepart : pointer; nbOctet : integer = 64 ): string;
    var
      pb1: ^byte;
      i1, i2 : integer ;
      st1 : string ;
    begin
      result := '' ;
      pb1 := pDepart ;
      for i1 := 1 to (nbOctet div 8) do
      begin
        st1 := '';
        for i2 := 1 to 8 do
        begin
          st1 := st1 + ' ' + intToHex(pb1^, 2);
          inc(pb1);
        end;
        result := result + st1 + #13#10
      end;
    end;
     
    end.
    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
     
    program ex02d_chainesChar;
     
    {$APPTYPE CONSOLE}
     
    uses
      uVisuOctets in 'uVisuOctets.pas';
     
    function Visu (stTitre : string ; p1 : pointer ; decalage : integer) : string ;
    var
      pb1 : ^byte ;
    begin
      pb1 := pointer(integer(p1)+decalage) ;
      result := '> '+stTitre+#13#10+VisuXOctets (pb1,24) ;
    end;
     
    var
      st10 : string[10] ;
      stAnsiString : ansiString ;
      stWideString : WideString ;
      stUnicodeString : UnicodeString ;
      pAnsiChar1 : pAnsiChar ;
      pWidechar1 : pWideChar ;
    begin
      st10 := 'ABCD' ;
      Writeln (Visu ('@st10(string[10])',@st10,0)) ;
      stAnsiString := 'ABCD' ;
      Writeln (Visu ('@AnsiString[1] - 8',@stAnsiString[1],-8)) ;
      stWideString := 'ABCD' ;
      Writeln (Visu ('@WideString[1] - 8',@stWideString[1],-8)) ;
      stUnicodeString := 'ABCD' ;
      Writeln (Visu ('@UnicodeString[1] - 8',@stUnicodeString[1],-8)) ;
      pAnsiChar1 := 'ABCD' ;
      Writeln (Visu ('pAnsiChar - 8',pAnsiChar1,-8)) ;
      pWidechar1 := 'ABCD' ;
      Writeln (Visu('pWidechar - 8',pWidechar1,-8)) ;
      readln
    end.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sinon la structure d'une chaine AVANT le début de la donnée, il y a la documentation : http://docwiki.embarcadero.com/Libra...eString.StrRec mais cela semble assez hors sujet puisque c'est juste [0] qui est utilisé au mauvais moment, ALWEBER, tu es allé un peu trop loin puisque c'est juste un problème de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Showmessage (WCA_Dest[0]);
    Il y a une confusion entre les passages et var buf non typé et en String, là c'est juste 't' qui est passé en paramètre
    Si [0] est requis pour Read c'est parce que l'on indique un emplacement mémoire dans lequel écrire le contenu lu depuis le Stream
    Showmessage prend un paramètre String donc cela n'a rien à voir, on peut passer directement WCA_Dest implicitement converti (ouais ça je sais plus toutes les nuances)
    En théorie, cela devrait ressembler à
    En fait, le choix du array of AnsiChar complique tout car cela demande de maitriser les conversion

    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
    var 
      WCA_File: TStream;
      WCA_Dest: AnsiString //Array of AnsiChar; // Voir aussi RawByteString
      WCA_DestLen: integer; 
    begin 
     
      WCA_File:=TFileStream.Create('d:\1.tes',fmOpenRead);
      try
        WCA_File.Position := 0;
        WCA_File.Read(WCA_DestLen, 4);
        //Showmessage(IntToStr(WCA_DestLen)); // Retourne 4
        Setlength(WCA_Dest, WCA_DestLen); // Crée une chaine de n caractères + 1 zéro terminal + StrRec (en préfix)
        WCA_File.Read(WCA_Dest[1], WCA_DestLen); // Indique que l'on lit dans le Stream un nombre n de caractères que l'on va mettre à l'emplacement de la chaine soit [1] pour le premier caractère qu'il faut assimiler à un pointeur\référence dans le cadre d'un "var buf" assez inhabituel faut l'avouer.
        Showmessage (String(WCA_Dest)); // Tout simplement un AnsiString casté en String
      finally
        WCA_File.Free();
      end;
    end;


    Pour la conversion de Array of AnsiChar en String (Unicode), je serais prudent en utilisant d'abord un transtypage en AnsiString puis en String
    StrPas pourrait faire ce boulot de transtypage en AnsiString explicite puis implicitement en String si on peut avoir un doute des conversions implicites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Showmessage(StrPas(@WCA_Dest[0]));
    Là c'est le pointeur sur WCA_Dest[0] que l'on utilise mais cela pourra bug car il manque le caractère zéro terminal pour que la fin d'une PChar soit trouvé (un SetLengh + 1 permettrait de l'avoir)



    Dans le cas d'une structure complexe, faut juste maitriser si il faut utiliser WideChar ou AnsiChar, vu le contenu Hexa, du Ansi sans aucun doute
    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

  6. #6
    Membre du Club
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup ShaiLeTroll pour les explications. J'ais déjà testé avec AnsiString mais il me manquait Showmessage (String(---)); que je ne connaissais pas. Je me forme en lisant ce que je trouve sur les divers forums.

    Merci aussi à ALWEBER, je regarderai tout cela à tête reposée.
    Et encore désolé Paul TOTH

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Duffer Voir le message
    Et encore désolé Paul TOTH
    c'est moi qui suis désolé pour toi, tu ne comprends pas ce que tu fais...c'est l'antithèse de ma façon de travailler.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [read] problème avec le buffer
    Par pitit777 dans le forum Réseau
    Réponses: 6
    Dernier message: 05/10/2006, 18h38
  2. Problème de read/write
    Par mylooz dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2005, 19h15
  3. [TFileStream] : LoadFromStream et read : incompatible ?
    Par jmdeffet dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2004, 10h30
  4. [TFileStream] Problème de lecture de string
    Par Pedro dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2004, 13h06

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