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 :

Quelle est mon erreur dans cette syntaxe


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 Quelle est mon erreur dans cette syntaxe
    Bonjour à tous,

    J'utilise cette fonction :

    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
    function LectureFichierSteDat(Chemin : String) : String;
    Var
      F: TextFile;
    begin
      Try
        Try
          AssignFile(F,Chemin);
          //Lire la premiere ligne AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt');
          Reset(F); //Ouvre le fichier sans le modifier
          Readln(F,result);
          //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
        Except
          On EInOutError do
          Begin
            Result := '< inconnu >';
            raise;
          end;
        end;
      Finally
        CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
      end;
    end;
    Qui me retourne la première ligne d'un fichier.

    Mais si le fichier que j'envoi n'existe pas, j'ai un beau message I/O error, normal, mais je voudrais évité ce message, apparement le bloc Except ne joue pas son rôle ?

    Pouvez-vous m'expliquer ?

  2. #2
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Bonjour,
    Si mes savoirs sont bons : si ton fichier n'existe pas, c'eat au Reset(F) que l'erreur devrait être générée.
    Il y a un moyen de le savoir en plaçant cette instruction hors génération d'erreur et en testant la variable IOResult...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {I-}
    Reset(F);
    {I+}
     
    If IOResult=0 then begin
    ....
    ....
    end
    else begin
       // traitement erreur e/s fichier non trouvé
    end;
    Mais c'est pas moderne comme démarche

  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
    Salut,

    Effectivement c'est au reset(F) que j'ai l'erreur, mais ta proposition ne change pas le probleme, j'ai toujours une erreur soulevée.

    Une autre solution ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    C'est sur le Reset que la première exception est générée, mais une deuxième survient sur CloseFile puisque le fichier n'est pas ouvert. C'est celle-là que tu vois .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Var
      F: TextFile;
    begin
      AssignFile(F,Chemin);
     
      try
        Reset(F);
        Readln(F,result);
        CloseFile(F);
      except
        Result := '< inconnu >';
      end;
    end;

  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
    Citation Envoyé par Andnotor Voir le message
    C'est sur le Reset que la première exception est générée, mais une deuxième survient sur CloseFile puisque le fichier n'est pas ouvert. C'est celle-là que tu vois .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Var
      F: TextFile;
    begin
      AssignFile(F,Chemin);
     
      try
        Reset(F);
        Readln(F,result);
        CloseFile(F);
      except
        Result := '< inconnu >';
      end;
    end;

    Salut AndNotOr,

    Je viens de tester ta proposition, elle me génère toujours l'erreur et ne me retourne pas le result du except.

    Que dois-je faire ?

  6. #6
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 342
    Points : 394
    Points
    394
    Par défaut Fonction FileExists
    Teste l'existance du fichier !

    essaie quelque chose comme :

    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
    AssignFile(AFile, f);
    FileMode := fmOpenRead;
    If FileExists(f) then 
    begin
       // ouverture
       Reset(AFile);
     
       // traitement du fichier
       // en général avec un 
       While not Eof(AFile) do 
         begin
         Read(AFile, ARecord);
         ...
         end; 
     
        ...
     
       // puis fermeture
       CloseFile(f);
    end;

  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
    Salut,

    Archonte : Effectivement en contournant le probleme par un test de présence du fichier j'évite une error 103 ou 104. Je te remercie.

    Je voulais éviter de passer par ce test, pour comprendre mieux mon problemes. Mes apparement apres plusieurs test différent je ne peux y échaper.

    Voil ma procédure finale (j'ai un peu modifié) :

    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
    function LectureFichierSteDat(Chemin : String; Ligne: Integer) : String;
    Var
      F: TextFile;
      i: Integer;
    begin
      if FileExists(Chemin) then
      Begin
        Try
          AssignFile(F,Chemin);
          Try
            //Lire la premiere ligne AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt');
            Reset(F); //Ouvre le fichier sans le modifier
            For i:=0 to Ligne do
              Readln(F,result) //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
          Except
            Result := '< inconnu >';
          end;
        Finally
          CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
        end;
      end
      Else Result := '< inconnu >';
    end;

    Merci à vous tous.


  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Par défaut, Reset va ouvrir le fichier en lecture/écriture et tu auras la même erreur si le fichier n'est pas accessible en écriture .

    Ca fonctionnera sous XP mais plus sous Vista suivant le répertoire.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut pourquoi <> sous Vista
    J'interviens car subitement le message d'Andnotor m'affole : qu'est-ce qui va se produire sous Vista?
    Merci de la réponse

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Sous Vista le contrôle utilisateur sur les droits d'accès est beaucoup plus sévère (pour ne pas dire ch**** ). De fait même en administrateur de la machine certains répertoires jugés sensibles (typiquement Program Files) ne sont pas accessibles en écriture et nécessite une "élévation" des privilèges pour que cela fonctionne.

    Un exécutable lancé sans élévations de privilèges et qui essayes dans un répertoire sensible plantera inéluctablement faute de droit d'accès.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Ajoute un FileMode := 0 après AssignFile pour être en lecture seule.

    ps: Ce CloseFile n'est toujours pas à la bonne place .

  12. #12
    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 Andnotor Voir le message
    Ajoute un FileMode := 0 après AssignFile pour être en lecture seule.

    ps: Ce CloseFile n'est toujours pas à la bonne place .
    Sa c'est pas bête !!!


  13. #13
    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
    Et comme cela c'est mieux ?

    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
    function LectureFichierSteDat(Chemin : String; Ligne: Integer) : String;
    Var
      F: TextFile;
      i: Integer;
    begin
      if FileExists(Chemin) then
      Begin
        AssignFile(F,Chemin);
        FileMode := 0;
        Try
          Try
            //Lire la premiere ligne AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt');
            Reset(F); //Ouvre le fichier sans le modifier
            For i:=0 to Ligne do
              Readln(F,result) //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
          Except
            Result := '< inconnu >';
          end;
        Finally
          if Assigned(F) then CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
        end;
      end
      Else Result := '< inconnu >';
    end;

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Non, c'est pas mieux!

    Ce que tu n'as pas compris est qu'AssigneFile ne fait qu'associer un fichier à une variable, mais n'ouvre pas le fichier!

    L'ouverture se fait par Append, Reset ou Rewrite. Ce n'est que si l'une de ces fonctions est appelée avec succès que CloseFile doit être invoqué. CloseFile doit donc être dans le même bloc d'exception que Reset (voir mon premier post).

    FileExists limite déjà le risque d'erreur, mais ça ne veux pas dire que tu auras les droits suffisants pour l'ouvrir

    Quant à if Assigned(F), le test sera toujours positif, F à bien été assigné même si l'ouverture a échouée !

  15. #15
    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 Andnotor Voir le message
    Non, c'est pas mieux!

    Ce que tu n'as pas compris est qu'AssigneFile ne fait qu'associer un fichier à une variable, mais n'ouvre pas le fichier!

    L'ouverture se fait par Append, Reset ou Rewrite. Ce n'est que si l'une de ces fonctions est appelée avec succès que CloseFile doit être invoqué. CloseFile doit donc être dans le même bloc d'exception que Reset (voir mon premier post).

    FileExists limite déjà le risque d'erreur, mais ça ne veux pas dire que tu auras les droits suffisants pour l'ouvrir

    Quant à if Assigned(F), le test sera toujours positif, F à bien été assigné même si l'ouverture a échouée !
    Ok je comprends ce que tu veux dire.
    D'ailleur le assigned(F) me génère une erreur, je l'ai retirer.

    Mais à ce que je sache le finally sera quoi qu'il arrive TOUJOURS exécuté, tandis que si je place mon closefile apres la boucle for il ne sera jamais executer en cas d'erreur.

    non ?

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Et c'est le but .

    Si Reset échoue, inutile d'appeler CloseFile, le fichier n'est pas ouvert. (Sinon exception sur une tentative de fermeture d'un fichier pas ouvert, cf. un de tes posts précédents)

  17. #17
    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 Andnotor Voir le message
    Et c'est le but .

    Si Reset échoue, inutile d'appeler CloseFile, le fichier n'est pas ouvert. (Sinon exception sur une tentative de fermeture d'un fichier pas ouvert, cf. un de tes posts précédents)
    Oui effectivement... que suis-je bête.

    Je pige mieux.

    j'ai fais cela alors :

    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
    function LectureFichierSteDat(Chemin : String; Ligne: Integer) : String;
    Var
      F: TextFile;
      i: Integer;
    begin
      if FileExists(Chemin) then
      Begin
        AssignFile(F,Chemin);
        FileMode := 0;
        Try
          //Lire la premiere ligne AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt');
          Reset(F); //Ouvre le fichier sans le modifier
          For i:=0 to Ligne do
            Readln(F,result) //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
     
          CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
        Except
          Result := '< inconnu >';
        end;
      end
      Else Result := '< inconnu >';
    end;

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    C'est ça .

    Il y a cependant encore cette boucle sur Ligne qui me dérange, je n'en vois pas l'utilité puisqu'elle ecrase toujours Result et la lecture pourrait dépasser la limite du fichier.

    Si le but est de lire la Nième ligne (sans savoir si elle existe vraiment)

    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
      if FileExists(Chemin) then
      Begin
        AssignFile(F,Chemin);
        FileMode := 0;
        Try
          //Lire la premiere ligne AssignFile(F,ExtractFilePath(Application.ExeName)+'test.txt');
          Reset(F); //Ouvre le fichier sans le modifier
          try
            For i:=0 to Ligne do  //ou Ligne-1 ?!?
              Readln(F,result) //Lit une ligne du fichier texte jusqu'au prochain saut de ligne
          finally 
            CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
          end;
        Except
          Result := '< inconnu >';
        end;
    Ou boucler sur EOF comme proposé par Archonte.

  19. #19
    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 Andy... (faut dormir un peu... comme moi lolol)

    En fait je connais le numéro de ligne et c'est vrai que je pourrais tombé sur eof et sur pas trouvé.

    Je vais voir.

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

Discussions similaires

  1. Où est mon erreur dans la boucle Do-While ?
    Par Novice72 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/06/2015, 20h28
  2. Débutant, quelle est mon erreur ?
    Par vladimire dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/05/2009, 23h43
  3. [STR912 ARM9] Quelle est l'erreur dans mon prog. ASM ?
    Par maczdecarpate dans le forum Autres architectures
    Réponses: 3
    Dernier message: 05/08/2007, 02h27
  4. ou est l'erreur dans cette syntaxe svp ?
    Par delavega dans le forum ASP
    Réponses: 2
    Dernier message: 29/05/2007, 13h03
  5. Réponses: 5
    Dernier message: 14/05/2006, 22h41

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