Re: Open / Create

Jean-Pierre Rosen <[email protected]> Sat, 30 May 2020 07:18:27 +0200
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Le 30/05/2020 à 04:30, Thomas De Contes a écrit :
> Bonjour :-)
> 
> 
> idéalement, j'aurais aimé économiser une condition sur l'existence du fichier, en écrivant sur une seule ligne de quoi :
Tu peux écrire tout ce que tu veux sur une seule ligne: il suffit d'en
faire une procédure...

Perso, j'ai la petite procédure suivante, ça fait des dizaines d'années
que je l'utilise:

   type Open_Mode is (Create, Append);
   -- Create: the file must not exist, unless Overwrite_Option
   -- Append: if the file exists, it is appended to, unless Overwrite_Option
   -- Failure of the existence condition raises Overwrite_Error
   Overwrite_Error : exception;
   procedure Safe_Open (File : in out Ada.Wide_Text_IO.File_Type;
                        Name : String;
                        Mode : Open_Mode;
                        Overwrite_Option : Boolean);

   procedure Safe_Open (File : in out Ada.Wide_Text_IO.File_Type;
                        Name : String;
                        Mode : Open_Mode;
                        Overwrite_Option : Boolean)
   is
      use Ada.Wide_Text_IO;
   begin
      if Overwrite_Option then
         Create (File, Out_File, Name);
      else
         begin
            case Mode is
               when Create =>
                  Open (File, Out_File, Name);

                  -- File exists
                  Close (File);
                  raise Overwrite_Error;
               when Append =>
                  Open (File, Append_File, Name);
                  -- OK if file exists
            end case;

         exception
            when Name_Error =>
               -- File does not exist (either mode)
               Create (File, Out_File, Name);
         end;
      end if;
   exception
      when Occur : others =>
         declare
            use Ada.Exceptions;
         begin
            Raise_Exception (Exception_Identity (Occur),
                             Message => "Error opening "
                                        & Name
                                        & " for "
                                        & Open_Mode'Image (Mode));
         end;
   end Safe_Open;

(NB: Ca utilise Wide_Text_IO parceque tout ASIS utilise des
Wide_Character; tu peux évidemment le changer en Text_IO)

> - créer le fichier s'il n'existe pas,
> - écrire à la suite, sans effacer le contenu, s'il existe
> 
> si je n'ai pas fait d'erreur,
> Ada.Sequential_IO.Open permet de créer un fichier,
> mais pas Ada.Text_IO.Open ni Ada.Streams.Stream_IO.Open ?
Non, tous les Open marchent pareil (il n'y a qu'une seule description
dans le manuel)

> je ne vois toujours pas l'utilité de Create (... Append_File ...), puisque c'est l'équivalent de Create (... Out_File ...)
> (donc ça ne peut pas se rendre utile dans mon cas)
Disons que c'est là parcequ'on ne l'a pas interdit, ça ne fait aucun mal.

-- 
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france