ADA - Rellenar campos con menos caracteres

 
Vista:

Rellenar campos con menos caracteres

Publicado por oxayolt1987 (1 intervención) el 08/01/2006 09:59:58
Hola buenas, estoy creando una "base de datos" en un fichero secuencial que almacena registros con informaciones personales, el caso es que si dentro del registro defino el campo nombre de 1..16 y luego lo relleno con "Fernando" (8 caracteres) los otros 8 se me quedan desconocidos y a la hora de mostrarlo por pantalla el resultado es lamentable.

type tpPersona is record
nombre: string(1..16);
apellidos: string(1..16);
dni: integer;
nacimiento: tpFecha;
end record;

¿Como podria solucionarlo?¿El problema esta al crear dicho fichero secuencial , o tambien podria ser que lo muestro mal por pantalla?
MUCHAS GRACIAS
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problemas de longitud en cadenas de registros

Publicado por Alejandro (155 intervenciones) el 30/06/2023 16:29:50
El problema que estás experimentando se debe a que estás utilizando una cadena de longitud fija para el campo "nombre" en tu registro "tpPersona". Cuando asignas el valor "Fernando" a ese campo, los caracteres adicionales se consideran parte de la cadena, lo que provoca que el resultado se muestre de forma incorrecta.

Para solucionarlo, puedes utilizar una cadena de longitud variable en lugar de una cadena de longitud fija. En Ada, puedes usar el tipo de datos "Unbounded_String" del módulo "Ada.Strings.Unbounded" para manejar cadenas de longitud variable.

Aquí tienes un ejemplo de cómo modificar tu código para utilizar "Unbounded_String":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
with Ada.Text_IO;
with Ada.Strings.Unbounded;
 
procedure Main is
   type tpFecha is record
      -- Definición de tpFecha
   end record;
 
   package String_IO is new Ada.Text_IO.Text_IO(Integer);
   package Unbounded_IO is new Ada.Text_IO.Text_IO(Ada.Strings.Unbounded.Unbounded_String);
 
   type tpPersona is record
      Nombre     : Ada.Strings.Unbounded.Unbounded_String;
      Apellidos  : Ada.Strings.Unbounded.Unbounded_String;
      DNI        : Integer;
      Nacimiento : tpFecha;
   end record;
 
   -- Función auxiliar para convertir una cadena de longitud variable en una cadena de longitud fija
   function Fixed_String(Input : Ada.Strings.Unbounded.Unbounded_String; Length : Natural) return String is
      Result : String(1 .. Length) := (others => ' ');
   begin
      for I in Input'Range loop'
         exit when I > Length;
         Result(I) := Ada.Strings.Unbounded.Element(Input, I);
      end loop;
      return Result;
   end Fixed_String;
 
   F : Ada.Text_IO.File_Type;
   P : tpPersona;
 
begin
   Ada.Text_IO.Create(F, Ada.Text_IO.Out_File, "datos.txt");
 
   -- Ejemplo de asignación de valores a los campos del registro
   P.Nombre := Ada.Strings.Unbounded.To_Unbounded_String("Fernando");
   P.Apellidos := Ada.Strings.Unbounded.To_Unbounded_String("López");
   P.DNI := 12345678;
   -- Asignación de otros valores a los campos del registro
 
   -- Escritura del registro en el fichero
   Unbounded_IO.Put(File => F, Item => P.Nombre);
   Unbounded_IO.Put(File => F, Item => P.Apellidos);
   String_IO.Put(File => F, Item => P.DNI);
 
   -- Cierre del fichero
   Ada.Text_IO.Close(F);
end Main;

En este ejemplo, se utiliza el tipo de datos "Unbounded_String" en lugar de "String" para los campos "Nombre" y "Apellidos" del registro "tpPersona". Esto permite que la longitud de las cadenas sea variable y no esté limitada a un tamaño fijo.

Además, se incluye una función auxiliar llamada "Fixed_String" que convierte una cadena de longitud variable en una cadena de longitud fija. Esta función se utiliza para mostrar los campos de longitud variable en pantalla si es necesario.

Espero que esta solución te sea útil. Recuerda ajustarla según tus necesidades específicas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar