1 / 38

Informática II

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.

malha
Download Presentation

Informática II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  3. Contenido Flujos 1 LibreríaInput/Output Stream 2 Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II 2011/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 2011/2

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

  7. Buffering Informática II 2011/2

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

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

  10. Librería Input/Output Stream Informática II 2011/2

  11. Librería Input/Output Stream Informática II 2011/2

  12. Librería Iostream • Cuando incluimos la librería iostream, se crean e inicializan cuatro objetos estándar. Informática II 2011/2

  13. Objeto cinIstream • 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. • intsomeVariable; • cout << “Enter a number: ”; • cin >> someVariable; • Istream &operator >> (int &) Informática II 2011/2

  14. Objeto cinIstream • 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 • intVarOne, 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 2011/2

  15. Objeto cinIstream • #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 2011/2

  16. Objeto cinIstream • 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 2011/2

  17. Tips uso de Cin • 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. • 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. • #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 2011/2

  18. 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; • } • cin.getline(): • hace lo mismo que cin.get() • Se diferencia en que cin.getline() elimina el terminador de la cadena. Informática II 2011/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: "; • 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; • } • cin.ignore() se usa para limpiar el flujo de entrada, ignorando el numero de caracteres especificados hasta encontrar el terminador especificado. Informática II 2011/2

  20. 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; • } • 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. 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 2011/2

  21. Objeto coutOstream • 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 2011/2

  22. Objeto coutOstream • #include <string.h> • #include <iostream> • using namespace std; • int main() • { • char One[] = "One if by land"; • intfullLength = strlen(One); • inttooShort = fullLength -4; • inttooLong = 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 2011/2

  23. Objeto coutOstream • #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; • } • 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. Informática II 2011/2

  24. Objeto coutOstream • 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 << "Start >"; • cout.width(25); • cout.fill('*'); • cout << 123 << "< End\n"; • return 0; • } Informática II 2011/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 " << 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; • } • ios::showpoint • ios::showpos • ios::dec • ios::oct • ios::hex • ios::left • ios::right • ios::internal. • 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: El metodosetw() 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 2011/2

  26. Printf() 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 (>>). • Para dar formato a la salida en c++, se puede utilizar una combinación de caracteres especiales, manipuladores de salida y banderas. • 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 2011/2

  27. Contenido Flujos 1 LibreríaInput/Output Stream 2 Entrada y Salida de archivos 3 4 Argumentos de línea de comandos Informática II 2011/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; • ofstreamfout(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; • } • 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 2011/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 2011/2

  30. 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; • } Modificar Ofstream • #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"; • ofstreamfout(fileName,ios::app); • if (!fout) • { • cout << "Unable to open " << fileName << " for appending.\n"; • return(1); • } if(fin) es sinonimo de if (fin.good()) y que if(!fout) es lo mismo que if (fout.fail()) Informática II 2011/2

  31. Tips para el manejo de Archivos Informática II 2011/2

  32. #include <fstream> • #include <iostream> • using namespace std; • class Animal{ • public: • Animal(int weight, long days):itsWeight(weight),itsNumberDaysAlive(days){} • ~Animal(){} • intGetWeight()const { return itsWeight; } • void SetWeight(int weight) { itsWeight = weight; } • long GetDaysAlive()const { return itsNumberDaysAlive; } • void SetDaysAlive(long days) { itsNumberDaysAlive = days; } • private: • intitsWeight; • long itsNumberDaysAlive; • }; • int main(){ • char fileName[80]; • char buffer[255]; • cout << "Please enter the file name: "; • cin >> fileName; • ofstreamfout(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, sizeofBearTwo); • cout << "BearTwo weight: " << BearTwo.GetWeight() << endl; • cout << "BearTwo days: " << BearTwo.GetDaysAlive() << endl; • fin.close(); • return 0; • } 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. Informática II 2011/2

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

  34. Para recibir argumentos en el programa Principal Informática II 2011/2

  35. Para recibir argumentos en el programa Principal • #include <iostream> • using namespace std; • int main(intargc, char *argv[]) { • cout << "Received " << argc << " arguments...\n"; • for (inti=0; i<argc; i++){ • cout << "argument " << i << ": " << argv[i] << endl; • } • return 0; • } • Para usarlo declare main con argumentos • intargc -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 2011/2

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

  37. Bibliografía • Pagina de Referencia lenguaje C++: • http://www.cplusplus.com/reference/iostream/ • http://newdata.box.sk/bx/c/htm/ch16.htm#Heading49 • SamsTeach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1 Informática II 2011/2

  38. Gracias ! Informática II 2009/2

More Related