La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II Clase 12: Flujos Diego Fernando Serna Restrepo

Presentaciones similares


Presentación del tema: "Informática II Clase 12: Flujos Diego Fernando Serna Restrepo"— Transcripción de la presentación:

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

2 Chiste del Día Informática II /2

3 Contenido Flujos 1 Librería Input/Output Stream 2
Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II /2

4 Flujos 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. Informática II /2

5 Flujos Informática II /2

6 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. Informática II /2

7 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. Informática II /2

8 Contenido Flujos 1 Librería Input/Output Stream 2
Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II /2

9 Librería Input/Output Stream
Informática II /2

10 Librería Input/Output Stream
ios: Clase base para flujos de entrada y salida, contiene un objeto streambuf como miembro. istream, ostream Clases derivadas de ios que especializan el comportamiento de flujos de entrada y salida respectivamente. Informática II /2

11 Librería Input/Output Stream
streambuf Clase que permite manipular buffers de flujos. iostream Clase derivada de ambas istream y ostream que provee funciones para escribir en pantalla y métodos de entrada. fstream Clase que provee funcionalidad de entrada y salida sobre archivos. Informática II /2

12 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. Informática II /2

13 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 &) Informática II /2

14 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. Informática II /2

15 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; 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.  Informática II /2

16 Objeto cin Istream 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 #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; } Informática II /2

17 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 entrada numero de caracteres + 1 ('\0') a alamcenar terminador 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; } Informática II /2

18 Tips uso de Cin cin.getline(): hace lo mismo que cin.get()
Se diferencia en que cin.getline() elimina el terminador de la cadena. #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; } Informática II /2

19 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: "; cout << "String one: " << stringOne<< endl; cin.ignore(255,'\n'); cout << "String Two: " << stringTwo<< endl; return 0; } cin.ignore() se usa para limpiar el flujo de entrada, ignorando el numero de caracteres especificados hasta encontrar el terminador especificado. Informática II /2

20 Tips uso de Cin cin.peek() : cin.putback():
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. #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. Informática II /2

21 Objeto cout Ostream Cómo formatear datos Alinear columnas
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; Cómo formatear datos Alinear columnas Escribir números en formato decimal y hexadecimal #include <iostream> using namespace std; int main() { cout.put('H').put('e').put('l').put('l').put('o').put('\n'); return 0; } Informática II /2

22 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; } write(): Imprime un arreglo de caracteres hasta donde se le indique. Es similar al operador inserción (<<). Informática II /2

23 Objeto cout Ostream 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. #include <iostream> using namespace std; int main() { cout << "Start >"; cout.width(25); cout << 123 << "< End\n"; cout << 123<< "< Next >"; cout << 456 << "< End\n"; cout.width(10); cout << << "< End\n"; return 0; } Informática II /2

24 Objeto cout Ostream fill(): Normalmente cout llena los campos vacios creados por width() con espacios. fill() llena un espacio establecido con un carácter definido. #include <iostream> using namespace std; int main() { cout << "Start >"; cout.width(25); cout << 123 << "< End\n"; cout.fill('*'); return 0; } Informática II /2

25 Banderas del Iostream 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 " ; cout.width(10); cout << hex << number << endl; cout.setf(ios::left); cout.setf(ios::internal); cout << "The number is:" << setw(10)<<hex<<number<<endl; return 0; } 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. El metodo setw() es otro manipulador que permite establecer el ancho entre caracteres impresos. También se puede concatenar con el operador de inserción. Informática II /2

26 Stream Printf() Para dar formato a la salida en c++, se puede utilizar una combinación de caracteres especiales, manipuladores de salida y banderas. 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() 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. 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). \n—Newline character \r—Carriage return \t—Tab \\—Backslash \ddd (octal number)—ASCII character \a—Alarm (ring bell). Informática II /2

27 Contenido Flujos 1 Librería Input/Output Stream 2
Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II /2

28 Pasos para trabajar con Archivos
#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; } Pasos para trabajar con Archivos Crear un stream de entrada o salida. Escribir o leer según sea el caso. Cerrar stream. Asegura que no se corrompan los datos y que se vacíe el buffer. Informática II /2

29 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. Informática II /2

30 #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); Modificar Ofstream 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; ios::app Agrega a un archivo existente en lugar de truncarlo. ios::ate Lo ubica al final del archivo pero puede escribir en cualquier parte de él. ios::trun Predeterminada, hace que se trunque el archivo existente. ios::nocreat Evita que se cree un archivo nuevo, si el archivo no existe la apertura falla. ios::noreplac Evita reemplazo, si el archivo ya existe la apertura falla. if(fin) es sinonimo de if (fin.good()) y que if(!fout) es lo mismo que if (fout.fail()) Informática II /2

31 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. Informática II /2

32 Archivos Binarios y Escritura de Objetos
#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; }; Archivos Binarios y Escritura de Objetos 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"; Animal BearTwo(1,1); cout << "BearTwo weight: " << BearTwo.GetWeight() << endl; cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl; fin.read((char*) &BearTwo, sizeof BearTwo); fin.close(); return 0; 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 ). Informática II /2

33 Contenido Flujos 1 Librería Input/Output Stream 2
Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II /2

34 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. Informática II /2

35 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; Para usarlo declare main con argumentos int argc -Contador de argumentos char* argv[] -Vector de argumentos Son equivalentes: char**, char*[], char[][]. argv[0] es el nombre del programa, y  argv[1] es el primer parámetro del programa. Los nombres son convención pero pueden cambiar siempre y cuando se conserven los tipos y el orden. Informática II /2

36 GRACIAS POR SU ATENCIÓN
Informática II /2

37 Bibliografía Pagina de Referencia lenguaje C++:
Sams Teach yourselft C++ in 21 days: Informática II /2

38 Gracias ! Informática II /2


Descargar ppt "Informática II Clase 12: Flujos Diego Fernando Serna Restrepo"

Presentaciones similares


Anuncios Google