lunes, 19 de mayo de 2014

Receta No. 2-15 en C#: Lectura de la Entrada de Usuario usando la Consola

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Método Read
3.2 Método ReadLine
3.3 Método ReadKey
4. Práctica: Código Fuente en C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Continuamos con el descubrimiento y preparación de nuevas recetas en C#. En esta oportunidad vamos a aprender cómo capturar la entrada del usuario a través de la consola (entrada estándar del sistema). Exploraremos varios de los métodos y enumeraciones para la captura de datos de la captura de texto: modificadores, carácter UNICODE, además de, la enumeración con los datos de teclas de sistema (e.g., Inicio, Suprimir, Insertar, tecla Windows, menú contextual, &c.). ¡Empecemos!

1. Problema

El departamento de contabilidad de la organización ABC Sas. ha solicitado a la empresa constructora de software Ad Inifitum Systems la construcción de una aplicación basada en texto para ser utilizada en un sistema operativo que tiene desactivado el servidor de ventanas.

2. Solución

Enseguida el arquitecto de software pensó en una solución basada en texto que capture la entrada del usuario por medio de la consola: teclado y pantalla. En particular, propuso un esquema utilizado en el Framework .NET para lograrlo: los artefactos de la clase System.Console (i.e., Console.ReadKey, Console.Read, Console.ReadLine). La interfaz contará con un menú basado en texto y además podrá ser manipulada a través de un enlace remoto a través de un servidor y un cliente basados en el protocolo telnet [3].

3. Discusión de la Solución

El Framework .NET cuenta con la clase Console (namespace System) que representa los flujos de entrada, salida, y de error para aplicaciones basadas en sólo texto (o consola). Esta es la firma de la clase [2]:

public static class Console

Intentar heredar de esta clase no es posible [2]. Los métodos, propiedades, y eventos de esta clase permiten manipular varias de las propiedades y comportamientos propios de una consola; por ejemplo, la forma de captura (i.e., por carácter, o cadena de caracteres), el formato de texto, la apariencia (cfr., Receta No. 1-16: Manipulación de la Apariencia de la Consola). A continuación vamos ver varios de los métodos disponibles, ademas, de otros artefactos que facilitan la captura de la información, y su respectiva manipulación.

3.1 Método Read

El método Read [5]  lee un carácter introducido a través de la entrada estándar. Esta es su firma:

public static int Read()

El valor devuelto por este método es un número entero, el cual representa el número asociado con el carácter introducido. En caso de que no haya un carácter por leer, el sistema devolverá el valor -1Veamos cómo funciona:

public static void Main()
{
  int lectura = Console.Read();

Console.WriteLine((char)lectura);
}

Hemos invocado al método Console.Read y hemos guardado el valor entero devuelto en la variable lectura. Más adelante, mostramos en pantalla el carácter asociado al número entero a través de un casting explícito: (char)lectura.

> Prueba de ejecución. (Para probar es necesario introducir un carácter (o varios) en el módulo 'Input') (Si este programa lo ejecutamos desde el simbolo de sistema de Windows [7] o desde Power Shell [6])

Vale aclara que si intentamos introducir varios caracteres, el método sólo tomará el primero de ellos.

3.2 Método ReadLine

El método ReadLine [8] lee un conjunto de caracteres desde la entrada estándar. El valor de retorno de este método es un objeto string que contiene todos los caracteres introducidos. Esta es su fima:

public static string ReadLine()

El funcionamiento de este método es muy similar al anterior, empero, permite capturar más de un carácter antes de presionar la tecla `Enter`. Aquí un código de prueba:

string lectura = Console.ReadLine();
Console.WriteLine(lectura);

Ahora un ejemplo concreto de su uso:

Archivo PruebaReadLine2.cs:
Resultado prueba ejecución:
Demostración del uso del método ReadLine.
Figura 1. Demostración del uso del método ReadLine.

Es importante agregar que la combinación Ctrl-Z permite enviar una señal al método ReadLine, para que éste devuelva null.

3.3 Método ReadKey

A través del método ReadKey [9] (método sobrecargado (x2)) podemos capturar la señal de pulsación de teclas de caracteres (i.e., A-Z, a-z, 0-9, símbolos especiales) y teclas de función (e.g., F1-F12, Inicio, Fin, RePág, AvPág, Insert, Supr, &c.). Estas son las firmas disponibles:

public static ConsoleKeyInfo ReadKey()
public static ConsoleKeyInfo ReadKey(bool intercept)

La segunda versión sobrecargada admite un valor booleano para permitir (true) la omisión de la salida del carácter presionado en la salida estándar (monitor). Esto nos puede resultar útil para capturar contraseñas de usuario. Por otro lado, con false permitimos el comportamiento contrario, es decir, la impresión del carácter en la salida estándar.

Observemos que ambos métodos devuelven un objeto de tipo System.ConsoleKeyInfo [10]. Éste objeto contiene toda los detalles relacionados con la tecla presionada [1]. En la Figura 2 [1] se muestran las tres propiedades disponibles de este método las cuales permiten el acceso a los detalles de la pulsación:
Propiedades de la estructura ConsoleKeyInfo.
Figura 2. Propiedades de la estructura ConsoleKeyInfo [1].

Vayamos con una demostración:

Archivo PruebaConsoleKeyInfo.cs:

Resultado de ejecución:
Demostración de uso de la estructura ConsoleKeyInfo.
Figura 3. Demostración de uso de la estructura ConsoleKeyInfo.

4. Práctica: Código Fuente C#

En esta sección veremos un ejemplo muy interesante que consiste en la remoción de los caracteres presionados por el usuario a través de la tecla `F1`. Ademas, cuando el usuario presione `Esc`, se removerá el contenido de la entrada de la pantalla.


Demostración de compilación, ejecución, y uso.

5. Conclusiones

Entendimos los métodos de la Consola: Read, ReadLine, y ReadKey (clase estática Console) para obtener la entrada del usuario a través de la consola. En la sección práctica pusimos en juego el uso del método ReadKey para obtener las señalas de presión de tecla, ocultar la entrada del usuario, y cierre del ciclo de introducción de caracteres (Alt+X, o Alt+x). Esto nos es de bastante utilidad en proyectos de software que requieran manipular la entrada del usuario en sistemas legados.

6. Glosario

  • Consola
  • Entrada estándar
  • Protocolo
  • Salida estándar
  • Telnet

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Console (Clase) (System) - http://msdn.microsoft.com/es-es/library/system.console(v=vs.110).aspx
[3]: Telnet - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Telnet
[4]: Receta No. 1-16: Manipulación de la Apariencia de la Consola - http://ortizol.blogspot.com/2014/02/receta-no-1-16-en-c-manipulacion-de-la.html
[5]: Console.Read (Método) (System) - http://msdn.microsoft.com/es-es/library/system.console.read(v=vs.110).aspx
[6]: Windows PowerShell - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Windows_PowerShell
[7]: Command Prompt - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Command_Prompt
[8]: Console.ReadLine (Método) (System) - http://msdn.microsoft.com/es-es/library/system.console.readline(v=vs.110).aspx
[9]: Console.ReadKey (Método) (System) - http://msdn.microsoft.com/es-es/library/system.console.readkey(v=vs.110).aspx
[10]: ConsoleKeyInfo (Estructura) (System) - http://msdn.microsoft.com/es-es/library/x3h8xffw(v=vs.110).aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.