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 :

lire et ecrire un fichier binaire


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut lire et ecrire un fichier binaire
    Bonjour
    J'ai crée un fichier binaire pour enregistrer les paramètres de mon application:
    uniquement l'état de différents checkbox pour l'instant.
    Hors pour l'instant la lecture et l'écriture fonctionnent correctement, mais lorsque je ferme et je réouvre mon application après avoir effectué une écriture de mes paramètres vers le fichier binaire la lecture ne semble pas fonctionner.
    je précise que j'ai vérifier mon fichier à l'aide d'ultraedit et cela semble cohérant
    Pourquoi elle ne pose pas de problème lors de la première session? une idée ????
    Cordialement
    lionel

  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
    Citation Envoyé par Ytech123 Voir le message
    une idée ????
    Tu as un problème dans le code.....
    "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
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    c'est très gentil de répondre à mon problème mais j'avais déjà dans l'idée que le problème était par là.
    Je ne demande pas une solution clé en main mais seulement une piste vers laquelle concentrer mes recherches:
    le problème peu plutôt ce situer à la lecture , à l'écriture ?
    que se passe t'il avec mon fichier entre le moment où je ferme mon application et le moment où je l'ouvre, sachant que après vérification mon fichier est identique.
    je rappelle que la lecture ne pose pas de problème lorsque qu'elle est effectué dans la même session que l'écriture, mais que toute les variables qui constituent ce fichier semble être "false" lors de la lecture lors d'un second lancement de l'application.
    quels éléments supplémentaires puis-je vous fournir pour vous aider à m'aider.
    Cordialement,

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu pourrais nous fournir un peu de code. Par exemple ce qu'il se passe lors de la fermeture de ton application et lors de son ouverture... Une fois le fichier écrit, tu le fermes bien ?

    A vrai dire, sans code, c'est pas facile de naviguer ...
    Cordialement

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    voici quelques parties du code
    la procédure à la création de la fenêtre
    la procédure d'écriture
    la procédure de lecture
    la procédure à fermeture de la fenêtre
    et toute l'unité création du fichier qui est une adaptation de la méthode enseigné dans le tuto de Didier Beaulieu
    j'espere que je n'en n'est pas trop mis et que mon erreur n'est pas trop bête

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
     
    { ================== initialisation des variables ==========================}
    procedure Tfmprinc.FormCreate(Sender: TObject);
    begin
    fonctionencours := false;
    connection := false;
    a:=0; {variable de la valeur des sorties}
    timer3.Enabled:=false;
    GB_Sdigital.Visible:= true;
    GB_eanalog.Visible:= false;
    groupbox1.Visible:= false;
     
    led1:= tswitchled.Create(self);
    with led1 do
    begin
    left := 120;
    top := 100;
    oncolor := lcgreen;
    offcolor :=lcblack;
    ledstate :=lsoff;
    parent := gbconnect
    end;
     
    end;
    {============================ lecture des parametres ===============}
     
     
    procedure Tfmprinc.Button1Click(Sender: TObject);
    begin
    lirePrapport( varparam) ;
    with varparam do
    begin
    if P_rdebut then showmessage('Rdebut');
     
    Frapport.cbdebut.checked := P_Rdebut;
    Frapport.cbfin.checked := p_Rfin;
    Frapport.cbcode.checked := P_Rcode;
    Frapport.cbentree.checked := P_Rentree;
    Frapport.cbmail.checked := P_Rmail;
    end;
    end;
    {============================= enregistrement des parametres ================}
    procedure Tfmprinc.Button2Click(Sender: TObject);
    begin
    with varparam do
    begin
    P_Rdebut := Frapport.cbdebut.checked ;
    p_Rfin := Frapport.cbfin.checked ;
    P_Rcode :=Frapport.cbcode.checked ;
    P_Rentree :=Frapport.cbentree.checked ;
    P_Rmail := Frapport.cbmail.checked ;
    end;
    ecrirePrapport( varparam) ;
    end;
    {================== deconnection à la fermeture =========================}
    procedure Tfmprinc.FormDestroy(Sender: TObject);
    begin
    Closedevice;
    end;
     
     
     
    unit parametres;
     
    interface
    uses
    alerte,rapport,sysutils,dialogs,k8055;
    type
    Tparametres = record
    P_Rmail,P_Rdebut,P_Rfin,P_Rentree,P_Rcode,P_ActiveRapport,P_Arme: boolean;
    P_CheminRapport,Pexp,Pdest,Psmtp,Pmesage : string;
    end;
     
    function lirePrapport(param : Tparametres):boolean;
    function ecrirePrapport(param : Tparametres):boolean;
     
    const
    ParamFichier = 'c:\CYT\parametres.dat';
    ParamDossier ='c:\CYT';
    var
    varParam: tparametres;
    Fparam : File;
    nbtrans,verifNbOctet:integer;
    implementation
     
     
    {================= ouvrir fichier ==============================}
    function ouvrirfichier ( var F: file; NomFichier : string): boolean;
    {vrai si ouverture sans probleme}
    begin
    {$i-}
    Assignfile(F,nomfichier); // ouverture
    if fileexists (nomfichier) then reset (F,1)
    else rewrite (f,1);
    result := ( IOResult =0);
    if not result then
    begin
    exit;
    showmessage ('Echec de l''ouverture du fichier parametres');
    end;
    seek(F,0); // vidage du fichier
    {$i+}
    end;
     
    {====================== ferme fichier ================================}
    Function FermeFichier ( var F : File) : boolean;
    begin
    {$i-}
    CloseFile (F);//fermeture
    result := (IOResult = 0 );
    {$i+}
    if not Result then
    begin
    showmessage ( ' echec de la fermeture du fichier parametres');
    Exit;
    end;
    end;
     
    {========================== ecrire element ========================}
    Function EcrireElem ( var F : file ; Var elem ; nboctets : integer ) : boolean;
    begin
    {$i-}
    blockwrite (F,elem, nboctets, nbtrans);
    result := (IOResult = 0 ) and ( nbtrans = nbOctets);
    {$i+}
    verifnboctet := nboctets;
    end;
     
    {============================= lire element =============================}
    Function LireElem ( var F : file ; Var elem ; nboctets : integer ) : boolean;
    begin
    {$i-}
    BlockRead (F,elem, nboctets, nbtrans);
    result := (IOResult = 0 ) and ( nbtrans = nbOctets);
    {$i+}
    verifnboctet := nboctets;
    end;
    {============================ sortie ===============================}
    procedure sortie( pourquoi : string);
    begin
    showmessage ( 'erreur : ' + pourquoi );
    exit;
    end;
     
    {=========================== ecrire parametres rapport =====================}
    function ecrirePrapport(param : Tparametres):boolean;
    begin
    result := false ;
    if not ouvrirfichier(fparam,paramfichier) then
    begin
    exit;
    showmessage ('echec à l''ouverture du fichier pour ecrire les parametres ' +
    'du rapport');
    end;
    {$I-}
    truncate (fparam);
    if IOResult <> 0 then
    begin
    exit;
    Showmessage ( ' echec à l''ecriture des parametres du rapport');
    end;
    {$I-}
    with param do
    begin
    if not ecrireelem( Fparam,P_Rdebut, sizeof(P_Rdebut)) then sortie ( 'ecriture P_debut');
    if not ecrireelem( Fparam,P_Rfin, sizeof(P_Rfin)) then sortie ( 'ecriture P_fin');
    if not ecrireelem( Fparam,P_Rcode, sizeof(P_Rcode)) then sortie ( 'ecriture P_code');
    if not ecrireelem( Fparam,P_Rentree, sizeof(P_Rentree)) then sortie ( 'ecriture P_entreé');
    if not ecrireelem( Fparam,P_Rmail, sizeof(P_Rmail)) then sortie ( 'ecriture P_mail');
    end;
    result:= fermefichier( fparam);
     
    end;
    {=========================== lire parametres rapport =====================}
    function lirePrapport(param : Tparametres):boolean;
    begin
    result := false ;
    if not ouvrirfichier(fparam,paramfichier) then
    begin
    exit;
    showmessage ('echec à l''ouverture du fichier pour ecrire les parametres ' +
    'du rapport');
    end;
     
    with param do
    begin
    if not lireelem( Fparam,P_Rdebut, sizeof(P_Rdebut)) then sortie ( 'ecriture P_debut');
    if not lireelem( Fparam,P_Rfin, sizeof(P_Rfin)) then sortie ( 'ecriture P_fin');
    if not lireelem( Fparam,P_Rcode, sizeof(P_Rcode)) then sortie ( 'ecriture P_code');
    if not lireelem( Fparam,P_Rentree, sizeof(P_Rentree)) then sortie ( 'ecriture P_entreé');
    if not lireelem( Fparam,P_Rmail, sizeof(P_Rmail)) then sortie ( 'ecriture P_mail');
    end;
    result:= fermefichier( fparam);
     
    end;
     
     
    end.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Il y a plusieurs endroits dans ton code où tu as écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [erreur] then
    begin
    exit;
    ShowMessage( ['message d''erreur'] );
    end;
    Un tel code ne t'affichera jamais le message d'erreur : le "exit" interromp la fonction avant que tu n'appelles ShowMessage.

    Remet les lignes dans le bon ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowMessage( ['message d''erreur'] );
    exit;
    relance ton programme, et dis-nous si il ne détecte pas des problèmes à la lecture ou l'écriture.

    *LeGEC*
    *LeGEC*

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    effectivement mes messages d'erreur ne pouvaient s'afficher.
    mais malgré ces modifs, le problème demeure.
    lecture et affectation des valeurs des variables contenu dans le fichiers vers les checkbox sans problème tant que je ne relance pas mon application.

  8. #8
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Et le débogueur ????

    Ne t'indique-t-il pas sur quel ligne tu plantes ?

    Lorsque tu parles de relancer le programme il s'agit bien de l'application et non pas d'une fiche de celle-ci ?
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Non aucune erreur ni à la compilation, ni à la lecture, ni à l'écriture.

    je recapitule :

    j'ai 5 cases à cocher dont je veux enregistrer l'etat avant de fermer mon application afin de pouvoir les retrouver dans le meme etat lors d'une prochaine ouverture.

    Au premier lancement de l'application je coche les cases et j'ecris dans le fichier leur etat, je verifie avec ultraedit le fichier:
    00000000h: 01 01 01 01 01 ;.....
    pour tester je déchoche les cases puis je fais une lecture et là mes cases je recoche sans probleme.
    je ferme l'application

    je verifie le fichier avec ultraedit
    00000000h: 01 01 01 01 01 ;.....

    je relance l'application et j'effectue une lecture et là rien ne se passe pas d'erreur et pas de cases cochées ????

    je verifie le fichier avec ultraedit
    00000000h: 01 01 01 01 01 ;.....
    ????????????????????

  10. #10
    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
    Alors, enfin du code...

    Je pense que le record global varParam: tparametres; n'est pas alimenté...

    En effet, quand tu appelles la fonction de lecture, l'appel est correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lirePrapport( varparam) ;
    car la fonction attend bien un tparametres en argument (au passage: pourquoi renvoyer un booléen que tu ne testes pas ???)

    Par contre, dans la fonction de lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function lirePrapport(param : Tparametres):boolean;
    begin
    .....
    with param do
    begin
    if not lireelem( Fparam,P_Rdebut, etc....
    les modifications sur le param n'ont qu'une portée locale.

    Si tu veux alimenter le param (global) fourni en argument, il faut autoriser la fonction à le modifier, et donc la prototyper ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function lirePrapport(VAR param : Tparametres):boolean;
    "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

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    ok maintenant ça fonctionne
    j'ai pas vraiment compris la différence entre ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function lirePrapport(VAR param : Tparametres):boolean;
    et ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function lirePrapport(param : Tparametres):boolean;
    si c'est pas trop demandé j'aimerais des précisions à ce sujet

    (au passage: pourquoi renvoyer un booléen que tu ne testes pas ???)
    il est vrai qu'il ne sert à rien d'enregistrer une variable "false" je vais modifier ça

    merci de m'avoir permis d'avancer

  12. #12
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    ,
    un petit tour dans l'aide et tu aurais trouvé tout seul
    Citation Envoyé par Aide delphi
    Paramètres valeur et paramètres variables
    La plupart des paramètres sont des paramètres valeur (c'est le cas par défaut) ou des paramètres variables (var
    ). Les paramètres valeur sont transmis par valeur alors que les paramètres variables sont transmis par adresse. Pour saisir la différence, examinez les fonctions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function DoubleParValeur(X: Integer): Integer;     // X est un paramètre valeur
    begin
      X := X * 2;
      Result := X;
    end;
    function DoubleParAdresse(var X: Integer): Integer;   // X est un paramètre variable
    begin
      X := X * 2;
      Result := X;
    end;
    Ces deux fonctions renvoient le même résultat, mais seule la seconde (DoubleParAdresse) peut modifier la valeur de la variable qui lui est transmise. Si les deux fonctions sont appelées de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      I, J, V, W: Integer;
    begin
      I := 4;
      V := 4;
      J := DoubleParValeur(I);      // J = 8, I = 4
      W := DoubleParAdresse(V);     // W = 8, V = 8
    end;
    Après l'exécution de ce code, la variable I, transmise à DoubleParValeur, garde la même valeur que celle qui lui a été affectée initialement. Mais la valeur de la variable V, qui a été transmise à DoubleParAdresse est, elle, modifiée.

    Un paramètre valeur se comporte comme une variable locale qui est initialisée avec la valeur transmise à l'appel de la routine. Si vous transmettez une variable comme paramètre valeur, la routine en crée une copie et les modifications apportées à la copie sont sans effet sur la variable d'origine et sont perdues quand l'exécution du programme revient à l'appel de la routine.

    Un paramètre variable se comporte, lui, comme un pointeur et non comme une copie. Les modifications apportées aux paramètres dans le corps de la routine sont conservées lorsque l'exécution du programme revient à l'appel de la routine et que le nom du paramètre est hors de portée.

    Il n'y a pas de copie effectuée même quand la même variable est transmise à plusieurs paramètres var. Ce comportement est mis en évidence par l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure AjouterUn(var X, Y: Integer);
    begin
      X := X + 1;
      Y := Y + 1;
    end;
    var I: Integer;
    begin
      I := 1;
      AjouterUn(I, I);
    end;
    Après l'exécution de ce code, I a la valeur 3.

    Si la déclaration d'une routine spécifie un paramètre var, vous devez, lors de l'appel de la routine, lui transmettre une expression affectable (c'est-à-dire une variable, une constante typée (dans l'état {$J+}), un pointeur déréférencé, un champ, une variable indicée). Ainsi, dans l'exemple ci-dessus, DoubleParAdresse(7) provoque une erreur de compilation alors que DoubleParValeur(7) est légal.

    Les indices et les pointeurs de référence transmis dans des paramètres var, par exemple DoubleParAdresse(MonTableau[I]), ne sont évalués qu'une seule fois, avant l'exécution de la routine.

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    merci pour tout
    je pense avoir tout les éléments pour avancer dans mon application et surtout dans la compréhension

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/08/2008, 01h39
  2. Lire et ecrire un fichier excel avec perl
    Par Bengeldim dans le forum Langage
    Réponses: 3
    Dernier message: 22/07/2008, 17h23
  3. Ecrire un fichier binaire en C++
    Par anas.eh dans le forum C++
    Réponses: 2
    Dernier message: 03/09/2007, 15h32
  4. Lire et ecrire dans fichier excel en c++
    Par FidoDido® dans le forum C++
    Réponses: 8
    Dernier message: 09/07/2007, 09h16
  5. Ecrire un fichier binaire avec des caractères
    Par stokastik dans le forum C
    Réponses: 18
    Dernier message: 17/08/2006, 17h40

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