You are on page 1of 10

Captulo 7

Flujos de entrada y salida


7.1. Denici on
Un ujo es un objeto desde el cual se puede enviar o recibir informacion.
Para el caso de una fuente de entrada de informaci on, esta puede ser enviada desde
el teclado o desde un archivo o desde una red local de comunicaciones o desde un
nodo de internet, entre otros.
Para el caso de una fuente de salida de informaci on, esta tpicamente es enviada a
la consola (pantalla) o a un archivo o una impresora u otro nodo de internet.
Los archivos son ejemplos de ujos de doble direcci on, generalmente se puede recibir
y se puede enviar informaci on desde y hacia ellos.
En captulos anteriores ya se haba hecho uso de los ujos; con el objeto cin se reciba
informaci on desde el teclado y con el objeto cout se enviaba informaci on a la consola de
salida en la pantalla. En este capitulo, adem as de estudiar los ujos cin y cout, se tratara el
tema de usar archivos como ejemplos de ujos de entrada y salida de informacion distintos
al teclado y la consola.
7.2. La jerarqua del conjunto de los ujos
El conjunto de todos los ujos se representar a mediante el smbolo
S
el cual es una abreviacion de la palabra stream que es ujo en ingles.
El conjunto S contiene a el conjunto IOS (input output stream) de los ujos que reciben
o envan informaci on, o que reciben y envan informacion, es decir,
107
108 CAP

ITULO 7. FLUJOS DE ENTRADA Y SALIDA


IOS S
El conjunto IOS contiene a los conjuntos IS (input stream) y OS (output stream), es
decir,
IS IOS y OS IOS
El conjunto IS a su vez contiene a el conjunto IFS IS (input le stream), y el objeto
cin pertenece a el (cin IS).
El conjunto OS a su vez contiene a el conjunto OFS OS (output le stream), y el
objeto cout pertenece a el (cout OS).
En el siguiente arbol se muestra la jerarqua de los ujos descrita anteriormente
S
IOS
IS
IFS

cin

OS
OFS

cout

7.3. Los ujos en C++


Los ujos de entrada IS en C++ se codican con la palabra istream.
Los ujos de entrada desde un archivo IFS en C++ se codican con la palabra
ifstream.
Los ujos de salida OS en C++ se codican con la palabra ostream.
Los ujos de salida a un archivo OFS en C++ se codican con la palabra ofstream.
Los ujos de entrada o salida de datos IOS en C++ se codican con la palabra
iostream.
El objeto cin pertenece al conjunto IS que es un subconjunto de IOS.
El objeto cout pertenece al conjunto OS que es un subconjunto de IOS.
La denicion de ujos de entrada y salida simultanea de datos se encuentra en C++ en
la librera iostream, por esto es necesario incluir al principio de las funciones que manejan
ujos esta librera, as como se muestra en el siguiente encabezado de un archivo de un
programa en C++
7.3. LOS FLUJOS EN C++ 109
#include<iostream>
#include<cstdlib>
using namespace std;
Lectura de datos: si se quiere leer un dato de un tipo primitivo T desde un ujo de
entrada IS, entonces una funci on que representa este procedimiento se puede escribir de
la siguiente forma
leer T IS T
(is) a, donde a = leer(is)
La traduccion de esta funci on en C++ se escribe de la siguiente manera
T leer_T(istream& is){
T a;
is >> a;
return a;
};
La funci on leer(is) que en C++ se escribe como >>, esta retorna el dato siguiente que
se encuentre almacenado en el ujo is.
Cuando un ujo se utiliza como par ametro, este se pasa por referencia, es decir, que
fsicamente no se pasa un valor como par ametro, como en el caso de los tipos primitivos,
sino que se pasa su direccion de memoria. Para pasar la direcci on de memoria de un ujo
se coloca el smbolo & inmediatamente despues del tipo de ujo; como en el caso anterior
que se escribio istream&.
Ejemplo. En C++ para leer un dato de tipo entero desde un ujo se utiliza la siguiente
funci on
int leer_int(istream& is){
int a;
is >> a;
return a;
};
1
-5
a
2
5
-5
a
110 CAP

ITULO 7. FLUJOS DE ENTRADA Y SALIDA


3
5
a
Escritura de datos: si se quiere escribir un dato de un tipo de primitivo T en un ujo
de salida OS, entonces una funci on que representa este procedimiento se puede escribir de
la siguiente forma
escribir T T OS OS
(a, os) os, donde escribir(a, os)
La traduccion de esta funci on en C++ se escribe de la siguiente manera
ostream& escribir_T(T a, ostream& os){
os << a;
os << \t;
return os;
};
La funci on escribir(a, os) que en C++ se escribe como <<, esta escribe el dato a en el
ujo os. En la funci on escribir_T se enva adicionalmente el smbolo \t para separar
el smbolo a del siguiente dato que sea almacenado en el ujo os.
Ejemplo. En C++ para escribir un dato de tipo entero en un ujo se utiliza la siguiente
funci on
ostream& escribir_int(int a, ostream& os){
os << a;
os << \t;
return os;
};
1
5
a
2
5
5
a
7.4. FLUJOS DE ENTRADA Y SALIDA DESDE Y HACIA ARCHIVOS 111
3
5
5
a
4
-5
-5
7.3.1. Ejemplo del uso de los ujos de entrada y salida estandares
Ejemplo. Para utilizar las funciones anteriores, que leen desde el teclado y escriben en la
consola se pueden llamar de la siguiente forma
int main(){
cout << "Digite un entero: ";
int a = leer_int(cin);
cout << "El entero leido es: ";
escribir_int(a, cout);
cout << endl;
system("pause");
return EXIT_SUCCESS;
};
Para el programa anterior se tiene como salida en la consola el siguiente texto
Digite un entero: -5
El entero leido es: -5
Presione una tecla para continuar . . .
7.4. Flujos de entrada y salida desde y hacia archivos
Para poder usar archivos como ujos de entrada o salida es necesario en primera ins-
tancia incluir la librera
#include<fstream>
con lo cual el encabezado de un archivo fuente de un programa en C++ que haga uso de
archivos como ujos tendra el siguiente aspecto
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
112 CAP

ITULO 7. FLUJOS DE ENTRADA Y SALIDA


7.4.1. Uso de archivos como ujos de entrada
Para declarar que un archivo f pertenece al ujo fuente de entrada IFS (f IFS),
en C++ se especica que f pertenece al conjunto ifstream y se debe proporcionar la
ubicaci on del archivo en el computador donde se ejecute el programa, es necesario que el
archivo exista previamente.
Para crear un ujo de entrada en C++ y especicar la ruta de localizacion del archivo
que sirve de ujo de entrada se utiliza la siguiente sintaxis
ifstream f("<path>");
el par ametro de la ruta <path> donde se ubica el archivo fuente de entrada depende
del sistema operativo. Si se proporciona como localizacion "archivo.txt", se abrir a el
archivo llamado "archivo.txt" que se encuentra en la misma carpeta (en la misma ruta)
del archivo ejecutable.
Para proporcionar una ruta especica de un archivo en Windows es necesario especicar
la unidad y el directorio.
Ejemplo. Un ejemplo de la ruta de la ubicacion de un archivo en Windows es
C:\\mis documentos\\archivo.txt
Para proporcionar una ruta especica de un archivo en Linux es necesario especicarla
desde el directorio raiz.
Ejemplo. Un ejemplo de la ruta de la ubicacion de un archivo en Linux es
/home/user/archivo.txt
7.4.2. Uso de archivos como ujos de salida
Para declarar que un archivo f pertenece al ujo de salida OFS (f OFS), en C++
se especica que f pertenece al conjunto ofstream y se debe proporcionar la ubicaci on
del archivo en el computador donde se ejecute el programa, en este caso no es necesario
que el archivo exista previamente.
Para crear un ujo de salida en C++ y especicar la ruta de localizaci on del archivo
que sirve de ujo de salida se utiliza la siguiente sintaxis
ofstream f("<path>");
Las reglas para la especicaci on de la ruta de localizaci on son las mismas que se des-
cribieron para los archivos como ujos de entrada.
7.4. FLUJOS DE ENTRADA Y SALIDA DESDE Y HACIA ARCHIVOS 113
7.4.3. Cierre de los ujos desde y hacia archivos
Un paso necesario cuando se utilizan archivos como ujos de entrada o salida es que es
necesario cerrar los archivos despues de utilizarlos para evitar que al ser abiertos queden
bloqueados para ser usados por otras aplicaciones o que al escribir la informacion no se
escriba completamente en el archivo. Para hacer esto se llama la funci on close() con la
sintaxis
f.close();
donde f es el ujo que se creo con el archivo especicado.
7.4.4. Ejemplo del uso de archivos como ujos de entrada y salida
Ejemplo. Suponga que se dispone del archivo de texto plano entrada.txt con las si-
guiente informaci on
0
1
2
3
4
5
y se quieren leer algunos datos con el n de copiar los primeros 4 enteros del archivo al
archivo salida.txt, esto se podra hacer utilizando el siguiente programa
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
int leer_int(istream& is){
int a;
is >> a;
return a;
};
ostream& escribir_int(int a, ostream& os){
os << a;
os << \t;
return os;
};
114 CAP

ITULO 7. FLUJOS DE ENTRADA Y SALIDA


int main(){
ifstream ifs("entrada.txt");
ofstream ofs("salida.txt");
escribir_int(leer_int(ifs), ofs);
escribir_int(leer_int(ifs), ofs);
escribir_int(leer_int(ifs), ofs);
escribir_int(leer_int(ifs), ofs);
ofs.close();
ifs.close();
cout << endl;
system("pause");
return EXIT_SUCCESS;
};
La salida de dicho programa sera:
Presione una tecla para continuar . . .
y se generar a el archivo salida.txt con el siguiente contenido:
0 1 2 3
Esta declaracion de ujo sobreescribe el archivo cada vez que se ejecuta el programa.
N otese que cada dato con esta sintaxis se lee hasta encontrar uno de los siguientes carac-
teres especiales: \t, \n, . En la tercera lnea de la funci on main se lee el entero
0, y se imprime en el ujo de salida junto con un smbolo \t, a partir de la cuarta
lnea hasta la sexta lnea se realizan identicas operaciones, pero con los valores 1, 2 y 3,
respectivamente. A continuaci on se proceden a cerrar los ujos.
7.5. EJERCICIOS 115
7.5. Ejercicios
1. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
leer un dato de tipo real desde un ujo generico.
2. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
escribir un dato de tipo real en un ujo generico.
3. Escriba un programa en C++ que lea un dato de tipo real (p. ej. 3.14159265) desde
el ujo de datos suministrado por el teclado usando la funci on dise nada anteriormente
en el numeral 1 y que escriba el opuesto aditivo del n umero en la consola usando la
funci on dise nada anteriormente en el numeral 2 (p. ej. -3.14159265).
4. Escriba un programa en C++ que lea un dato de tipo real (p. ej. -3.14159265)
desde el ujo de datos suministrado por un archivo de entrada llamado "input.txt"
usando la funcion dise nada anteriormente en el numeral 1 y que escriba el opuesto
aditivo del n umero en un archivo de salida llamado "output.txt" usando la funcion
dise nada anteriormente en el numeral 2 (p. ej. 3.14159265).
5. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
leer un dato de tipo booleano desde un ujo generico.
6. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
escribir un dato de tipo booleano en un ujo generico.
7. Escriba un programa en C++ que lea un dato de tipo booleano (p. ej. 0) desde el
ujo de datos suministrado por el teclado usando la funcion dise nada anteriormente
en el numeral 5 y que escriba la negaci on del dato ledo previamente en la consola
usando la funci on dise nada anteriormente en el numeral 6 (p. ej. 1).
8. Escriba un programa en C++ que lea un dato de tipo booleano (p. ej. 1) desde el
ujo de datos suministrado por un archivo de entrada llamado "input.txt" usando
la funci on dise nada anteriormente en el numeral 5 y que escriba la negaci on del dato
ledo previamente en un archivo de salida llamado "output.txt" usando la funcion
dise nada anteriormente en el numeral 6 (p. ej. 0).
9. Dise nar y escribir un programa que lea los mismos n umeros enteros del archivo del
ejemplo de la secci on 7.4.4, que imprima el primer n umero en la consola, el segundo
en el archivo de salida, el tercero en la consola y el cuarto en el archivo de salida.
10. Dise nar y escribir un programa que lea los mismos n umeros enteros del archivo del
ejemplo de la secci on 7.4.4, que imprima el segundo y el tercero en el archivo de
salida.
11. Dise nar y escribir un programa que lea los mismos n umeros enteros del archivo del
ejemplo de la seccion 7.4.4, que imprima los primeros cuatro n umeros tanto en un
archivo de salida como en la consola.
116 CAP

ITULO 7. FLUJOS DE ENTRADA Y SALIDA


12. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
leer un dato de tipo car acter desde un ujo generico.
13. Modele mediante una funci on matematica y dise ne una funcion en C++ que permita
escribir un dato de tipo car acter en un ujo generico.
14. Supongase que se dispone de un archivo que contiene los siguientes caracteres sepa-
rados por el smbolo \t
a e i o u a e i o u
Dise nar un programa en C++ que lea car acter por car acter desde el ujo de datos
suministrado por el archivo usando la funci on dise nada anteriormente en el nume-
ral 12, que almacene los car acteres en variables y que luego escriba los car acteres en
orden inverso en un archivo de salida usando la funci on dise nada anteriormente en
el numeral 13, es decir, el archivo de salida tendra el siguiente aspecto
u o i e a u o i e a