2010-07-03 7 views
1

J'apprends Ada et j'ai besoin de quelques clarifications sur les opérations de fichiers. J'ai juste un type: float et je dois créer 2 fichiers qui vont stocker des valeurs flottantes (avec l'opération d'ajout). Donc j'instancie un paquetage pour le type float et ensuite je déclare 2 variables de fichier X_File et Y_File. Ensuite, je mets des exceptions au cas où les fichiers n'existent pas déjà. J'ai deux exceptions distinctes pour chaque fichier xvalues.dat et yvalues.dat. Opération de fichier Ada: instanciation et exception

WITH Ada.Text_IO; 
WITH Ada.Sequential_IO; 

PROCEDURE TestWrite6 IS 
    PACKAGE Seq_Float_IO IS NEW Ada.Sequential_IO (Element_Type => Float); 
    X_File : Seq_Float_IO.File_Type; 
    Y_File : Seq_Float_IO.File_Type; 


BEGIN 

Seq_Float_IO.Open (File => X_File, Mode => Seq_Float_IO.Append_File, 
Name => "xvalues.dat"); 
exception 
when Seq_Float_IO.Name_Error => 
    Seq_Float_IO.Create (File => X_File, Mode => Seq_Float_IO.Out_File, 
    Name => "xvalues.dat"); 

Seq_Float_IO.Open (File => Y_File, Mode => Seq_Float_IO.Append_File, 
Name => "yvalues.dat"); 
exception 
when Seq_Float_IO.Name_Error => 
    Seq_Float_IO.Create (File => Y_File, Mode => Seq_Float_IO.Out_File, 
    Name => "yvalues.dat"); 

END TestWrite6; 
Maintenant, sur la compilation, je reçois le message d'erreur:

16. 
17. Seq_Float_IO.Open (File => Y_File, Mode => Seq_Float_IO.Append_File, Name => "xvalues.dat"); 
18. exception 
     | 
    >>> exception handler not permitted here 

19. when Seq_Float_IO.Name_Error => 

Il semble que je peux avoir une exception pour le xvalues.dat et non pas une seconde pour yvalues.dat. Qu'est-ce que je fais mal?

Merci beaucoup ...


Quelques modifications: écrire une procédure générale pour ouvrir et ajouter des valeurs dans un fichier:

WITH Ada.Sequential_IO; 
WITH Ada.Float_Text_IO; 

PROCEDURE TEST is 

package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Float); 
X_File : Seq_Float_IO.File_Type; 


procedure Open_Data(File : in out Seq_Float_IO.File_Type; 
Name : in String) is 

BEGIN 

    begin 
     Seq_Float_IO.Open (
     File => File, 
     Mode => Seq_Float_IO.Append_File, 
     Name => ); 
    exception 
     when Seq_Float_IO.Name_Error => 
     Seq_Float_IO.Create (
      File => File, 
      Mode => Seq_Float_IO.Out_File, 
      Name => ); 
    end; 

END Open_Data; 


x  : CONSTANT Float := 2.0; 


BEGIN --main program 
    Open_Data(X_File, "xvalues.dat"); 
    Seq_Float_IO.Write(File => X_File,Item => x); 

    Seq_Float_IO.Close(File => X_File); 
END TEST; 

Dans la procédure Open_Data. J'ai laissé les 2 champs pour Name => blank car je ne sais pas quoi mettre dedans.

Et j'ai aussi mis Fichier => Fichier ... cela ne semble pas correct !!!

Répondre

1

Un sequence of statements donné ne peut avoir qu'un ensemble de exception handlers. Une approche consiste à envelopper chaque séquence traitée d'instructions dans son propre block, comme indiqué ci-dessous. En notant les instructions communes dans chaque bloc, pensez à écrire un sous-programme court qui peut ouvrir ou créer un fichier par son nom et gérer les exceptions qui surviennent.

with Ada.Sequential_IO; 

procedure TestWrite6 is 
    package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Float); 
    X_File : Seq_Float_IO.File_Type; 
    Y_File : Seq_Float_IO.File_Type; 

begin 
    begin 
     Seq_Float_IO.Open (
     File => X_File, 
     Mode => Seq_Float_IO.Append_File, 
     Name => "xvalues.dat"); 
    exception 
     when Seq_Float_IO.Name_Error => 
     Seq_Float_IO.Create (
      File => X_File, 
      Mode => Seq_Float_IO.Out_File, 
      Name => "xvalues.dat"); 
    end; 
    begin 
     Seq_Float_IO.Open (
     File => Y_File, 
     Mode => Seq_Float_IO.Append_File, 
     Name => "yvalues.dat"); 
    exception 
     when Seq_Float_IO.Name_Error => 
     Seq_Float_IO.Create (
      File => Y_File, 
      Mode => Seq_Float_IO.Out_File, 
      Name => "yvalues.dat"); 
    end; 
end TestWrite6; 
+0

Merci. Ça marche! Bon à savoir sur la déclaration de bloc. – yCalleecharan

+0

Oui, je vais également étudier comment créer un sous-programme ou une procédure appropriée. – yCalleecharan

+0

Excellent! BTW, 'subprogram' est un terme Ada pour une fonction ou une procédure. Parce que 'File_Type' est limité privé, une procédure sera plus simple. Par exemple, 'procedure Open_Data (Fichier: in out Seq_Float_IO.File_Type; Nom: in String) est ...' – trashgod

0

question Suivi: Vous devez toujours avoir des variables de type Seq_Float_IO.File_Type dans TestWrite6. Étant donné une méthode avec cette signature:

procedure Open_Data(File : in out Seq_Float_IO.File_Type; 
        Name : in String) is 

vous auriez besoin de ces déclarations pour le paramètre in out:

X_File : Seq_Float_IO.File_Type; 
Y_File : Seq_Float_IO.File_Type; 

et vous souhaitez les utiliser comme ceci:

Open_Data(X_File, "xvalues.dat"); 
Open_Data(Y_File, "yvalues.dat"); 
Seq_Float_IO.Write(File => X_File, Item => ...); 
Seq_Float_IO.Write(File => Y_File, Item => ...); 
+0

Merci encore. J'ai modifié le code comme indiqué au bas de mon message (j'ai supprimé le code précédent). Je ne sais toujours pas quoi mettre dans Name => comme je l'ai écrit dans mon post. Je passe dans une chaîne ... est-ce le nom du fichier? – yCalleecharan

+0

Et j'ai aussi mis Fichier => Fichier ... cela ne semble pas correct !!! – yCalleecharan

+0

J'ai créé un autre poste pour cette question: http://stackoverflow.com/questions/3172364/procedure-to-open-write-and-append-in-ada – yCalleecharan