Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1563 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

  lire et écrire à partir d'un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lire et écrire à partir d'un fichier

n°1259021
zuzulia
Posté le 05-12-2005 à 13:52:16  profilanswer
 


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...

mood
Publicité
Posté le 05-12-2005 à 13:52:16  profilanswer
 

n°1259175
mach-1
Posté le 05-12-2005 à 15:47:31  profilanswer
 

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!

n°1259375
apprentitu​x
Posté le 05-12-2005 à 17:35:44  profilanswer
 

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 ...

n°1259436
mach-1
Posté le 05-12-2005 à 19:17:48  profilanswer
 

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...

n°1260177
apprentitu​x
Posté le 06-12-2005 à 15:43:26  profilanswer
 
n°1262470
zuzulia
Posté le 09-12-2005 à 11:59:28  profilanswer
 

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;

n°1262734
apprentitu​x
Posté le 09-12-2005 à 15:39:51  profilanswer
 

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.....

n°1263936
mach-1
Posté le 11-12-2005 à 12:41:25  profilanswer
 

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! @+

n°1263976
apprentitu​x
Posté le 11-12-2005 à 14:54:46  profilanswer
 

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 ...

n°1264008
mach-1
Posté le 11-12-2005 à 16:21:52  profilanswer
 

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!

mood
Publicité
Posté le 11-12-2005 à 16:21:52  profilanswer
 

n°1264161
mach-1
Posté le 11-12-2005 à 21:50:14  profilanswer
 

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...

n°1264464
mach-1
Posté le 12-12-2005 à 13:50:24  profilanswer
 

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...

n°1264799
apprentitu​x
Posté le 12-12-2005 à 18:16:29  profilanswer
 

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.

n°1264942
mach-1
Posté le 12-12-2005 à 22:07:39  profilanswer
 

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
n°1265429
apprentitu​x
Posté le 13-12-2005 à 13:14:37  profilanswer
 

Ok... sinon, ça marche maintenant ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

  lire et écrire à partir d'un fichier

 

Sujets relatifs
Récupérer les infos d'un fichier txt en batchTelechargement a partir d'un site flash
[PHP/HTML]Cherche un script pour lire des flux RSSavoir la date à partir de nb bjour
fichier HEXLecture d'un fichier texte en boucle C++
Locker un fichierEcrire un fichier texte sur un serveur distant
image à lire avant un script 
Plus de sujets relatifs à : lire et écrire à partir d'un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR