1
« en: Viernes 29 de Enero de 2010, 11:42 »
Buenas, tengo un problema al trabajar con ficheros, necesito leer de un fichero de texto en este formato codigofecha identificador cantidad
tendria que leer el identificador y la cantidad para luego comparar el identificador con otro que hay en un fichero de datos y poder sacar el nombre del articulo correspondiente.
Dejo el codigo que he hecho hasta ahora.
WITH Ada.Text_IO, Interfaces.C;
WITH Ada.Integer_Text_IO;
WITH Ada.Strings.Unbounded;
WITH Ada.Strings.Fixed;
WITH Ada.Strings.Bounded;
WITH Ada.Integer_Text_IO;
--USE Ada.Text_IO, Interfaces.C;
--USE Ada.Integer_Text_IO;
WITH Ada.Direct_IO;
PROCEDURE Peliculon5 IS
-- Variables
Opcion : Character;
-- Tipos de variables.
TYPE TpGenero IS (Oeste, Accion, Romantica, Terror);
TYPE TpEstado IS (Alta, Baja);
PACKAGE TpGenero_IO IS NEW
Ada.Text_IO.Enumeration_IO(TpGenero);
USE TpGenero_IO;
PACKAGE TpEstado_IO IS NEW
Ada.Text_IO.Enumeration_IO(TpEstado);
USE TpEstado_IO;
TYPE TpPelicula IS RECORD
IdPelicula : Positive;
Titulo : String (1 .. 50);
Genero : TpGenero;
Estado : TpEstado;
Stock : Integer;
END RECORD;
PACKAGE FicheroPelicula IS NEW Ada.Direct_IO(TpPelicula);
USE FicheroPelicula;
-- Variables
NuevaPelicula : TpPelicula;
Pelicula : TpPelicula;
NuevaVenta : Ada.Text_IO.File_Type;
-------------------------------------------------------------------------------------
-------------------- Subprograma para leer archivo directo binario ------------------
-------------------------------------------------------------------------------------
PROCEDURE Peliculas(Pelicula : IN OUT TpPelicula) IS
LonPeli : natural:=0;
USTitulo : Ada.Strings.Unbounded.Unbounded_String;-- .Unbounded_String;
IdPeliculaNew : Positive;
FicheroPeliculas : File_Type;
Tamagno : Count;
Posicion : Positive_Count;
BEGIN
Open(FicheroPeliculas, Inout_File, "peliculas.dat");
Tamagno := Size(FicheroPeliculas);
for i in 1 .. Tamagno loop
Read (FicheroPeliculas, Pelicula, i);
Ada.Integer_Text_IO.Put (Pelicula.IdPelicula, width =>3);
--ada.Text_IO.New_Line;
Ada.Text_IO.Put(" ");
Ada.Text_IO.Put(Pelicula.Titulo);
Put(Pelicula.Genero, width=>11);
Put(Pelicula.Estado, width=> 6);
Ada.Integer_Text_IO.Put(Pelicula.Stock, WIDTH => 4);
Ada.Text_IO.New_Line;
end loop;
IdPeliculaNew := Pelicula.IdPelicula + 1; --Añado un nuevo idPelicula
Pelicula.IdPelicula := IdPeliculaNew;
-- Cojo los campos del fichero Peliculas.dat por teclado.
Ada.Text_IO.Put("Titulo de la Pelicula: ");
Ada.Text_IO.Get_Line(Pelicula.Titulo, LonPeli);
USTitulo := Ada.Strings.Unbounded.To_Unbounded_String(Pelicula.Titulo(1 .. LonPeli));
Ada.Strings.Fixed.Move(ada.Strings.Unbounded.To_String(USTitulo), Pelicula.Titulo);
Ada.Text_IO.Put("Genero de la Pelicula (Oeste, Accion, Romantica, Terror): ");
Get(Pelicula.Genero);
ada.Text_IO.New_Line;
Ada.Text_IO.Put("Estado de la pelicula (Alta, Baja): ");
Get(Pelicula.Estado);
Ada.Text_Io.New_Line;
Ada.Text_IO.Put("Numero de peliculas en Stock: ");
Ada.Integer_Text_IO.Get(Pelicula.Stock);
Ada.Text_IO.Skip_Line;
Write(FicheroPeliculas, Pelicula); -- Escribo en el fichero Peliculas.dat.
Close(FicheroPeliculas); -- Cerramos el fichero.
END Peliculas;
-------------------------------------------------------------------------------------
---------------------- FIN SUBPROGRAMA LECTURA DE ARCHIVO DIRECTO -------------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------------------- Subprograma para leer archivo de texto--------------------------
-------------------------------------------------------------------------------------
PROCEDURE Ventas (FicheroPorcentaje: IN OUT Ada.Text_IO.File_Type) IS
Contador : Integer;
IdPeliculav: Integer;
Cantidadv : Integer;
-- Variables fichero peliculas.dat
FicheroPeliculas : File_Type;
Tamagno : Count;
Posicion : Positive_Count;
TYPE VecIdPelicula IS ARRAY (1 .. Tamagno) OF Integer;
-- Variables fichero ventas.txt.
FicheroVentas : ada.Text_IO.File_Type;
Linea : String (1 .. 80);
Longitud : Natural;
-- Variables Fichero porcentje.txt.
--FicheroPorcentaje : ada.Text_IO.File_Type;
BEGIN
Open(FicheroPeliculas, Inout_File, "peliculas.dat");
Ada.Text_IO.Open (FicheroVentas, Ada.Text_IO.In_File, "ventas.Txt");
Contador := 0;
-- Escritura del fichero porcentaje.txt
Ada.Text_IO.Open (FicheroPorcentaje, Ada.Text_IO.Out_File, "porcentaje.Txt");
Ada.Text_IO.Put_Line(FicheroPorcentaje," Informe del porcentaje de ventas por pelicula");
Ada.Text_IO.Put_Line(FicheroPorcentaje," =============================================");
Ada.Text_IO.Put_Line(FicheroPorcentaje," Titulo de la Pelicula Porcentaje de ventas");
Ada.Text_IO.Put_Line(FicheroPorcentaje,"=================================================== ====================");
--Lectura del archivo de texto "ventas.txt".
Tamagno := Size(FicheroPeliculas);
WHILE NOT Ada.Text_IO.End_Of_File (FicheroVentas) LOOP
Contador := Contador+ 1;
Ada.Text_IO.Get_Line (FicheroVentas, Linea, Longitud); --Leo el fichero
Idpeliculav := Integer'Value(Linea(17 .. 24)); -- Cojo solo el id de pelicula
Cantidadv := Integer'Value(LInea(25 .. 32)); -- Cojo solo la cantidad de peliculas
-- Recorro el fichero peliculas.dat para escribir el titulo de la pelicula.
for i in 1 .. Tamagno loop
Read (FicheroPeliculas, Pelicula, i);
VecIdPelicula (I) := Pelicula.IdPelicula;
Ada.Text_IO.Put_line(FicheroPorcentaje, Pelicula.Titulo); --Escribo en el fichero
Ada.Text_IO.Put(Pelicula.Titulo); -- Saco por pantalla.
Ada.Text_IO.New_Line;
END LOOP;
END LOOP;
Ada.Integer_Text_IO.Put(Contador);
Ada.Text_IO.Close (FicheroVentas); -- Cerramos el fichero ventas.txt
close(FicheroPeliculas); -- Cerramos el fichero peliculas.dat.
Ada.Text_IO.Close(FicheroPorcentaje); -- Cerramos el fichero porcentaje.txt
END Ventas;
-------------------------------------------------------------------------------------
---------------------- FIN SUBPROGRAMA LECTURA DE ARCHIVO DE TEXTO ------------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
---------------------- SUBPROGRAMA PORCENTAJE DE ARCHIVO DE TEXTO ------------------
-------------------------------------------------------------------------------------
PROCEDURE Porcentaje IS
FicheroPorcentaje : ada.Text_IO.File_Type;
BEGIN
Ada.Text_IO.Open (FicheroPorcentaje, Ada.Text_IO.In_File, "porcentaje.Txt");
Ada.Text_IO.Skip_Line;
ada.Text_IO.Close(FicheroPorcentaje);
END Porcentaje;
-------------------------------------------------------------------------------------
---------------------- FIN SUBPROGRAMA PORCENTAJE DE ARCHIVO DE TEXTO ---------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
--------------------------- Subprograma para borrar la pantalla ---------------------
-------------------------------------------------------------------------------------
PROCEDURE Cls IS
PACKAGE C RENAMES Interfaces.C;
FUNCTION System (Command : C.Char_Array) RETURN C.Int;
PRAGMA Import(C, System, "system");
Rc : C.Int;
BEGIN
Rc := System (C.To_C ("cls"));
END Cls;
--------------------------------------------------------------------------------------
----------------------Fin del subprograma que borra la pantalla ----------------------
--------------------------------------------------------------------------------------
BEGIN
--------------------------------------------------------------------------------------
--------------------------------- Menu de la aplicacion ------------------------------
--------------------------------------------------------------------------------------
WHILE (Opcion /= '0') LOOP
CLS;
Ada.Text_IO.Put_Line(" MENU PELICULON ");
Ada.Text_IO.Put_Line("===========================");
Ada.Text_IO.Put_Line("Películas");
Ada.Text_IO.Put_Line(" A. Alta Nueva Pelicula");
Ada.Text_IO.Put_Line("Informe");
Ada.Text_IO.Put_Line(" P. Porcentaje Ventas por Pelicula");
Ada.Text_IO.Put_Line("0. Salir del programa");
Ada.Text_IO.New_Line;
Ada.Text_IO.Get_Immediate(Opcion);
CASE Opcion IS
WHEN 'A' =>
Ada.Text_IO.Put_Line("Introduce todos los campos que te pidan");
Peliculas(NuevaPelicula);
WHEN 'P' =>
Ada.Text_IO.Put_Line("El porcentaje de ventas es el siguiente");
Ventas(NuevaVenta);
Ada.Text_IO.Get_Immediate(Opcion);
WHEN OTHERS =>
NULL;
END CASE;
END LOOP;
CLS;
Ada.Text_IO.Put("El programa ha sido finalizado por el usuario");
END Peliculon5;