lire et écrire à partir d'un fichier

lire et écrire à partir d'un fichier - Ada - Programmation

Marsh Posté le 05-12-2005 à 13:52:16    


Bonjour à tous :)
j'ai un petit souci de programmation et je viens voir si qq'un pourais me donner un coup de pouce.
 
Voilà alors en fait je voudrais lire à partir d'un fichier une matrice puis l'écrire. Mais mon petit problème c'est que je ne vous pas du tout comment faire pour mon programme sache que c'est une matrice qu'il doit lire dans le fichier...

Reply

Marsh Posté le 05-12-2005 à 13:52:16   

Reply

Marsh Posté le 05-12-2005 à 15:47:31    

Salut!  
A tout hasard tu ne serais pas en licence maths-info 2ème année à Perpignan toi?!
A part ça ouais j'y arrive pas non plus, enfin j'ai un peu de mal avec les lectures à partir de fichier, j'ai demandé une explication à ma prof mais elle m'a pas encore répondu... Surtout qu'on l'a pas vu en cours ça!

Reply

Marsh Posté le 05-12-2005 à 17:35:44    

Plusieurs manières:
1) Ds un fichier texte (Ada.Text_Io)
Tu doit écrire un algo pour ECRIRE les valeurs de ta matrice ds le fichier, et un algo pour LIRE... => fichier texte donc formatage des valeurs en charactère (très  facile en Ada). Avantage  : consulter facilement le fichier avec un éditeur de fichier texte.
 
2) Dans un fichier séquenciel (Ada.Sequential_io). Te permet d' y écrire des valeurs de types indéfinis (non contraints)
 
3) Fichier direct .... no comment
 
4) Les flots : On écrit comme on veut ...

Reply

Marsh Posté le 05-12-2005 à 19:17:48    

Le truc que moi je ne comprends pas (pourtant j'essaye), c'est comment créer un fichier dans l'extension qu'on nous demande, c'est à dire un .dat . Il suffit de créer un fichier texte normal ( .txt ou .doc par exemple) et de remplacer son extension par .dat? Et comment ça marche exactement? Dans un exo qu'on a fait on s'est servi de cette méthode mais je n'avais pas compris, d'ailleurs voici le passage du programme :  
 
  Ada.Text_Io.Open(File => Fich_Texte, Mode => Ada.Text_Io.In_File, Name => "exo4_3.dat" ) ;
   S := 0 ;  -- somme des nombres qu'on rentre
   N := 0 ;  -- nombre de nombres qu'on rentre
   loop
      Ada.Integer_Text_Io.Get(Fich_Texte, Nombre_Lu) ;  
      Ada.Text_Io.Skip_Line(Fich_Texte) ;
      exit when Nombre_Lu = Marque_Findesuite ;
      if (Nombre_Lu rem 2)=0 then
         S := S + Nombre_Lu ;
         N := N + 1 ;
      end if ;
   end loop ;

 
En fait ce que je ne comprends pas c'est les fonctions open et skip_line, dans l'aide d'ada il n'explique pas...

Reply

Marsh Posté le 06-12-2005 à 15:43:26    

Reply

Marsh Posté le 09-12-2005 à 11:59:28    

En fait je voudrais rentrer deux matrices dans un fichier puis les lire dans une procedure, mais je ne vois pas comment.
Voici ce que j'ai essayer de faire mais ça ne me donne pas exactement les matrice tapé dans mon fichier :

for L in M'range loop
     for C in M'range loop    
         Ada.Float_Text_Io.Get(Fich1,M1(L,c));  
         Ada.Float_Text_Io.Get(Fich1,M2(L,c));  
     end loop;
   end loop;

Reply

Marsh Posté le 09-12-2005 à 15:39:51    

De quel types sont M1 et M2 ?
 
Comment veut - tu qu'on t'aide si tu ne donne pas plus de code ?
 
Apparemment tu lit dans un fichier séquentiel de float c'est ça ?
J'immagine que tu as du écrire:  

Code :
  1. package pack_fichier_float is new ada.sequential_io(float);
  2. fichier : pack_fichier_float.file_type;
  3. ma_matrice : .....; -- tu ne nous donne pas de type alors on peut imaginer ce qu'on veut (contraint, non contraint...)
  4. use pack_fichier_float;
  5. begin
  6. create(fichier,out_file,"truc" );
  7. for i in ma_matrice'range(1) loop
  8.    for j in ma_matrice'range(2) loop
  9.      put(fichier,ma_matrice(i,j));
  10.     end loop;
  11. end loop;
  12. -- et idem pour ta deuxième matrice à la suite
  13. close(fichier);


 
As-tu lu le cours sur les fichiers dont j'ai donné le lien plus haut ?
 
On dirait que tu as enregistré 2 matrices dans ton fichier et que tu veut les lire en même temps..... tu rêve ou tu ne maitrise pas du tout l'usage des fichiers en accès séquentiel il me semble.....

Reply

Marsh Posté le 11-12-2005 à 12:41:25    

Le type des matices c'est tableau non contraint, et en fait on doit bien enregistrer 2 matrices puis les utiliser après, c'est bizare je n'en doute pas...
Merci pour le lien avec le cours, mais je dois avouer que ça ma pa trop aidé, enfin il me faudrait un exemple excplicite, en TD on en a vu mais j'ai franchement pas compris, et les exos ne marchent même pas en fait, enfin moi ils me mettent une erreur dans l'éxecution, mais aucune dans la compilation!
Regarde le sujet exact de l'exercice pour mieux comprendre mon (notre...) problème :  

Citation :

Ecrire des sous-programmes réalisant la lecture à partir d’un fichier, l’écriture, la somme et la différence et le produit de matrices carrées du type tableau non contraint T_matrice suivant
type T_mat is array(integer range <>,integer range <> ) of float;


 
Donc en fait on doit créer un fichier qui créera une matrice carrée a la lecture. Le pb de Zuzulia, affecter les nombres du fichiers a une matrice je pense, le mien, créer un fichier et l'utiliser...
Je sais que je devrai essayer de me demerder avant de vous demander ça mais j'ai essayé et j'y arrive pas, c'est en fait le seul truc que je ne comprends pas en ada, sur les 3 DM qu'on a eu j'ai réussi a faire les 2 premiers tou seuls, tranquil, ils étaient pas dur mais là j'ai épuisé toutes mes ressources...
Bref si vous pouvez m'aider serieux merci! @+

Reply

Marsh Posté le 11-12-2005 à 14:54:46    

ca peut commencer comme ça :
 

Code :
  1. with Ada.Text_Io;        use Ada.Text_Io;
  2. with Ada.Float_Text_Io;  use Ada.Float_Text_Io;
  3. with Ada.Sequential_Io;
  4. procedure Matrices is
  5.      type T_Mat is array(Integer range <>,Integer range <> ) of Float;
  6.      package P_Matrices is new Ada.Sequential_Io(T_Mat);
  7.      use P_Matrices;
  8.      subtype Fich_Mat is P_Matrices.File_Type;
  9.      Fichier : Fich_Mat;
  10.      subtype Matrice_3x3 is T_Mat(1..3,1..3);
  11.      M1 : Matrice_3x3 := ((2.5,654.56,-50.0),(-789.23,56.2,2.4),(0.23,0.66,-7.1));
  12.      M2 : Matrice_3x3;
  13.      Nom_Fichier : String := "fichier de matrices";
  14. begin
  15.    Create(Fichier,Out_File,Nom_Fichier);
  16.    Write(Fichier,M1);
  17.    Reset(Fichier,In_File);
  18.    Put_Line("voici votre matrice:" );
  19.    --Open(Fichier,In_File,Nom_Fichier);
  20.    Read(Fichier,M2);
  21.    for I in M2'range(1) loop
  22.       for J in M2'range(2) loop
  23.          Put(M2(I,J),aft => 3, Exp=>0);
  24.          Put(" ; " );
  25.       end loop;
  26.       New_Line;
  27.    end loop;
  28.  
  29. end Matrices;


 
Après, c'est à toi de faire un paquetage avezc tes méthodes, l'interface graphique, la représentation 3-D des matrices ...

Reply

Marsh Posté le 11-12-2005 à 16:21:52    

Ok merci! Et miracle, ce matin pas très longtemps après avoir poster mon message j'ai compris  l'histoire des fichiers (en fait un pote venait de comprendre, il m'a envoyé un exemple simple et du coup j'ai compris)!!
Donc c'est bon avec ça je devrai pouvoir me débrouiller.
Encore merci du coup de main!

Reply

Marsh Posté le 11-12-2005 à 16:21:52   

Reply

Marsh Posté le 11-12-2005 à 21:50:14    

Voila où j'en suis! (je sais apprentitux, je dois commencer a t'enerver legerement) Donc comme je le disais juste avant j'ai enfin compris les fichiers, et maintenant j'en suis au même point que Zuzulia, affecter à chaque aggregat d'une matrice un nombre lu dans un fichier. Mon problème c'est que la première ligne est bien affecté par les nombres du fichier, mais les autres lignes sont affectés par des réels qui sortent de je ne sais où... Voilà tout ce que j'ai fait :  

Citation :

with Ada.Text_Io, Ada.Float_Text_Io;
 
procedure xxx is
   
   type T_Mat is array (Integer range <>, Integer range <> ) of Float;
   N : constant Integer := 4;
   Mat1 : T_Mat(1..N , 1..N);
   Mat2 : T_Mat(1..N , 1..N);
   Mat_S : T_Mat(1..N , 1..N);
   Mat_D : T_Mat(1..N , 1..N);
   Mat_P : T_Mat(1..N , 1..N);
   I : Integer;
   j : integer;
   Fichiera : Ada.Text_Io.File_Type;
   Fichierb : Ada.Text_Io.file_type;
   
   procedure Lect_Mat is
   begin
      I := 1;
      J := 1;
      Ada.Text_Io.Open(Fichiera,ada.Text_IO.In_File, "lopez_dev3a.dat" );
      while i <= N loop
         while J <= N loop
            Ada.Float_Text_Io.Get(Fichiera, Mat1(I,J));
            J := J + 1;
         end loop;
         i := i + 1;
      end loop;
      I := 1;
      J := 1;
      Ada.Text_Io.Open(Fichierb,Ada.Text_Io.In_File,"lopez_dev3b.dat" );
      while I <= N loop
         while J <= N loop
            Ada.Float_Text_Io.Get(Fichierb, Mat2(I,J));
            J := J + 1;
         end loop;
         I := I + 1;
      end loop;
   end Lect_Mat;
   
   procedure Ecrire_Mat(X : in out T_Mat) is
   begin
      I := 1;
      J := 1;
      for I in x'range(1)  loop
         for J in X'range(2) loop
            if J = 1 then
               Ada.Text_Io.Put("| " );
            end if;
            Ada.Float_Text_Io.Put(X(I,J));
            if J = N then
               Ada.Text_Io.Put(" |" );
            end if;
         end loop;
         ada.Text_IO.New_Line;
      end loop;
   end Ecrire_Mat;
   
begin
   Lect_Mat;
   Ecrire_Mat(Mat1);
   ada.Text_IO.New_Line(2);
   ecrire_mat(mat2);
   end xxx;


 
A la compilation, aucun problème, à l'execution, ce problème là, bon là il n'y a pas le fichier que j'ai créé. Le fichier c'est un simple fichier ada où on met un nombre sur chaque ligne et puis on l'enregistre en mettant .dat à la fin (c'est comme ça qu'on est censé faire avec notre prof). Et donc moi j'ai fait des matrices 4x4, et la première ligne prend bien les valeurs du fichier mais les 3 autres lignes non...

Reply

Marsh Posté le 12-12-2005 à 13:50:24    

Zuzulia si tu galère encore là dessus j'ai la solution!
En fait, au lieu de s'embeter à affecter les nombres du fichiers à chaque case (où aggrégat) de la matrice, il faut créer un autre vecteur de n² cases:

Citation :

type t_vect is array(integer range <> ) of float;
vect1 : t_vect(1..(N * N));


 
Comme ça tu obtient un vecteur d'une ligne et de n² colonne. Après il suffit d'affecter chaque valeur de ce nouveau vecteur à la matrice que tu veux remplir :  

Citation :


   for I in 1..N loop
      for J in 1..N loop
         Mat1(I,J) := Vect1(K);
         K := K + 1;
      end loop;
 end loop;


Et voila, une matrice remplie avec les nb contenus dans le fichier (dans le même ordre que dans le fichier évidement). J'ai pas trouvé manière plus simple...

Reply

Marsh Posté le 12-12-2005 à 18:16:29    

Pourquoi tu veux absolument t'embêter à utiliser des fichiers texte ?
Suit plutôt l'exemple que j'ai donné au dessus et crée un fichier séquentiel de matrices.

Reply

Marsh Posté le 12-12-2005 à 22:07:39    

Ben ouais moi je prefererai utiliser ce que tu as fait mais le fait est qu'on a pas le choix, en cours (et donc pour nos devoirs) on doit utiliser ce type de fichier avec un nombre a chaque ligne, c'est une consigne du devoir en quelque sorte.  
Mais je doute pas une seconde qu'avec ta méthode c'est plus simple.
Et j'allais oublier, je pense que pour la correction elle utilsera nos programmes avec ses propres fichiers pour pouvoir comparer les exo des differents etudiants entre eux, donc si dans le prog on utilise un autre type de fichier ça buguera...


Message édité par mach-1 le 12-12-2005 à 22:11:23
Reply

Marsh Posté le 13-12-2005 à 13:14:37    

Ok... sinon, ça marche maintenant ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed