Este documento explica el uso de las clases iostream en C++ para entrada y salida de datos. Describe cómo incluir la cabecera iostream, cómo usar el objeto cout para imprimir cadenas a la salida estándar utilizando el operador <<, y cómo formatar la salida de números. También muestra un programa "Hola Mundo" básico como ejemplo.
2. Uso de las clases iostream
• Ahora ya tiene suficientes conocimientos para crear y compilar un
programa. Este programa usará las clases de flujo de entrada-salida
(iostream) del C++ estándar.
• iostream es capaz de leer y escribir en ficheros o en la entrada y salida
estándar (que suele ser la consola, pero que puede ser redirigida a ficheros
o dispositivos). En este programa simple, se usa un objeto stream (flujo)
para imprimir un mensaje en pantalla
3. Uso de las clases iostream
• Para declarar las funciones y los datos externos que contenga la clase
iostream hay que incluir el fichero de cabecera de la siguiente manera:
4. Uso de las clases iostream
• El primer programa usa el concepto de salida estándar, que significa un
lugar de propósito general, al que se le pueden enviar cosas. Se verá otros
ejemplos que utilizan la salida estándar de otras formas, pero aquí
simplemente usaremos la consola.
• El paquete iostream define una variable (un objeto) llamado cout de forma
automática que es capaz de enviar todo tipo de datos a la salida estándar.
5. Uso de las clases iostream
• Para enviar datos a la salida estándar, se usa el operador. Los
programadores de C lo conocen como operador de “desplazamiento a la
izquierda”. Basta decir que el desplazamiento a la izquierda no tiene nada
que ver con la salida. Sin embargo, C++ permite que los operadores sean
sobrecargados.
• Cuando se sobrecarga un operador, se le da un nuevo significado siempre
que dicho operador se use con un objeto de determinado tipo. Con los
objetos de iostream, el operador << significa “enviar a”. Por ejemplo:
6. Uso de las clases iostream
envía la cadena “¿Qué tal?” al objeto llamado cout (que es un diminutivo
de “console output” (salida por consola).
7. Espacios de nombres
• Como se menciona, uno de los problemas del lenguaje C es que “nos quedamos sin
nombres” para funciones e identificadores cuando los programas llegan a ser de cierto
tamaño. Por supuesto que realmente no nos quedamos sin nombres; aunque se hace
más difícil pensar en nombres nuevos después de un rato. Y todavía más importante,
cuando un programa alcanza cierto tamaño es normal fragmentarlo en trozos más
pequeños cada uno de los cuales es mantenido por diferentes personas o grupos. Como
C sólo tiene un problema para lidiar con todos los identificadores y nombres de función,
trae como consecuencia que todos los desarrolladores deben tener cuidado de no usar
accidentalmente los mismos nombres en situaciones en las que pueden ponerse en
conflicto. Esto se convierte en una pérdida de tiempo, se hace tedioso y en último
término, es más caro.
8. Espacios de nombres
• El C++ Estándar tiene un mecanismo para impedir estas colisiones: la
palabra reservada namespace (espacio de nombres). Cada conjunto de
definiciones de una librería o programa se “envuelve” en un espacio de
nombres, y si otra definición tiene el mismo nombre, pero está en otro
espacio de nombres, entonces no se produce colisión.
9. Espacios de nombres
• Hay una palabra reservada que le permite decir “quiero usar las
declaraciones y/o definiciones de este espacio de nombres”. Esa palabra
reservada, bastante apropiada por cierto, es using. Todas las librerías de
C++ Estándar están incluidas en un único espacio de nombres, que es std
(por “standard”). Como este curso se usa la librería estándar casi
exclusivamente, se verá la siguiente directiva using en casi todos los
programas
10. Espacios de nombres
• Esto significa que quiere usar todos los elementos del espacio de nombres
llamado std. Después de esta sentencia, ya no hay que preocuparse de si
su componente o librería particular pertenece a un espacio de nombres,
porque la directiva using hace que el espacio de nombres esté disponible
para todo el fichero donde se escribió la directiva using.
11. Espacios de nombres
• Exponer todos los elementos de un espacio de nombres después de que
alguien se ha molestado en ocultarlos, parece contraproducente, y de
hecho, el estudiante deberá tener cuidado si considera hacerlo (como
aprenderá más tarde en este curso). Sin embargo, la directiva using expone
solamente los nombres para el fichero actual, por lo que no es tan drástico
como suena al principio. (pero piénsalo dos veces antes de usarlo en un
fichero cabecera, eso es temerario).
12. Espacios de nombres
• Existe una relación entre los espacios de nombres y el modo en que se
incluyes los ficheros de cabecera. Antes de que se estandarizara la nueva
forma de inclusión de los ficheros cabecera (sin el “.h” como en
<iostream>), la manera típica de incluir un fichero de cabecera era con el
“.h” como en <iostream.h>. En esa época los espacios de nombres
tampoco eran parte del lenguaje, por lo que para mantener una
compatibilidad hacia atrás con el código existente, si se escribía:
14. Fundamentos de la estructura de los
programa
• Un programa C o C++ es una colección de variables, definiciones de
función, y llamada a funciones. Cuando el programa arranca, ejecuta el
código de inicialización y llama a una función especial, “main()”, que es
donde debe colocarse el código principal del programa.
• Como se mencionó anteriormente, una definición de función consiste en un
valor de retorno (que debe ser especificarse obligatoriamente C++), un
nombre de función, una lista de argumentos, y el código de la función entre
llaves. Aquí hay un ejemplo de definición de función:
15. Fundamentos de la estructura de los
programa
La función de arriba tiene una lista vacía de argumentos y un cuerpo que contiene únicamente un
comentario.
Puede haber varios pares de llaves en la definición de una función, pero siempre debe haber al menos
dos que envuelvan todo el cuerpo de la función. Como main( ) es una función, debe seguir esas reglas.
En C++, main( ) siempre devuelve un valor de tipo int (entero).
16. Fundamentos de la estructura de los
programa
• C y C++ son lenguajes de formato libre. Con un par de excepciones, el
compilador ignora los espacios en blanco y los saltos de línea, por lo que hay
que determinar el final de una sentencia. Las sentencias están delimitadas por
punto y coma.
• Los comentarios en C empiezan con /* y finalizan con */. Pueden incluir saltos
de línea. C++ permite este estilo de comentarios y añade la doble barra
inclinada:
• //. La // empieza un comentario que finaliza con el salto de línea. Es más útil
que /* */ y se usa ampliamente en este curso.
19. “Hello,World!”
• El objeto cout maneja una serie de argumentos por medio de los operadores
<<, que imprime los argumentos de izquierda a derecha. La función especial
endl provoca un salto de línea. Con los iostreams se puede encadenar una serie
de argumentos como aquí, lo que hace que se una clase fácil de usar.
• En C, el texto que se encuentra entre comillas dobles se denomina “cadena”
(string). Sin embargo, la librería Estándar de C++ tiene una poderosa clase
llamada string para manipulación de texto, por lo que usaremos el término más
preciso array de caracteres para el texto que se encuentre entre dobles
comillas
20. “Hello,World!”
• El compilador pide espacio de memoria para los arrays de caracteres y guarda el
equivalente ASCII para cada carácter en este espacio. El compilador finaliza
automáticamente este array de caracteres añadiendo el valor 0 para indicar el final.
• Dentro del array de caracteres, se pueden insertar caracteres especiales usando las
secuencias de escape. Consisten en una barra invertida () seguida de un código
especial. por ejemplo n significa salto de línea. El manual del compilador o la guía
concreta de C ofrece una lista completa de secuencia; entre otras se incluye: t
(tabulador), (barra invertida), y b (retroceso).
• Tenga en cuenta que la sentencia puede continuar en otras líneas, y la sentencia
completa termina con un punto y coma.
21. “Hello,World!”
• Los argumentos de tipo array de caracteres y los números constantes están
mezclados en la sentencia cout anterior. Como el operador << está
sobrecargado con varios significados cuando se usa con cout, se pueden
enviar distintos argumentos y cout se encargará de mostrarlos
22. Más sobre iostreams
• Hasta ahora sólo ha visto los aspectos más rudimentarios de las clases
iostream.
• El formato de salida que permiten los iostreams también incluyen
características como el formato de números en decimal, octal, y
hexadecimal. Aquí tiene otro ejemplo del uso de los iostreams
25. Más sobre iostreams
• Este ejemplo muestra cómo la clase iostreams imprime números en
decimal, octal, y hexadecimal usando manipuladores (los cuales no
imprimen nada, pero cambian el estado del flujo de salida). El formato de
los números en punto flotante lo determina automáticamente el
compilador. Además, cualquier se puede enviar cualquier caracter a un
objeto stream usando un molde (cast) a char (un char es un tipo de datos
que manipula un sólo caracter). Este molde parece una llamada a función:
char( ), devuelve un valor ASCII. En el programa de arriba, el char(27) envía
un ¨escape¨ a cout.
26. Concatenar vectores de caracteres
• Una característica importante del preprocesador de C es la concatenación
de arrays de caracteres. Esta característica se usa en algunos de los
ejemplos de este curso. Si se colocan juntos dos arrays de caracteres
entrecomillados, sin signos de puntuación entre ellos, el compilador los
pegará en un único array de caracteres. Esto es particularmente útil cuando
los listados de código tienen restricciones de anchura.
29. Concatenar vectores de caracteres
• Al principio, el código de arriba puede parecer erróneo porque no está el ya
familiar punto y coma al final de cada línea. Recuerde que C y C++ son
lenguajes de formato libre, y aunque normalmente verá un punto y coma al
final de cada línea, el requisito real es que haya un punto y coma al final de
cada sentencia, por lo que es posible encontrar una sentencia que ocupe
varias líneas