sesión 08: flujo de datos 1. 2009/1 circuitos digitales iii 2010/1 circuitos digitales iii 2010/1...

53
Informática II Sesión 08: Flujo de datos 1

Upload: miguel-angel-villalobos-torregrosa

Post on 02-Feb-2016

228 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

1

Informática IISesión 08: Flujo de datos

Page 2: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

ContenidoContenido

2

Introducción1

Entrada y Salida de archivos2

3 Argumentos de línea de comandos

Page 3: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

3

El almacenamiento de datos en las variables de nuestros programas es temporal. Al terminar todos los datos se pierden.

Para la conservación permanente de grandes datos: Se utilizan el almacenamiento en archivos

Page 4: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

4

C++ ve cada uno de los archivos como: Flujo secuencial de bytes.

hola mundo 68 6F 6C 61 20 6D 75 6E 64 6F

Mensaje Mensaje en C++

0 1 2 3 4 5

… n-1

Page 5: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

5

Cada archivo termina con un marcador de fin de archivo o de un número específico de bytes.

Al empezar la ejecución de un programa automáticamente se abren tres entornos y sus flujos asociados: Entrada estándar: Permite que un programa lea

datos por teclado. Salida estándar: permite que un programa imprima

datos en la pantalla. Error estándar: Indicador de errores.

Page 6: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

6

Capturar

Leer Guardar

Visualizar

Los flujos proporcionan canales de comunicación entre los archivos y los programas

Page 7: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

7

De manera estricta, C++ no define directamente una forma de escribir datos en la pantalla o en archivos ni cómo leerlos del teclado.

Entonces quién provee esta funcionalidad esencial? Ésta es provista por bibliotecas de entrada y salida

E/S.

Page 8: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

IntroducciónIntroducción

8

Recordemos: Biblioteca es una colección de archivos objeto que

se pueden enlazar con nuestro código para incrementar su funcionalidad.

Ventaja: Se pueden escribir programas independientes de

plataforma, por lo menos en teoría.

Page 9: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

ContenidoContenido

9

Introducción1

Entrada y Salida de archivos2

3 Argumentos de línea de comandos

Page 10: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia10

Jerarquía StreamJerarquía Stream

Page 11: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

•Clase derivada de ambas istream y ostream que provee funciones para escribir en pantalla y métodos de entrada.

iostream•Clase

que permite manipular buffers de flujos.

streambuf

•Clase que provee funcionalidad de entrada y salida sobre archivos.

fstream

11

Librería Input/Output StreamLibrería Input/Output Stream

Page 12: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Entrada y Salida de archivosEntrada y Salida de archivos

12

iostream

Page 13: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

iostreamiostream La librería iostream abstrae el problema del ingreso y

salida de datos, modelando la entrada-salida como flujos de bytes, en serie uno tras otro, tanto de entrada como de salida.

Cuando incluimos la librería iostream, se crean e inicializan cuatro objetos estándar.

13

cin manipula la entrada estándar, el teclado.

cout manipula la salida estándar, la pantalla.

cerr manipula salida sin buffer al dispositivo estándar de error, la pantalla.

clog manipula salida con buffer al dispositivo estándar de error.

Page 14: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

iostreamiostream

14

1

•Encapsula el problema con operadores de extracción e inserción de flujo.

2

•operador de inserción << , el flujo es de salida.

3

•operador de extracción, >> , el flujo es de entrada

4

•Encapsula los detalles técnicos dependientes de la plataforma.

Page 15: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Objeto cin IstreamObjeto cin Istream cin

Es un objeto global Responsable de las entradas por teclado Disponible al incluir la librería iostream a su programa. operador de extracción >> es sobrecargado

cout Es un objeto global Responsable de mostrar en pantalla Disponible al incluir la librería iostream a su programa. operador de inserción << es sobrecargado.

15

Page 16: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Entrada y Salida de archivosEntrada y Salida de archivos

16

streambuf

Page 17: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

BuffersBuffers Escribir o leer datos en el disco y en menor

medida en la pantalla, es lento respecto a la velocidad del procesador.

Para resolver esto se pueden usar buffers, almacenamiento de memoria temporal que se llenan desde el programa sin tener que detener la ejecución hasta que se escriba dato por dato, y pueden ser vaciados independientemente por el sistema de salida.

17

Page 18: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

BuffersBuffers Aplicaciones:

Buffer de teclado: memoria intermedia en la que se van almacenando los caracteres que un usuario teclea.

Buffer de Audio o video: streaming por Internet. Buffer grabadoras de DVD: tienen un buffer para que

no se pare la grabación.

Ejemplo análogo, tanque con válvulas de entrada y salida.

18

Page 19: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

streambufstreambuf La librería streambuf proporciona el interfaz

entre los datos y las áreas de almacenamiento como la memoria o los dispositivos físicos.

Sin embargo las aplicaciones necesitan acceder al buffer de un stream, lo hacen a través del puntero almacenado en la clase ios. acceso desde funciones superiores (ios) y sus clases

derivadas, y casi nunca directamente a través de streambuf.

19

Page 20: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Entrada y Salida de archivosEntrada y Salida de archivos

20

fstream

Page 21: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

fstreamfstream La libreria fstream proporciona una interfaz

para leer y escribir datos a partir de flujos de entrada y salida de archivos.

Los objetos de esta clase mantiene internamente un puntero a un objeto tipo filebuf. La clase filebuf se basa en la clase streambuf, y le

proporciona las funciones necesarias para manipular entrada y salida de caracteres en ficheros.

21

Page 22: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

fstreamfstream Las clases que nos da C++ para el acceso a

ficheros de texto son:

ifstream: clase disponible para leer del archivo ( i de input, f de file y stream).

ofstream: clase para escribir (o de output, f de file y stream).

fstream: sirve para las ambas tareas, lectura y escritura.

22

Page 23: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

fstreamfstream Algunos parametros que podemos usar dentro

de las clases fstream: app (append): Para añadir al final del fichero binary (binary) Se abre el fichero como fichero

binario. in (input) El fichero se abre para lectura. out (output) El fichero se abre para escritura trunc (truncate) Si el fichero existe, se ignora su

contenido y se empieza como si estuviera vacio.

23

Page 24: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir Archivo Modo LecturaAbrir Archivo Modo Lectura La apertura del fichero se puede hacer pasando

parámetros al declarar la variable de estos tipos, o bien declarando la variable sin parámetros y luego llamando al método open().

24

ifstream variable(“NombreArchivo");

ifstream variable;variable.open();

Page 25: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir ArchivosAbrir Archivos

25

#include <iostream>

#include <fstream>

using namespace std;

int main (void) {

char cadena[128];

//Abre un fichero de entrada

ifstream fe("nombre.txt");

fe.getline(cadena, 128);

cout << cadena << endl;

fe.close();

return 0;

}

#include <iostream>

#include <fstream>

using namespace std;

int main (void) {

char cadena[128];

//Abre un fichero de entrada

ifstream fe("nombre.txt");

while(!fe.eof()){

fe >> cadena;

cout << cadena << endl;

}

fe.close();

return 0;

}

Page 26: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir Archivo Modo Escritura Abrir Archivo Modo Escritura La apertura del fichero se puede hacer pasando

parámetros al declarar la variable de estos tipos, o bien declarando la variable sin parámetros y luego llamando al método open().

26

ofstream variable(“NombreArchivo");

ofstream variable;Variable.open();

Page 27: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir ArchivosAbrir Archivos

27

#include <iostream>

#include <fstream>

using namespace std;

int main (void) {

// Crea un fichero de salida

ofstream fs("nombre.txt");

fs << "Hola mundo" << endl;

fs.close();

return 0;

}

#include <iostream>

#include <fstream>

using namespace std;

int main (void) {

// Crea un fichero de salida

ofstream fs("nombre.dat");

fs .write(“Hola Mundo”,20);

fe.close();

return 0;

}

Page 28: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir Archivo Aleatoriamente Abrir Archivo Aleatoriamente Los ejemplo mostrados leen o a escriben desde

el principio, y avanzan a medida que se lee o se escribe en ellos. Entonces como hacemos para poder hacer lecturas o

escrituras en cualquier punto del fichero??

Para eso disponemos de las funciones: seekp: cambia la posición en la siguiente escritura. seekg: cambia la posición en la siguiente lectura. tellp: indica la posición en la que nos encontramos. tellg: indica la posición del fichero en la que nos

encontramos.

28

Page 29: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir Archivo Aleatoriamente Abrir Archivo Aleatoriamente Algunos parametros que podemos usar detro de

estas funciones: ios::beg solicitar desplazamiento respecto al

principio del archivo ios::cur solicitar desplazamiento respecto a la

posición actual dentro del archivo ios::end solicitar desplazamiento respecto al final del

archivo

29

Page 30: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir ArchivosAbrir Archivos

30

#include <iostream>#include <fstream>using namespace std; int main() { int i, pos; char mes[][20] = {“Ene", “Feb“,

“Mar“,"Abr","May“,"Jun“,"Jul","Ago“, "Sep“,"Oct“,"Nov“,"Dic"};

char cad[20]; ofstream fsalida("meses.dat"); cout << "Crear archivo de nombres de

meses:" << endl; for(i = 0; i < 12; i++) fsalida.write(mes[i], 20); fsalida.close();

ifstream fentrada("meses.dat");cout << "\nAcceso1" << endl;fentrada.read(cad, 20);do { cout << cad << endl; fentrada.read(cad, 20);} while(!fentrada.eof());fentrada.clear();

cout << "\nAcceso2:" << endl;for(i = 11; i >= 0; i--) { fentrada.seekg(20*i); fentrada.read(cad, 20); cout << cad; pos = fentrada.tellg(); cout << " - " << pos/20 <<

endl; }return 0;}

Page 31: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir Archivo Modo E/S Abrir Archivo Modo E/S Es posible trabajar con un stream

simultáneamente en entrada y salida.

La clase fstream: derivada de ifstream y ofstream, dispone de todas las funciones necesarias para

realizar cualquier operación de entrada o salida.

31

Page 32: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Abrir ArchivosAbrir Archivos

32

#include <iostream>#include <fstream>using namespace std;int main() { char l; long i, lon; fstream fich("prueba.dat", ios::in | ios::out | ios::trunc |

ios::binary); fich << "abracadabra"; fich.seekg(0, ios::end); lon = fich.tellg();

cout << "Salida:" << endl; fich.seekg(0); for(i = 0; i < lon; i++) { fich.get(l); cout << l; } cout << endl; fich.close(); return 0;}

for(i = 0; i < lon; i++) { fich.seekg(i); fich.get(l); if(l == 'a') { fich.seekp(i); fich << 'e'; }}

Page 33: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Comprobación de ArchivosComprobación de Archivos Cuando estemos trabajando en la manipulación

de archivos, en ocasiones se hace necesario visualizar el estado en el que se encuentren.

Podemos hacer uso de las banderas: good(): si el stream con el que estamos trabajando está en un

estado de error. fail(): Devuelve true si la lectura o la escritura operación falla o

en el caso de que ocurra un error de formato. bad(): Devuelve true si la lectura o la escritura operación falla. clear(): Elimina el estado de error eof(): Devuelve true si un archivo abierto para la lectura ha

llegado al final.

33

Page 34: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Ifstream y OfstreamIfstream y Ofstream Cuando se crea un flujo de archivo de salida, el

comportamiento predeterminado es: Se crea uno nuevo si no existe Se trunca, borra y sobre-escribe si el archivo ya

existe.

Este modo se puede modificar Para agregar al archivo original (append) Para no crear un archivo nuevo, en este caso si el

archivo no existe la apertura falla.

34

Page 35: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Tips para el manejo de ArchivosTips para el manejo de Archivos

1

•Chequee todos los archivos que se abren para verificar que se abrieron exitosamente.

2

•Reutilice objetos ifstream y ofstream existentes.

3

•Cierre todos los fstream cuando termine de usarlos.

35

Page 36: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

ContenidoContenido

36

Flujos1

Librería Input/Output Stream2

3 Argumentos de línea de comandos

Page 37: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Para recibir argumentos en el programa Principal

Para recibir argumentos en el programa Principal

Los argumentos estan separados por espacios incluyendo el nombre

del programa.

algunPrograma arg1 arg2

El nombre del programa es el primer argumento.

37

Page 38: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Para usarlo declare main con argumentos int argc -Contador de argumentos char* argv[] -Vector de argumentos

38

Para recibir argumentos en el programa Principal

Para recibir argumentos en el programa Principal

Los nombres son convención pero pueden cambiar siempre y cuando se conserven los tipos y el orden.

• Son equivalentes: char**, char*[], char[][].

• argv[0] es el nombre del programa, y  argv[1] es el primer parámetro del programa.

Page 39: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia39

Para recibir argumentos en el programa Principal

Para recibir argumentos en el programa Principal

#include <iostream>using namespace std;int main(int argc, char *argv[]) { cout << "Received " << argc << " arguments...\n";

for (int i=0; i<argc; i++){ cout << "argument " << i << ": " << argv[i] << endl;

}return 0;}

Page 40: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia40

GRACIAS POR SU ATENCIÓN

Page 41: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

BibliografíaBibliografía Pagina de Referencia lenguaje C++: http://www.cplusplus.com/reference/iostream/ http://newdata.box.sk/bx/c/htm/ch16.htm#Headin

g49 Sams Teach yourselft C++ in 21 days:

http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1

41

Page 42: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

AnexoAnexo

Informática II 2011/2 42

cin1

cout2

Page 43: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

cin.get() con referencia a carácter: Cuando una referencia a carácter (variable) se le

pasa a cin.get(), esta se llena con el siguiente carácter en el flujo de entrada.

Nuevamente es posible concatenar

43

Objeto cin IstreamObjeto cin Istream

#include <iostream> using namespace std; int main() { char a, b, c; cout << "Enter three letters: "; cin.get(a).get(b).get(c); cout << "a: " << a << "\nb: " << b << "\nc: " << c << endl; return 0; }

Page 44: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Tips uso de CinTips uso de Cin Use el operador de extracción (>>) cuando necesite saltar espacios en blanco.

Use cin.get() si necesita examinar todos los caracteres incluyendo los espacios en blanco.

44

#include <iostream> using namespace std;

int main() { char stringOne[256]; char stringTwo[256];

cout << "Enter string one: "; cin.get(stringOne,256); cout << "stringOne: " << stringOne << endl;

cout << "Enter string two: "; cin >> stringTwo; cout << "StringTwo: " << stringTwo << endl; return 0; }

Page 45: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

cin.getline(): hace lo mismo que cin.get()Se diferencia en que cin.getline() elimina el terminador de la cadena.

45

Tips uso de CinTips uso de Cin #include <iostream> using namespace std;

int main() { char stringOne[256]; char stringTwo[256]; char stringThree[256];

cout << "Enter string one: "; cin.getline(stringOne,256); cout << "stringOne: " << stringOne << endl;

cout << "Enter string two: "; cin >> stringTwo; cout << "stringTwo: " << stringTwo << endl;

cout << "Enter string three: "; cin.getline(stringThree,256); cout << "stringThree: " << stringThree << endl; return 0; }

Page 46: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

cin.ignore() se usa para limpiar el flujo de entrada, ignorando el numero de caracteres especificados hasta encontrar el terminador especificado.

46

Tips uso de CinTips uso de Cin#include <iostream>using namespace std;

int main(){ char stringOne[255]; char stringTwo[255];

cout << "Enter string one:"; cin.getline(stringOne,255); cout << "String one" << stringOne << endl; cout << "Enter string two: "; cin.getline(stringTwo,255); cout << "String two: " << stringTwo << endl;

cout << "\n\nNow try again...\n";

cout << "Enter string one: "; cin.getline(stringOne,255); cout << "String one: " << stringOne<< endl;

cin.ignore(255,'\n'); cout << "Enter string two: "; cin.getline(stringTwo,255); cout << "String Two: " << stringTwo<< endl;

return 0;}

Page 47: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

cin.peek() : Permite acceder al buffer permitiendo ver su interior

sin necesidad de cargar el carácter en otra variable

cin.putback(): Permite acceder al buffer y modificar el carácter de

turno.

47

Tips uso de CinTips uso de Cin#include <iostream>using namespace std;

int main(){ char ch; cout << "enter a phrase: "; while ( cin.get(ch) ) { if (ch == '!') cin.putback('$'); else cout << ch; while (cin.peek() == '#') cin.ignore(1,'#'); }return 0;}

Estos dos últimos métodos resultan útiles porque permiten mirar los caracteres y dejarlos en el flujo de entrada.Este tipo de trucos se usan cuando se pasa texto a otro tipo de datos. Por ejemplo, en un compilador.

Page 48: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

AnexoAnexo

48

cin1

cout2

Page 49: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia49

Objeto cout OstreamObjeto cout Ostream•flush(): Escribe todo lo que haya en el buffer en la pantalla. endl llama a flush() automáticamente.Este método es conveniente cuando se debe estar seguro que el buffer esta vacio y sus contenidos son mostrados en pantalla.

•put(): Imprime un solo carácter en pantalla, también se puede concatenar.

cout<<flush;cout.flush();cout<<endl;

#include <iostream>using namespace std;

int main(){ cout.put('H').put('e').put('l').put('l').put('o').put('\n'); return 0; }

Page 50: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

write(): Imprime un arreglo de caracteres hasta donde se le indique. Es similar al operador inserción (<<).

50

Objeto cout OstreamObjeto cout Ostream#include <string.h> #include <iostream> using namespace std;

int main(){ char One[] = "One if by land";

int fullLength = strlen(One); int tooShort = fullLength -4; int tooLong = fullLength + 6;

cout.write(One,fullLength) << "\n"; cout.write(One,tooShort) << "\n"; cout.write(One,tooLong) << "\n"; return 0;}

Page 51: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

width():El espacio por defecto de la salida es apenas suficiente para imprimir el carácter en la salida.

width() Genera un espacio en el buffer entre caracteres. Este solo cambia el ancho de la salida próxima y luego inmediatamente vuelve a su valor por defecto.

51

Objeto cout OstreamObjeto cout Ostream #include <iostream> using namespace std; int main() { cout << "Start >"; cout.width(25); cout << 123 << "< End\n";

cout << "Start >"; cout.width(25); cout << 123<< "< Next >"; cout << 456 << "< End\n";

cout << "Start >"; cout.width(10); cout << 123456 << "< End\n";

return 0; }

Page 52: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

fill(): Normalmente cout llena los campos vacios creados por width() con espacios. fill() llena un espacio establecido con un carácter definido.

52

Objeto cout OstreamObjeto cout Ostream

#include <iostream>using namespace std;

int main(){ cout << "Start >"; cout.width(25); cout << 123 << "< End\n";

cout << "Start >"; cout.width(25); cout.fill('*'); cout << 123 << "< End\n";return 0;}

Page 53: Sesión 08: Flujo de datos 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Banderas del IostreamBanderas del Iostream Usted puede acceder a dichas banderas con el

método o manipulador setf(), y llevando como argumento las siguientes constantes puede dar formato a la salida en pantalla:

53

•ios::showpoint•ios::showpos•ios::dec•ios::oct•ios::hex•ios::left•ios::right• ios::internal.

int main() { const int number = 185; cout << "The number is " << number << endl;

cout << "The number is " << hex << number << endl;

cout.setf(ios::showbase); cout << "The number is " << hex << number << endl;

cout << "The number is " ; cout.width(10); cout << hex << number << endl;

cout << "The number is " ; cout.width(10); cout.setf(ios::left); cout << hex << number << endl;

cout << "The number is " ; cout.width(10); cout.setf(ios::internal); cout << hex << number << endl;

cout << "The number is:" <<

setw(10)<<hex<<number<<endl; return 0; }También se puede concatenar con el operador de

inserción.

El metodo setw() es otro manipulador que permite establecer el ancho entre caracteres impresos.