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 :

Questionnement File of encore une fois ;) [FAQ]


Sujet :

Delphi

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut Questionnement File of encore une fois ;)
    Bonjour,

    Dans le but de bien comprendre comment marche le File Of (histoire de faciliter des migrations éventuelles de mes codes vers du C ou du C++), je fais quelques essais.

    Et le moins que l'on puisse dire, c'est que c'est pas clair :

    Ainsi, j'ai une structure pour le moins basique avec un code tout aussi basique :

    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
    Type
      TContenu=Record
        Donnee: String[4];
        Donnee2: String[4];
        TypeDonnee: Integer;
      End;
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
     
    Var
      Fich: File Of TContenu;
      Contenu: TContenu;
     
    begin
      AssignFile(Fich,'toto.dat');
      Rewrite(Fich);
      Contenu.TypeDonnee:=1;
      Contenu.Donnee:='TOTO';
      Contenu.Donnee2:='TITI';
      Write(Fich,Contenu);
      CloseFile(Fich);
    end;
    Je m'attends donc, dans ce cas à avoir, dans mon fichier toto.dat :
    - Une chaine de caractère de longueur 4 (taille max définie concernant Donnee) précédée de sa longueur effective (04 dans notre cas)
    -> C'est ce que j'ai
    - Une chaine de caractère de longueur 4 (taille max définie concernant Donnee2) précédée de sa longueur effective (04 dans notre cas)
    -> Ben non ! J'ai bien 04 avec les code ASCII de TITI mais on me rajoute 2 caractères de remplissage
    - Mon integer codé sur 4 caractère 01 00 00 00
    -> Ok, c'est ce que j'ai...

    Alors pourquoi il y a deux caractères de remplissage ne correspondant ni à ma longueur max ni à ma longueur effective définie ?

    Cela voudrait-il dire qu'une chaine de caractère est stockée dans le fichier avec une longueur multiple du plus long type stocké ? (Mon integer stocké sur 4 caractères dans mon cas).

    Cela servirait-il à avoir des données placées à des places dépendantes de la longueur max du type de données ou y'aurait-il un système qui m'aurait échappé ?

    Merci d'éclairer ma lanterne parce que là, je suis un peu perdu

    D'avance, je vous en remercie.

    Cordialement,

    James.

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    2 caractères de remplissage
    Quel est leur code hexa ? /00 ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut Code
    Quel est leur code hexa ? /00 ?
    Ben non justement :

    10 00

    J'avais fait d'autres essais cet après midi et les caractères étaient encore différents de ceux là...

    Je viens de changer le code pour mettre des limites différentes :

    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
    Type
      TContenu=Record
        Donnee: String[8];
        Donnee2: String[8];
        TypeDonnee: Integer;
      End;
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
     
    Var
      Fich: File Of TContenu;
      Contenu: TContenu;
     
    begin
      AssignFile(Fich,'toto.dat');
      Rewrite(Fich);
      Contenu.TypeDonnee:=1;
      Contenu.Donnee:='TOTO';
      Contenu.Donnee2:='TITI';
      Write(Fich,Contenu);
      CloseFile(Fich);
    end;
    Ca me rajoute des caractères bidons après le TOTO et le TITI : c'est normal car j'ai défini une longueur de 8 alors que j'ai entré que 4 caractères : ok

    ...sauf que derrière le 8e caractère de TITI, j'ai à nouveau 2 caractères (05 00 ce coup ci !) de remplissage avant de voir mon integer (01 00 00 00) !

    Marrant non ?

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut !

    Il doit y avoir du remplissage, comme tu le supposes, car celui-ci disparait avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type
      TContenu = packed Record
      ...
    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut Ben la voilà la réponse ;)
    Merci beaucoup !

    Et c'est dans l'aide de Delphi qu'on apprend (un F1 sur packed)

    Par défaut, les valeurs d'un type structuré sont alignées sur des limites de mot ou de double-mot afin de disposer d'un accès plus rapide.
    Et c'est tout à fait ce que je voulais confirmer !

    Merci beaucoup !

    James.

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

Discussions similaires

  1. encore une fois j'ai besoin d'aide SVP
    Par ramime dans le forum Langage SQL
    Réponses: 12
    Dernier message: 25/03/2009, 16h30
  2. headers already sent by ..encore une fois !
    Par marveljojo75 dans le forum Langage
    Réponses: 2
    Dernier message: 05/09/2008, 19h02
  3. Hebergement + GD (encore une fois)
    Par legillou dans le forum Langage
    Réponses: 6
    Dernier message: 28/07/2006, 13h19

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