Você está na página 1de 8

Flujos en C++ (Streams)

Entrada/Salida en C++
Programacin Orientada a Objeto Ing. Civil en Telecomunicaciones

Hasta aqu, hemos usado cin y cout para leer desde teclado y escribir a consola C++ no incluye comandos de entrada/salida en el lenguaje
Definidos en bibliotecas de E/S Objetivo: tratar todas las fuentes de datos

(teclado, archivos, redes) de la misma forma: como flujos de bytes de largo indefinido

Clases de entrada/salida
Biblioteca de entrada/salida de C++ define una jerarqua de clases

Flujos y buffers
Escribir a pantalla o a archivos es lento Sistema mantiene buffers en memoria para acoplar velocidades
Datos se reciben del teclado a un buffer,

donde quedan disponibles hasta que el programa los necesita Datos se escriben en un buffer en vez de escribir directamente en un archivo

Buffer se escribe al archivo cuando est lleno

Flujos y buffers
No todos los flujos utilizan buffers En algunos casos, se escriben los datos directamente al destino sin pasar por el buffer intermedio
Ejemplo: cout y clog usan buffers, cerr

Clase abstracta streambuf


La clase base abstracta streambuf maneja el buffer
Sus funciones miembro permiten leer, escribir,

sincronizar, vaciar y escribir a memoria los flujos


Funciones no se invocan directamente
Clases derivadas son stringbuf y filebuf

no usa buffers

2013 Mario Medina C.

Clases de entrada/salida
La clase ios es la clase base para los flujos de entrada y salida Define todas las funciones comunes a flujos de entrada y de salida
Contiene un objeto streambuf Maneja los bits de estado del flujo

Clase de entrada istream


Clase istream representa objetos usados para leer secuencias de caracteres
Datos con formato son accedidos usando el

operador istream::operator>>
double a, b, c; cin >> a >> b >> c;
Datos sin formato son accedidos a travs de

eofbit, badbit, failbit, goodbit,hardfail

otras operaciones
get(), getline(), read()

Clase de salida ostream


Clase ostream representa objetos usados para escribir secuencias de caracteres
Datos con formato son accedidos usando el

Clases generales de entrada/salida


Clases generales de entrada/salida
<iostream>: entrada/salida estndar <fstream>: entrada/salida de archivos <sstream>: entrada/salida hacia/desde

operador istream::operator<<
double a, b, c; cout << a << b << c;
Datos sin formato son accedidos a travs de

strings

Clase para manipulacin de flujos


<iomanip>: manipulacin de flujos

otras operaciones
put(), write()

Clase de entrada/salida iostream


Clase iostream deriva mtodos de istream y de ostream
Define 4 flujos estndar

Funcin istream::get() (I)


iostream& get(char c) lee un caracter desde un flujo de entrada y lo almacena en el caracter c
Retorna el flujo de entrada, por lo que puede

cin: entrada estndar de teclado cout: salida estndar a consola cerr: salida estndar de error clog: salida estndar de bitcora Estos flujos pueden ser manipulados por operadores >>, << o por otras funciones

ser usado en concatenaciones


cin.get(a).get(b).get(c); cin.get(a) >> b >> c;

2013 Mario Medina C.

Funcin istream::get() (II)


iostream& get(char* p, int n, char delim) lee n - 1 caracteres desde un flujo de entrada y los almacena a partir del puntero p dado, retornando el flujo de entrada
Funcin almacena caracter \0 en el ltimo

Funcin istream::getline()
iostream& getline(char* p, int n, char delim) lee n - 1 caracteres desde un flujo de entrada y los almacena a partir del puntero p dado, retornando el flujo de entrada
Funcin almacena caracter \0 en el ltimo

byte del rea destino Lectura se detiene al llegar al delimitador


Si se omite delimitador, asume \n
Delimitador queda en flujo de entrada

byte del rea destino

Lectura se detiene al llegar al delimitador

Si se omite delimitador, asume \n


Caracter delimitador es removido del flujo

Funcin istream::read()
Funcin istream& read(char *p, n) lee n bytes desde el flujo de entrada, y los almacena a partir del puntero p dado
Retorna el flujo de entrada Termina anticipadamente al encontrar EOF gcount() retorna nmero de caracteres

Funcin istream::ignore()
iostream& ignore(int n, char delim) lee n caracteres desde un flujo de entrada y los ignora
Lectura se detiene al encontrar el

delimitador delim
Delimitador es removido del flujo de entrada Si ste se omite, el delimitador por omisin es EOF
Retorna el flujo de entrada

ledos

Funcin istream::gcount()
Funcin gcount() retorna el nmero de caracteres extrados del flujo por la operacin de lectura anterior
Aplicable a funciones : get(), getline(),

Funciones de estado
Para determinar estado del flujo
bad() es true si hubo falla en operacin de

lectura escritura

fail() es true si hubo falla en lectura

ignore(), peek(), read(), readsome(), putback() y unget() En los casos de unget() y putback(), gcount() siempre retorna 0

escritura, u error de otro tipo

Ejemplo: conversin de formatos


eof() es true si se lleg al fin del flujo good() es true si todas las funciones

anteriores son false

clear() limpia el estado del flujo

2013 Mario Medina C.

Punteros a flujos
Objetos de la biblioteca mantienen punteros a flujos para lectura y/o escritura
Clase istream incluye el get pointer, que

Lectura de punteros a flujos


Funciones tellg() y tellp() retornan un entero representando la posicin absoluta de get pointer y put pointer, respectivamente
Posicin est dada en caracteres Falla es indicada por resultado -1 Funcin retorna el

apunta a la prxima posicin a leer


Clase ostream incluye el put pointer, que

apunta a la prxima posicin donde escribir Clase iostream incluye ambos punteros Posiciones estn dadas en caracteres

flujo asociado

tellg() pertenece a clase istream tellp() pertenece a clase ostream

Movimiento de punteros
Funciones seekg() y seekp() definen nuevas posiciones del get pointer y put pointer
istream& seekg(offset, pos) Posicin pos est dada en caracteres

Movimiento de punteros
Posicin puede ser relativa al comienzo del flujo o relativa a otra posicin
seekg(offset, pos), donde offset es ios::beg: comienzo del flujo ios::end: final del flujo ios::cur:posicin actual del flujo

No todos los flujos admiten funciones seekg() y seekp()


No son vlidas para flujos estndares cin,

cout y cerr

Comportamiento ante accesos fuera del flujo no est definido

Funcin istream::peek()
int istream::peek() lee el siguiente caracter desde el flujo de entrada, y luego lo retorna al flujo
int a = cin.peek();
En caso de error, retorna EOF Siguiente caracter queda entonces

Funcin istream::unget()
istream& istream::unget() devuelve el ltimo caracter ledo al flujo de entrada, y decrementa el puntero de lectura get pointer en 1
Funcin retorna el flujo de entrada Llamada posterior a gcount() retorna 0

disponible en el flujo para la siguiente lectura

2013 Mario Medina C.

Funcin istream::putback()
Funcin retorna caracter c al flujo, y decrementa el puntero de lectura en el flujo get pointer en 1
cin.putback(c);
La funcin retorna el flujo de entrada Llamada posterior a gcount() retorna 0 Similar a unget(), pero es posible definir el

Funcin istream::sync()
Fuerza el vaciado de los buffers del flujo de entrada, sincronizando su contenido Aplicable a flujos istream Caracteres an no ledos en el flujo de entrada son descartados

caracter a retornar al flujo

Funcin ostream::put()
La funcin ostream& put(char c) escribe el caracter c en el flujo de salida
Aplicable a flujos de salida ostream Incrementa el put pointer en 1 Retorna el flujo de salida El estado del flujo indica si la operacin fue

Funcin ostream::write()
Funcin ostream& write(char *p, n) escribe n bytes a partir del puntero p dado en el flujo de salida
Retorna el flujo de salida El estado del flujo indica si la operacin fue

exitosa

exitosa

Funcin ostream::flush()
Funcin ostream& flush() fuerza la escritura de los buffers del flujo, sincronizando su contenido Aplicable a flujos ostream Funcin retorna el flujo de salida Fin de lnea endl tambin fuerza un flush de los buffers

Manejo de archivos
Hay 3 clases para manipular archivos
ifstream: usada para leer desde un archivo ofstream: usada para escribir a un archivo fstream: usada para leer y escribir a un

archivo

Archivos pueden ser abiertos en modo texto o modo binario


Modo texto: interpreta caracteres especiales Modo binario: no hay caracteres especiales

2013 Mario Medina C.

Manejo de archivos: open() y close()


fstream f; f.open(nombre, modo) nombre es el nombre del archivo como un string de C modo indica el modo de operacin con el archivo

Modos de open()
Modos de open()
ios::in: abrir para entrada de datos ios::out: abrir para salida de datos ios::binary: abrir en modo binario ios::ate: abrir con posicin inicial al final

del archivo (at end)

Flujo se cierra con


f.close() Flujo tambin se cierra al destruir el objeto

ios::app: abrir para agregar datos

(append). Se usa en conjunto con ios::out comienzo del archivo, y se borra su contenido

ios::trunc: abrir con posicin inicial el

Modos por omisin


Modos se deducen del tipo de archivo
ifstream arch1(entrada.txt);
Se agrega modo ios::in automticamente

Creacin y apertura de archivos


Constructor por omisin de flujos de archivos tambin abren el flujo
ofstream arch1; arch1.open(datos.txt", ios::out | ios::app | ios::binary);
Equivale a

ofstream arch2(salida.txt);
Se agrega ios::out automticamente

fstream arch3(datos.txt);
Se agregan modos ios::in

y ios::out

automticamente

ofstream arch1(datos.txt", ios::out | ios::app | ios::binary);


Ntese cmo combinar modos usando |

Archivos binarios
No se reconocen caracteres especiales
No se consideran delimitadores, espacios,

Manipuladores de entrada/salida
Objetos especiales para manipular flujos
Usados con operadores << y >> Manipuladores de salida (clase ostream)

saltos de lnea

Acceso mediante read() y write()


char buffer[1000]; f.read(buffer, 1000); f.write(buffer, 1000);

endl: escribe \n y sincroniza buffer de salida ends: escribe \0 en el buffer de salida flush: escribe el buffer de salida a su destino
Manipuladores de salida (clase istream)

ws: lee y descarta espacios en blanco


Muchos flujos tienen esta opcin activada por omisin

2013 Mario Medina C.

Manipuladores de formato
Definidos en iomanip
setbase: define la base de los nmeros a

Manipuladores de formato
setprecision: define la precisin

decimal del siguiente nmero


cout << setprecision(7) << 3.1415;
setfill: define el caracter a usar como

desplegar. Puede ser 8, 10 16


cout << setbase(16) << 100 << endl;
oct,

relleno en un nmero
cout << setw(7) << setfill(a) << 433; Tiene como salida aaaa433

dec, hex: definen la base a usar

cout << hex << 100 << endl;


setw: Define el ancho del prximo campo

cout << setw(7) << 100 << endl;

Manipuladores de formato
Definidos en ios
boolalpha/noboolalpha: Imprime true

Manipuladores de formato
Definidos en ios
showbase/noshowbase: Siempre imprime

o false para valores booleanos. showpos/noshowpos: Controla impresin de signo + para los nmeros positivos uppercase/nouppercase: Usa maysculas en nmeros de punto flotante showpoint/noshowpoint: Siempre imprime el punto en nmeros de punto flotante

la base de un nmero
skipws/noskipws: Ignora los espacios en

blanco al leer del flujo unitbuf/nounitbuf: Siempre sincroniza el flujo despus de cada operacin insercin en ste fixed/scientific: tipo de notacin a usar en el flujo

Manipuladores de formato
Definidos en ios
left: alinea nmero a la izquierda en el

Manipuladores de formato
Definidos en iomanip
setiosflags: activa los flags de formato del

campo de largo dado por setw y rellena el campo con el caracter dado por setfill right: alinea nmero a la derecha en el campo de largo dado por setw y rellena el campo con el caracter dado por setfill internal: alinea nmero en el campo de acuerdo a un valor interno, y rellena el campo con el caracter dado por setfill

flujo de acuerdo a una mscara resetiosflags: desactiva los flags de formato del flujo de acuerdo a una mscara
cout << hex << setiosflags(ios_base::showbase | ios_base::uppercase) << 100 << endl; Imprime 0X64

2013 Mario Medina C.

Funciones de formato
Todo lo que se hace con manipuladores de flujo puede realizarse con funciones de manejo de formato Definidas en ios_base
Ejemplo:

Funciones de formato
flags(): retorna un entero indicando los

flags de formato

flags(newflags): asigna un nuevo valor

cout << showbase;

Equivale a
cout.setf(ios::showbase);

a los flags de formato, y retorna un entero conteniendo los flags de formato antiguos setf(newflag): asigna un nuevo valor a los flags de formato, y retorna un entero conteniendo los flags de formato antiguos unsetf(newflag): limpia los flags de formato especificados

2013 Mario Medina C.

Você também pode gostar