Flujos
Flujos de entrada y salida
Jonatan Gom´ez Perdomo, Ph.D.
Arles Rodr´ıguez, Ph.D.(c)
Camilo Cubides, Ph.D.(c)
Grupo de investigaci´on en vida artificial – Research Group on Artificial Life – (Alife) Departamento de Ingenier´ıa de Sistemas e Industrial
Facultad de Ingenier´ıa Universidad Nacional de Colombia
Definici´on
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Definici´on
Definici´on flujo
Definici´on
Un flujo es un objeto desde el cual se puede enviar o recibir informaci´on.
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 t´ıpicamente es enviada a la consola (pantalla) o a un archivo o una impresora u otro nodo de internet.
Los archivos son ejemplos de flujos de doble direcci´on, generalmente se puede recibir y se puede enviar informaci´on desde y hacia ellos.
Definici´on
Flujos de entrada y salida
En presentaciones anteriores ya se hab´ıa hecho uso de los flujos; con el objeto cin se recib´ıa informaci´on desde el teclado y con el objeto cout se enviaba informaci´on a la consola de salida en la pantalla. En esta
presentaci´on, adem´as de estudiar los flujos cin y cout, se tratar´a el tema de usar archivos como ejemplos de flujos de entrada y salida de
informaci´on distintos al teclado y la consola.
La jerarqu´ıa del conjunto de los flujos
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
La jerarqu´ıa del conjunto de los flujos
El conjunto de los flujos
El conjunto de todos los flujos se representar´a mediante el s´ımbolo S
el cual es una abreviaci´on de la palabra stream que es flujo en ingl´es.
El conjunto S contiene a el conjunto IOS (input output stream) de los flujos que reciben o env´ıan informaci´on, o que reciben y env´ıan
informaci´on, es decir,
IOS ⊆ S
La jerarqu´ıa del conjunto de los flujos
El conjunto de los flujos de entrada y salida
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 IF S ⊆ IS (input file stream), y el objeto cin pertenece a ´el (cin ∈ IS).
El conjunto OS a su vez contiene a el conjunto OF S ⊆ OS (output file stream), y el objeto cout pertenece a ´el (cout ∈ OS).
La jerarqu´ıa del conjunto de los flujos
Jerarqu´ıa de los flujos
En el siguiente ´arbol se muestra la jerarqu´ıa de los flujos descrita anteriormente
S
IOS
IS
IF S
⊆
cin
∈
⊆
OS
OF S
⊆
cout
∈
⊆
⊆
Los flujos en C++
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Los flujos en C++
Flujos en C++
Los flujos de entrada IS en C++ se codifican con la palabra istream.
Los flujos de entrada desde un archivo IF S en C++ se codifican con la palabra ifstream.
Los flujos de salida OS en C++ se codifican con la palabra ostream.
Los flujos de salida a un archivo OF S en C++ se codifican con la palabra ofstream.
Los flujos de entrada o salida de datos IOS en C++ se codifican 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.
Los flujos en C++
Definici´on de flujos en C++
La definici´on de flujos de entrada y salida simultanea de datos se
encuentra en C++ en la librer´ıa iostream, por esto es necesario incluir al principio de las funciones que manejan flujos esta librer´ıa, as´ı como se muestra en el siguiente encabezado de un archivo de un programa en C++
#include<iostream>
#include<cstdlib>
using namespace std;
Los flujos en C++ Lectura de datos
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Los flujos en C++ Lectura de datos
Lectura de datos I
Si se quiere leer un dato de un tipo primitivo T desde un flujo de entrada IS, entonces una funci´on que representa este procedimiento se puede escribir de la siguiente forma
leer T : IS → T
(is) 7→ a, donde a = leer (is)
La traducci´on de esta funci´on en C++ se escribe de la siguiente manera T leer_T(istream& is){
T a;
is >> a;
return a;
};
Los flujos en C++ Lectura de datos
Lectura de datos II
La funci´on leer (is) que en C++ se escribe como >>, ´esta retorna el dato siguiente que se encuentre almacenado en el flujo is.
Cuando un flujo se utiliza como par´ametro, este se pasa por referencia, es decir, que f´ısicamente no se pasa un valor como par´ametro, como en el caso de los tipos primitivos, sino que se pasa su direcci´on de memoria.
Para pasar la direcci´on de memoria de un flujo se coloca el s´ımbolo &
inmediatamente despu´es del tipo de flujo; como en el caso anterior que se escribio istream&.
Los flujos en C++ Lectura de datos
Lectura de datos III
Ejemplo
En C++ para leer un dato de tipo entero desde un flujo se utiliza la siguiente funci´on
int leer_int(istream& is){
int a;
is >> a;
return a;
};
Los flujos en C++ Lectura de datos
Lectura de datos IV
Ejemplo (continuaci´on)
1
-5
a
2
−5 -5
a
3
−5 a
Los flujos en C++ Escritura de datos
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Los flujos en C++ Escritura de datos
Escritura de datos I
Si se quiere escribir un dato de un tipo de primitivo T en un flujo 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) 7→ os, donde escribir (a, os)
La traducci´on 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;
};
Los flujos en C++ Escritura de datos
Escritura de datos II
La funci´on escribir (a, os) que en C++ se escribe como <<, ´esta escribe el dato a en el flujo os. En la funci´on escribir_T se env´ıa adicionalmente el s´ımbolo ’\t’ para separar el s´ımbolo a del siguiente dato que sea almacenado en el flujo os.
Ejemplo
En C++ para escribir un dato de tipo entero en un flujo se utiliza la siguiente funci´on
ostream& escribir_int(int a, ostream& os){
os << a;
os << ’\t’;
return os;
};
Los flujos en C++ Escritura de datos
Escritura de datos III
Ejemplo (continuaci´on)
1
−5 a
2
−5
−5 a
Los flujos en C++ Escritura de datos
Escritura de datos III
Ejemplo (continuaci´on)
3
−5
−5 a
4
-5
-5
Los flujos en C++ Ejemplo del uso de los flujos de entrada y salida est´andares
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Los flujos en C++ Ejemplo del uso de los flujos de entrada y salida est´andares
Uso de los flujos de entrada y salida est´andares I
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;
};
Los flujos en C++ Ejemplo del uso de los flujos de entrada y salida est´andares
Uso de los flujos de entrada y salida est´andares II
Ejemplo (continuaci´on)
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 . . .
Flujos de entrada y salida desde y hacia archivos
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Flujos de entrada y salida desde y hacia archivos
Flujos de entrada y salida desde y hacia archivos I
Para poder usar archivos como flujos de entrada o salida es necesario en primera instancia incluir la librer´ıa
#include<fstream>
con lo cual el encabezado de un archivo fuente de un programa en C++
que haga uso de archivos como flujos tendr´a el siguiente aspecto
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Archivos como flujos de entrada I
Para declarar que un archivo f pertenece al flujo fuente de entrada IF S (f ∈ IF S), en C++ se especifica 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 flujo de entrada en C++ y especificar la ruta de localizaci´on del archivo que sirve de flujo 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.
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Archivos como flujos de entrada II
Si se proporciona como localizaci´on "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 especifica de un archivo en Windows es necesario especificar la unidad y el directorio.
Ejemplo
Un ejemplo de la ruta de la ubicaci´on de un archivo en Windows es C:\\mis documentos\\archivo.txt
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Archivos como flujos de entrada II
Para proporcionar una ruta especifica de un archivo en Linux es necesario especificarla desde el directorio raiz.
Ejemplo
Un ejemplo de la ruta de la ubicaci´on de un archivo en Linux es /home/user/archivo.txt
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de salida
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de salida
Archivos como flujos de salida I
Para declarar que un archivo f pertenece al flujo de salida OF S
(f ∈ OF S), en C++ se especifica 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 flujo de salida en C++ y especificar la ruta de localizaci´on del archivo que sirve de flujo de salida se utiliza la siguiente sintaxis
ofstream f("<path>");
Las reglas para la especificaci´on de la ruta de localizaci´on son las mismas que se describieron para los archivos como flujos de entrada.
Flujos de entrada y salida desde y hacia archivos Cierre de los flujos desde y hacia archivos
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Flujos de entrada y salida desde y hacia archivos Cierre de los flujos desde y hacia archivos
Cierre de los flujos
Un paso necesario cuando se utilizan archivos como flujos de entrada o salida es que es necesario cerrar los archivos despu´es de utilizarlos para evitar que al ser abiertos queden bloqueados para ser usados por otras aplicaciones o que al escribir la informaci´on 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 flujo que se creo con el archivo especificado.
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Agenda
1 Definici´on
2 La jerarqu´ıa del conjunto de los flujos
3 Los flujos en C++
Lectura de datos Escritura de datos
Ejemplo del uso de los flujos de entrada y salida est´andares
4 Flujos de entrada y salida desde y hacia archivos Uso de archivos como flujos de entrada
Uso de archivos como flujos de salida Cierre de los flujos desde y hacia archivos
Ejemplo del uso de archivos como flujos de entrada y salida
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo
Suponga que se dispone del archivo de texto plano entrada.txt con las siguiente informaci´on
0 1 2 3 4 5
y se quieren leer algunos datos con el fin de copiar los primeros 4 enteros del archivo al archivo salida.txt, esto se podr´ıa hacer utilizando el siguiente programa
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo (continuaci´on)
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo (continuaci´on)
int leer_int(istream& is){
int a;
is >> a;
return a;
};
ostream& escribir_int(int a, ostream& os){
os << a;
os << ’\t’;
return os;
};
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo (continuaci´on) 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;
};
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo (continuaci´on)
La salida de dicho programa ser´a:
Presione una tecla para continuar . . .
y se generar´a el archivo salida.txt con el siguiente contenido:
0 1 2 3
Flujos de entrada y salida desde y hacia archivos Ejemplo del uso de archivos como flujos de entrada y salida
Ejemplo (continuaci´on)
Esta declaraci´on de flujo 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 caracteres especiales: ’\t’, ’\n’, ’ ’. En la tercera l´ınea de la funci´on main se lee el entero 0, y se imprime en el flujo de salida junto con un s´ımbolo ’\t’, a partir de la cuarta l´ınea hasta la sexta l´ınea se realizan id´enticas operaciones, pero con los valores 1, 2 y 3, respectivamente. A continuaci´on se proceden a cerrar los flujos.