Ciencias Y Letras
telesadada10 de Junio de 2014
623 Palabras (3 Páginas)300 Visitas
Almacenamiento de iostream
Las buenas prácticas de diseño dictan que, cuando cree una nueva clase, debe esforzarse en ocultar los detalles de la implementación subyacente tanto como sea posible al usuario de la clase. Usted le muestra solo aquello que necesita conocer y el resto se hace privado para evitar confusiones. Cuando usamos insertadores y extractores, normalmente usted no conoce o tiene cuidado con los bytes que se consumen o se producen, ya que usted está tratando con E/S estándar, ficheros, memoria, o alguna nueva clase o dispositivo creado.
Llega un momento, no obstante, en el que es importante comunicar con la parte del iostream que produce o consume bytes. Para proveer esta parte con una interfaz común y esconder todavía su implementación subyacente, la librería estándar la abstrae dentro de su clase, llamada streambuf. Cada objeto iostream contiene un puntero a alguna clase de streambuf. (El tipo depende de que se esté tratando con E/S estándar, ficheros, memoria, etc.). Puede acceder al streambuf directamente; por ejemplo, puede mover bytes sin formatear dentro y fuera del streambuf sin formatearlos a través de la encapsulación del iostream. Esto es posible llamando a las funciones miembro del objeto streambuf.
Actualmente, la cosa más importante que debe conocer es que cada objeto iostream contiene un puntero a un objeto streambuf, y el objeto streambuf tiene algunas funciones miembro que puede llamar si es necesario. Para ficheros y streams de string, hay tipos especializados de buffers de stream, como ilustra la figura siguiente:
Para permitirle el acceso al streambuf, cada objeto iostream tiene una función miembro llamada rdbuf() que retorna el puntero a un objeto streambuf. De esta manera usted puede llamar cualquier función miembro del streambuf subyacente. No obstante, una de las cosas más interesantes que usted puede hacer con el puntero al streambuf es conectarlo con otro objeto iostream usando el operador <<. Esto inserta todos los carácteres del objeto dentro del que está al lado izquierdo del <<. Si quiere mover todos los carácteres de un iostream a otro, no necesita ponerse con el tedioso (y potencialmente inclinado a errores de código) proceso de leer de carácter por carácter o línea por línea. Este es un acercamiento mucho más elegante.
Aquí está un programa muy simple que abre un fichero y manda el contenido a la salida estándar (similar al ejemplo previo):
//: C04:Stype.cpp
// Type a file to standard output.
#include <fstream>
#include <iostream>
#include "../require.h"
using namespace std;
int main() {
ifstream in("Stype.cpp");
assure(in, "Stype.cpp");
cout << in.rdbuf(); // Outputs entire file
} ///:~
Iostreams de fichero
Manipular ficheros con iostream es mucho más fácil y seguro que usar stdio en C. Todo lo que tiene que hacer es crear un objeto - el constructor hace el trabajo. No necesita cerrar el fichero explícitamente (aunque puede, usando la función miembro close()) porque el destructor lo cerrará cuando el objeto salga del ámbito. Para crear un fichero que por defecto sea de entrada, cree un objeto ifstream. Para crear un fichero que por defecto es de salida, cree un objeto ofstream. Un fstream puede hacer ambas cosas.
Las clases de stream de fichero encajan dentro de las clases iostream como se muestra en la siguiente figura:
Como antes, las clases que usted usa en realidad son especializaciones de plantillas definidas por definiciones de tipo. Por ejemplo, ifstream, que procesa ficheros de char, es definida como:
typedef basic_ifstream<char> ifstream;
PARA QUE SIRVE IOSTREAM.
recorda que c++ es un programa de creación de software que se basa en la
...