Saltar al contenido

STREAMS EN PROGRAMACIÓN

    streams en programación

    ¿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.

    STREAMS

    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.