Los ejemplos de programas en las secciones anteriores proporcionaron poca o ninguna interacción con el usuario. Simplemente imprimieron valores simples en la pantalla, pero la biblioteca estándar ofrece muchas otras formas de interactuar con el usuario a través de sus funciones de entrada/salida. Esta sección proporcionará una breve introducción a algunos de los más útiles.
C++ utiliza una abstracción conveniente llamada flujo para realizar operaciones de entrada y salida en medios secuenciales como la pantalla, el teclado o el archivo. Un flujo es una entidad en la que un programa puede insertar o extraer caracteres de / a. No es necesario conocer los detalles del soporte asociado al flujo ni sus especificaciones internas. Todo lo que necesitamos saber es que los flujos son una fuente/destino de caracteres y que estos caracteres se proporcionan/aceptan secuencialmente (es decir, uno tras otro.
La biblioteca estándar define un puñado de objetos de flujo que se pueden utilizar para acceder a lo que se considera la fuente y el destino estándar de caracteres en el entorno de tiempo de ejecución del programa:
Veremos con más detalle sólo el coste y el cin (flujos de entrada y salida estándar); cerr y clog son también flujos de salida, por lo que esencialmente funcionan como costes, con la única diferencia de que identifican los flujos con fines específicos: mensajes de error y registro; que, en muchos casos, en la mayoría de las configuraciones ambientales, hacen exactamente lo mismo: imprimen en la pantalla, aunque también pueden ser redirigidos individualmente.
Producción estándar (coste)
En la mayoría de los entornos de programa, la salida estándar por defecto es la pantalla y el objeto de flujo C++ definido para acceder a él es caro.
Para las operaciones de salida formateadas, el coste se utiliza con el operador de inserción, que se escribe como <.
cost <<<<< "Output sentence"; // muestra la frase de salida en la tuerca <<<<< 120; // muestra el número 120 en la tuerca << x; // muestra el valor de x en la pantalla
El operador <<<<< introduce los datos que les siguen en el flujo que les precede. En los ejemplos anteriores, ha insertado la cadena literal Output Phrase, el número 120 y el valor de la variable x en el coste del flujo de salida estándar. Nótese que la oración de la primera instrucción se coloca entre comillas («) porque es una cadena literal, mientras que x no está en la última. La cita doble es la que marca la diferencia; el texto se imprime literalmente; de lo contrario, se interpreta como el identificador de una variable y se imprime su valor. Por ejemplo, estas dos frases tienen resultados muy diferentes:
cost <<<<< "Hello"; // prints hello <<< Hello; // muestra el contenido de la variable Hello
Varias operaciones de inserción (<<) peuvent être chaînées en une seule instruction:
coste <<<< "Esto" << "es una" <<<< "instrucción simple C ++";
Esta última instrucción imprimiría el texto. Esta es una única instrucción C++. El encadenamiento de inserciones es particularmente útil para mezclar literales y variables en una sola instrucción:
coste <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< << << < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <
Asumiendo que la variable age contiene el valor 24 y la variable zipcode contiene 90064, la salida de la instrucción anterior sería:
Tengo 24 años y mi código postal es 90064
Lo que el costo no hace automáticamente es añadir saltos de línea al final, a menos que se indique lo contrario. Por ejemplo, tomemos las siguientes dos instrucciones para insertar en el costo:
coste <<<<< "Esta es una frase."Esta es otra frase."
La salida sería en una sola línea, sin ningún salto de línea entre las dos. Algo así como:
Esto es una frase. Esta es otra frase.
Para insertar un salto de línea, se debe insertar un nuevo carácter de línea en la posición exacta de la línea. En C++, un nuevo carácter de línea se puede especificar como \ n (es decir, una barra invertida seguida de una n minúscula. Por ejemplo:
coste <<<<< "Primera frase. \ "Costo" <<<<"Segunda frase. \ Tercera frase."...
Esto produce la siguiente salida:
Primera frase.
Segunda frase.
Tercera frase.
Alternativamente, el manipulador final también se puede utilizar para romper líneas. Por ejemplo:
coste <<<<< "Primera frase." <<<<<<<<<<< "Segunda frase." <<<< endl;
Se imprimiría:
Primera frase. Segunda frase.
El manipulador endl produce un nuevo carácter de línea, al igual que la inserción de’\ n’; pero también tiene un comportamiento adicional: el buffer de flujo (si lo hay) se vacía, lo que significa que la salida debe escribirse físicamente en el dispositivo, si no se ha hecho ya. Esto afecta principalmente a los flujos totalmente amortiguados, y el coste no es (normalmente) un flujo totalmente amortiguado. Sin embargo, normalmente es una buena idea usar endl sólo cuando vaciar el alimento sería una característica y’si no lo fuera’. Recuerde que una operación de enjuague genera gastos generales especiales y puede provocar retrasos en algunos dispositivos.
Entrada estándar (cin)
En la mayoría de los entornos de programa, la entrada estándar predeterminada es el teclado y el objeto C ++ stream definido para acceder a él es cin.
Para las operaciones de entrada formateadas, cin se utiliza con el operador de extracción, que se escribe como >> (es decir, dos caracteres «mayor que». A este operador le sigue la variable donde se almacenan los datos extraídos. Por ejemplo:
int age;cin >> edad;
La primera instrucción declara una variable int llamada edad y la segunda un valor para almacenar. Esta operación obliga al programa a esperar a que cin entre; generalmente, esto significa que el programa esperará a que el usuario introduzca una secuencia con el teclado. En este caso, tenga en cuenta que los caracteres introducidos mediante el teclado sólo se transmiten al programa cuando pulsa la tecla ENTER (o RETURN. Una vez alcanzada la instrucción con la operación de extracción en cin, el programa esperará tanto tiempo como sea necesario hasta que se introduzca una entrada.
La extracción en cin utiliza el tipo de variable después del operador >> para determinar cómo interpreta los caracteres leídos de la entrada, si es un entero, el formato esperado es una secuencia de números, si es una cadena, etc.
i // i / o example#include <iostream>using namespace std;int main (){int i cost <<< "Please enter an integer value:";cin >> i cost <<<< "The value you entered is" <<<< i cost <<< "and its double is" <<< i * 2 <<<". \ "n";return 0;}
Resultado de la ejecución
Por favor, introduzca un número entero: 702El valor que ha introducido es 702 y el doble es 1404.
Como puede ver, la extracción de cin parece simplificar y simplificar la obtención de la entrada de la entrada estándar. Pero este método también tiene una gran desventaja. ¿Qué sucede en el ejemplo anterior si el usuario, entre otras cosas, no puede ser interpretado como un entero? Bueno, en ese caso, la operación de extracción falla. Y esto, por defecto, permite que el programa continúe sin establecer un valor para la variable i, produciendo resultados indeterminados si el valor de i se utiliza más tarde.
Este es un mal comportamiento del programa. Se espera que la mayoría de los programas se comporten como se espera, independientemente del tipo de usuario, mediante la gestión adecuada de los valores no válidos. Sólo los programas muy sencillos deberían basarse en valores extraídos directamente de la cinética sin más verificación.
Veremos más adelante cómo usar cadenas para controlar mejor las entradas del usuario.
Las extracciones en cin también se pueden encadenar para solicitar varios datos en una sola instrucción:
cin >> a >> b;
Esto equivale a:
cin >> a;cin >> b;
En ambos casos, el usuario debe introducir dos valores, uno para la variable a y otro para la variable b. Cualquier tipo de espacio se utiliza para separar dos operaciones de entrada consecutivas; puede ser un espacio, un tabulador o un nuevo carácter de línea.
cin y tanga
El operador de extracción se puede utilizar en el cin para obtener cadenas de la misma manera que para los tipos de datos fundamentales:
cuerda mystring;cin >> mystring;
Sin embargo, el cin de extracción siempre considera los espacios (espacios, tabulaciones, nueva línea…) como el final del valor que se está extrayendo, y por lo tanto, extraer una cadena siempre significa extraer una sola palabra, no una frase o una frase completa.
Para obtener una línea entera de cin, hay una función, llamada getline, que toma el stream (cin) como el primer argumento y la variable de cadena como el segundo. Por ejemplo:
// cin with strings#include <iostream>#include <string>using namespace std;int main (){string mystr;cout <<<< "¿Cuál es tu nombre? \ "Coste <<<<"¿Cuál es tu equipo favorito?";getline (cin, mystr);coste <<<<<<"Me gusta" <<<<"too! \ "n";return 0;}
Resultado de la ejecución:
¿Cómo te llamas? Homer SimpsonHello Homer Simpson ¿Cuál es tu equipo favorito? A mí también me gustan los isótopos.
Tenga en cuenta que en ambas llamadas getline, usamos el mismo identificador de cadena (mystr. En la segunda llamada, el programa simplemente reemplaza el contenido anterior por el nuevo.
El comportamiento estándar esperado por la mayoría de los usuarios de un programa de consola es que cada vez que el programa pregunta al usuario, éste entra en el campo y luego presiona la tecla Enter (o Return. En otras palabras, generalmente se espera que las entradas del programa de consola se hagan en las líneas, y esto se puede lograr usando getline para obtener las entradas del usuario.
Por lo tanto, a menos que tenga una razón válida para no hacerlo, siempre debería usar getline para obtener entradas en sus programas de consola en lugar de extraerlas de cin.
Otros consejos interesantes:
- Estructura de un programa en C++ La mejor manera de aprender un lenguaje de programación es escribir programas. Normalmente, el primer programa que los principiantes escriben es un programa llamado «Hello World», que simplemente muestra «Hello World» en la pantalla de……
- Estructuras de datos en C++ Una estructura de datos es un grupo de elementos de datos agrupados bajo el mismo nombre. Estos elementos de datos, llamados miembros, pueden tener diferentes tipos y longitudes. Se pueden declarar las estructuras de datos……
- Cuerdas en C++ La clase de cuerda se introdujo brevemente en un capítulo anterior. Es una clase muy poderosa para manipular y manipular cuerdas. Sin embargo, como las cadenas son en realidad secuencias de……
- C++ Ejercicios con soluciones Ejercicios corregidos en el lenguaje C++, descargue también la lista completa de ejercicios (lenguaje C, C++, tablas, punteros,…. Vea a continuación una serie de ejercicios para descargar. Ejercicios 1: Escribir un programa en C….
- Memoria dinámica en C++ En los programas descritos en los capítulos anteriores, todos los requisitos de memoria se determinaron antes de ejecutar el programa mediante la definición de las variables necesarias. Pero puede suceder que las necesidades de memoria de un….