Informática II

38
Informática II Clase 12: Flujos 1 Diego Fernando Serna Restrepo Semestre 2011/2

description

Informática II. Clase 12: Flujos. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Contenido. Flujos. 1. Librería Input/Output Stream. 2. Entrada y Salida de archivos. 3. 4. Argumentos de línea de comandos. Flujos. - PowerPoint PPT Presentation

Transcript of Informática II

Page 1: Informática II

Informática II

Clase 12: Flujos

1Diego Fernando Serna Restrepo Semestre 2011/2

Page 2: Informática II

Informática II 2011/22

CHISTE DEL DÍA

Page 3: Informática II

3

CONTENIDO

Informática II 2011/2

Flujos1

Librería Input/Output Stream2

3

4

Entrada y Salida de archivos

Argumentos de línea de comandos

Page 4: Informática II

4

FLUJOS

Informática II 2011/2

• C++ no define, como lenguaje, una forma de escribir datos en la pantalla o en archivos ni cómo leerlos del teclado.

• Esta funcionalidad esencial, es provista por librerías de entrada y salida E/S.

• Una librería es una colección de archivos objeto (.o en linux, .obj en windows) que se pueden enlazar con su código para incrementar su funcionalidad.

• La ventaja de esto es que se pueden escribir programas independientes de plataforma, por lo menos en teoría.

Page 5: Informática II

Informática II 2011/25

FLUJOS

Page 6: Informática II

Informática II 2011/26

ENCAPSULAMIENTO

• La librería iostream abstrae el problema modelando la entrada-salida como flujos de bytes, en serie uno tras otro, tanto de entrada como de salida.

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 y técnicos dependientes de la plataforma.

Page 7: Informática II

Informática II 2011/27

BUFFERING

Escribir o 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.

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

Page 8: Informática II

8

CONTENIDO

Informática II 2011/2

Flujos1

Librería Input/Output Stream2

3

4

Entrada y Salida de archivos

Argumentos de línea de comandos

Page 9: Informática II

Informática II 2011/29

LIBRERÍA INPUT/OUTPUT STREAM

Page 10: Informática II

Informática II 2011/210

•Clase base para flujos de entrada y salida, contiene un objeto streambuf como miembro.

ios:

•Clases derivadas de ios que especializan el comportamiento de flujos de entrada y salida respectivamente.

istream, ostream

LIBRERÍA INPUT/OUTPUT STREAM

Page 11: Informática II

Informática II 2011/211

•Clase que permite manipular buffers de flujos.

streambuf

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

iostream

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

fstream

LIBRERÍA INPUT/OUTPUT STREAM

Page 12: Informática II

Informática II 2011/212

LIBRERÍA IOSTREAM

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

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 13: Informática II

Informática II 2011/213

OBJETO CIN ISTREAM

• cin es un objeto y es responsable de las entradas por teclado a su programa , está disponible cuando usted incluye la librería iostream a su programa.

• cin claramente es un objeto global porque usted nunca lo definió en su propio código.

• Tiene el operador de extracción >> es sobrecargado, por esta razón puede ser utilizado para numerosos tipos de datos &int, &short, &float, &double, &char, char* etc.

int someVariable;cout << “Enter a number: ”;cin >> someVariable;

Istream &operator >> (int &)

Page 14: Informática II

Informática II 2011/214

OBJETO CIN ISTREAM

• Su argumento es pasado por referencia, es decir actúa sobre la variable original.

• cin automáticamente termina el string con un carácter nulo

• Es posible concatenar (extracción múltiple) pues el operador >> retorna una referencia a un objeto istream

int VarOne, varTwo, varThree;cout << “Enter three numbers: ”cin >> VarOne >> varTwo >> varThree;

La primera extracción evaluada es ( cin >> VarOne) cuya salida puede ser entrada para la siguiente.(cin >> VarOne)>> varTwo y así sucesivamente.

Page 15: Informática II

Informática II 2011/215

• El objeto cin tiene otras funciones miembro (metodos) además del operador extracción (>>) que son utilizados cuando se requiere un control más preciso en la entrada.

 • cin.get() sin argumentos:

– Esta forma retorna el valor del carácter encontrado o EOF (end-of-file) si es alcanzado el final del archivo.

– No devuelve referencia a objeto istream, de modo que no se puede concatenar. 

OBJETO CIN ISTREAM#include <iostream>using namespace std;int main(){ char ch; while ( (ch = cin.get()) != '\0') { cout << "ch: " << ch << endl; } cout << "\nDone!\n";return 0;}

Page 16: Informática II

Informática II 2011/216

• 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

OBJETO 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 17: Informática II

Informática II 2011/217

TIPS 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.

cin.get() con argumentos de entrada:arreglo de caracteres donde se almacenara los datos de entradanumero de caracteres + 1 ('\0') a alamcenarterminador de entrada, por defecto '\n'.de esta forma se llena el arreglo hasta encontrar un terminador en el flujo o se alcance el máximo especificado, el que ocurra primero. 

#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 18: Informática II

Informática II 2011/218

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

TIPS 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 19: Informática II

Informática II 2011/219

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

TIPS 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 20: Informática II

Informática II 2011/220

• 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.

TIPS 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 21: Informática II

Informática II 2011/221

• Cómo formatear datos• Alinear columnas• Escribir números en formato decimal y

hexadecimal

OBJETO 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 22: Informática II

Informática II 2011/222

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

OBJETO 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 23: Informática II

Informática II 2011/223

• 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.

OBJETO 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 24: Informática II

Informática II 2011/224

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

OBJETO 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 25: Informática II

Informática II 2011/225

BANDERAS 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:

•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.

Page 26: Informática II

Informática II 2011/226

STREAM

• Los flujos proveen una forma uniforme de manejar datos provenientes del teclado o de archivos del disco y destinados a la pantalla o a otros archivos. Provee operadores de insersión (<<) y extracción (>>).

PRINTF()

• Printf() no provee seguridad cuando se trata de tipos de datos, es muy usual que se desee imprimir un carácter y este imprima un numero y viceversa. Además no soporta clases al no estar escrito orientado a objetos.

Para dar formato a la salida en c++, se puede utilizar una combinación de caracteres especiales, manipuladores de salida y banderas.

\n—Newline character \r—Carriage return \t—Tab \\—Backslash \ddd (octal number)—ASCII character \a—Alarm (ring bell).

flush—Flushes the output buffer endl—Inserts newline character and flushes the output buffer oct—Sets output base to octal dec—Sets output base to decimal hex—Sets output base to hexadecimal\a—Alarm (ring bell).

Page 27: Informática II

27

CONTENIDO

Informática II 2011/2

Flujos1

Librería Input/Output Stream2

3

4

Entrada y Salida de archivos

Argumentos de línea de comandos

Page 28: Informática II

Informática II 2011/228

PASOS PARA TRABAJAR CON ARCHIVOS

1. Crear un stream de entrada o salida.

2. Escribir o leer según sea el caso.

3. Cerrar stream. Asegura que no se corrompan los datos y que se vacíe el buffer.

#include <fstream>#include <iostream>using namespace std;

int main() { char fileName[80]; char buffer[255]; // for user input cout << "File name: "; cin >> fileName;

ofstream fout(fileName); // open for writing fout << "This line written directly to the file...\n"; cout << "Enter text for the file: "; cin.ignore(1,'\n'); // eat the newline after the file name cin.getline(buffer,255); // get the user's input fout << buffer << "\n"; // and write it to the file fout.close(); // close the file, ready for reopen

ifstream fin(fileName); // reopen for reading cout << "Here's the contents of the file:\n"; char ch; while (fin.get(ch)) cout << ch;

cout << "\n***End of file contents.***\n";

fin.close(); // always pays to be tidy return 0; }

Page 29: Informática II

Informática II 2011/229

IFSTREAM 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.

Page 30: Informática II

Informática II 2011/230

MODIFICAR OFSTREAM

•Agrega a un archivo existente en lugar de truncarlo.

ios::app

•Lo ubica al final del archivo pero puede escribir en cualquier parte de él.

ios::ate

•Predeterminada, hace que se trunque el archivo existente.

ios::trun

•Evita que se cree un archivo nuevo, si el archivo no existe la apertura falla.

ios::nocreat

•Evita reemplazo, si el archivo ya existe la apertura falla.

ios::noreplac

#include <fstream>#include <iostream>using namespace std;

int main() {char fileName[80];char buffer[255];cout << "Please re-enter the file name: ";cin >> fileName;

ifstream fin(fileName); if (fin) // already exists? { cout << "Current file contents:\n"; char ch; while (fin.get(ch)) cout << ch; cout << "\n***End of file contents.***\n"; } fin.close();

cout << "\nOpening " << fileName << " in append mode...\n"; ofstream fout(fileName,ios::app); if (!fout) { cout << "Unable to open " << fileName << " for appending.\n"; return(1); }

cout << "\nEnter text for the file: ";cin.ignore(1,'\n');cin.getline(buffer,255);fout << buffer << "\n";fout.close();

fin.open(fileName); // reassign existing fin object!if (!fin) { cout << "Unable to open " << fileName << " for reading.\n"; return(1); } cout << "\nHere's the contents of the file:\n"; char ch; while (fin.get(ch)) cout << ch; cout << "\n***End of file contents.***\n"; fin.close(); return 0; }

if(fin) es sinonimo de if (fin.good()) y que if(!fout) es lo mismo que if (fout.fail())

Page 31: Informática II

Informática II 2011/231

TIPS 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.

Page 32: Informática II

Informática II 2011/232

ARCHIVOS BINARIOS Y ESCRITURA DE OBJETOS• Además de los archivos de texto, en los que cada

elemento es un caracter, se pueden escribir archivos binarios.

1

•Se abre un archivo como binario ios::binary

2

•Se escribe usando la función write() sobre el flujo.

3

•write() recibe una referencia al objeto, convertida a char* y el tamaño de la clase en bytes (sizeof ).

#include <fstream>#include <iostream>using namespace std;

class Animal{ public: Animal(int weight, long days):itsWeight(weight),itsNumberDaysAlive(days){} ~Animal(){} int GetWeight()const { return itsWeight; } void SetWeight(int weight) { itsWeight = weight; } long GetDaysAlive()const { return itsNumberDaysAlive; } void SetDaysAlive(long days) { itsNumberDaysAlive = days; }

private: int itsWeight; long itsNumberDaysAlive; };

int main(){ char fileName[80]; char buffer[255]; cout << "Please enter the file name: "; cin >> fileName; ofstream fout(fileName,ios::binary); if (!fout) { cout << "Unable to open " << fileName << " for writing.\n"; return(1); }

Animal Bear(50,100); fout.write((char*) &Bear,sizeof Bear); fout.close(); ifstream fin(fileName,ios::binary); if (!fin) { cout << "Unable to open " << fileName << " for reading.\n"; return(1); }

Animal BearTwo(1,1); cout << "BearTwo weight: " << BearTwo.GetWeight() << endl; cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl; fin.read((char*) &BearTwo, sizeof BearTwo); cout << "BearTwo weight: " << BearTwo.GetWeight() << endl; cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl; fin.close(); return 0; }

Page 33: Informática II

33

CONTENIDO

Informática II 2011/2

Flujos1

Librería Input/Output Stream2

3

4

Entrada y Salida de archivos

Argumentos de línea de comandos

Page 34: Informática II

Informática II 2011/234

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.

Page 35: Informática II

Informática II 2011/235

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

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.

#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 36: Informática II

36Informática II 2011/2

GRACIAS POR SU ATENCIÓN

Page 37: Informática II

37

BIBLIOGRAFÍA

• Pagina de Referencia lenguaje C++: • http://www.cplusplus.com/reference/iostre

am/• http://newdata.box.sk/bx/c/htm/ch16.htm#

Heading49• Sams Teach yourselft C++ in 21 days:

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

Informática II 2011/2

Page 38: Informática II

Informática II 2009/2

38