¿Qué son los streams en programación?
Los streams en programación son un flujo de datos. En este sentido, para que existan, es necesario que haya un origen abierto conteniendo datos, y un destino abierto y preparado para recibir datos. Entre el origen y el destino debe haber una conexión por donde puedan fluir los datos. Estas conexiones se llevan a cabo a través de operadores y métodos de C++
.
Los streams
se usan de forma genérica, independientemente de cuales sean el origen y el destino.
Tipos de Streams
Los más normales son los que se establecen entre un programa y la consola: el teclado y la pantalla. También entre un programa y un fichero o entre dos zonas de memoria. En algunos casos es necesario abrir el stream antes de usarlo, como es el caso de los ficheros, y otras veces no, como es el caso de las consolas.
Operadores de Inserción y Extracción
Todos los streams
van a disponer de estos dos operadores. El operador de inserción, <<
, es el operador de desplazamiento de bits a la izquierda, que está definido en la clase ostream
perteneciente a iostream.h
, y >>
, es el operador de desplazamiento a la derecha y está definido en la clase istream
, definida en el mismo archivo cabecera.
Estos operadores van a disponer a su izquierda un objeto stream
que será origen o destino, dependiendo del operador usado, y a la derecha lo que se va a escribir o donde se va a almacenar lo leído. Ya se han usado streams: cout
y cin
que tienen por defecto la salida estándar (pantalla) y la entrada estándar (teclado). También existe cerr
para la salida estándar de errores del programa.
Entrada/Salida con Formato
La E/S
de datos se realiza por medio de los operadores de inserción y extracción en streams
y puede formatearse por ejemplo para ajustar a la derecha o a la izquierda con una longitud mínima o máxima. Para esto se definen métodos y manipuladores. Los métodos son aquellos a los que se les llama de forma habitual (con el nombre del objeto a la izquierda). En cambio, los manipuladores pueden actuar en cualquier punto a través de los operadores de inserción y extracción.
Anchura
Por defecto, los datos que entran y salen tienen una anchura que se corresponde con el espacio necesario para almacenar ese dato. Para fijar la anchura, tanto se puede usar el método width()
como el manipulador setw()
. Si se usa width()
sin parámetro devolverá la anchura fijada, que por defecto es 0. Esto significa que se tomen los carácteres necesarios para la representación del dato en el stream de salida. Si le pasamos un parámetro se fijará la anchura a ese número de carácteres.
Carácter de Relleno
Cuando se ajusta una salida, y quedan espacios libres, estos se rellenan con espacios en blanco. Este carácter de relleno se puede modificar con el método fill()
o el manipulador setfill()
. Llamando a fill()
nos devuelve el carácter de relleno que se está usando en ese momento.
Precisión
Para números en punto flotante, a la hora de la salida se representa con todos sus dígitos, pero esto es alterable, o bien mediante el método precision()
, o bien mediante el manipulador setprecision(), poniendo el número de dígitos a
presentar en la salida como parámetro. El método sin parámetros devolverá el valor fijado anteriormente.
Bases de Numeración
Normalmente, la entrada y salida de datos se hace en decimal, lo cual es modificable mediante dec(), hex(), oct()
, y setbase()
. Los tres primeros no necesitan parámetro alguno, pasando a base decimal, hexadecimal, u octal, mientras que la última necesitará recibir un entero indicando la base en la que se desea trabajar. No es necesario usar paréntesis en los tres primeros.
#include <iostream.h>
#include <iomanip.h>
void main(void)
{
unsigned long Dato;
cout << “Dame la dirección hexadecimal : “;
cin >> hex >> Dato;
cout << hex << Dato << “,” << dec << Dato << “,” << oct <<
Dato << ‘\n’;
cout << setbase(10);
cin >> setbase(10);
}
Otros Manipuladores
Para el objeto cout
existen además:
endl()
ends() sin parámetros
flush()endl():
Inserta un retorno de carro.
ends():
Inserta un terminador de cadena.
flush():
Fuerza la salida de todos los carácteres del buffer al stream.
Todos ellos se pueden llamar con cout___
o bien con cout<<____
.
Cin además tiene el manipulador ws, sin parámetros, que permite ignorar los espacios en blanco en las operaciones de entrada o lectura. Está activado por defecto.
Indicadores de Formato
Método setf() |
Activa indicadores de formato |
Método unsetf() |
Desactiva indicadores de formato |
Método flags |
Asigna el estado de todos los indicadores |
Los dos primeros equivalen a los modificadores setioflags()
y resetioflags()
. Todos toman un entero largo que indica los indicadores a activar o desctivar. Pertenecen a la clase ios
, de la cual se derivan las clases a las que pertenecen los objetos que se manejan. Los métodos flags(), setf(), unsetf()
devuelven un entero con el estado de los indicadores antes de alterarlos, siendo interesante almacenarlos para luego restituirlos.
Otros Métodos de E/S
Los operadores de inserción y extracción permiten realizar entradas y salidas con formato. Sin embargo, a veces puede ser necesario leer o escribir información sin formato alguno. Para ello también se dispone de algunos operadores en las clases istream y ostream
.
El Polifacético Método get
get()
es un método para realizar lecturas o entradas de datos desde un objeto. Sus posibles formas son: get()
: Toma el siguiente carácter y lo devuelve. En caso de que haya encontrado final del stream
, devuelve EOF
. get(char *, int, char)
: El primer parámetro es la dirección donde se almacenará la cadena de caracteres, el segundo la longitud y el tercero el carácter delimitador, para que cuando lo encuentre se pare. Se va a detener cuando: a) Encuentre el delimitador. b) Encuentre el final del stream.
Si no se da el último carácter se tomará por defecto ‘\n’. get(char &)
: Toma un carácter del stream y lo almacena en la variable cuya referencia se toma como parámetro.
Lectura de Líneas
El método getline()
toma los mismos parámetros que get()
y el mismo valor por defecto para el delimitador. Se almacena el delimitador antes de añadir el carácter nulo.
Lectura Absoluta
Mediante el método read()
se puede leer un número de caracteres y almacenarlo en el espacio de memoria indicado. Sólo se detiene si llega al final del stream
y no ha leído la cantidad indicada, pero no lo hace cuando se encuentre un
delimitador o el carácter nulo. Como primer parámetro pasamos el puntero a donde se almace nará la cadena, y como segundo la longitud. Mediante el método gcount()
es posible saber el número de bytes leídos (nos lo devuelve).
Escritura sin Formato
Existen dos métodos principales para la escritura sin formato que son:
Put():
Que toma como parámetro un carácter al que da salida por el
stream.Write():
También existen los métodos para desplazar el puntero de escritura en el stream:
seekp()=Seekg() tellp()=tellg()
#include <iostream.h>
#include <iomanip.h>
void main(void)
{
char Cadena[20];
int N;
cout << “Introduzca una cadena :”;
cin.getline(Cadena,20); // Se toma una cadena de 20
// caracteres como máximo.
cout << endl << endl; // Dos líneas en blanco
cout.write(Cadena,20); // Se da salida a los 20 caracteres
cout.flush(); // Vuelca el stream al correspondiente
// dispositivo.
cout << endl << “Introduzca un número :”;
cin >> N;
cout << endl << “Su representación es :”;
cout.write(char *) &N, sizeof(N); // Escribe su
// representación en memoria
cout.flush();
}
Los Streams en Programación (y los Buffers)
A cada stream
se le asocia un buffer
, para mejorar los tiempos de acceso. Mediante el método rdbuf()
obtenemos un puntero al buffer correspondiente a un stream
. Los métodos que nos van a permitir acceder a estos buffers podemos dividirlos en tres grupos.
Te invitamos a que te pases por este el mejor sitio web informática. A su vez, te dejamos con otra fuente amigas para que analices con más calma todo este valioso contenido: glosarioit.