380 likes | 557 Views
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.
E N D
Informática II Clase 12: Flujos Diego Fernando Serna Restrepo Semestre 2011/2
Chiste del Día Informática II 2011/2
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
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
Flujos Informática II 2011/2
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
Buffering Informática II 2011/2
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
Librería Input/Output Stream Informática II 2011/2
Librería Input/Output Stream Informática II 2011/2
Librería Input/Output Stream Informática II 2011/2
Librería Iostream • Cuando incluimos la librería iostream, se crean e inicializan cuatro objetos estándar. Informática II 2011/2
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Tips para el manejo de Archivos Informática II 2011/2
#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
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
Para recibir argumentos en el programa Principal Informática II 2011/2
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
GRACIAS POR SU ATENCIÓN Informática II 2011/2
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
Gracias ! Informática II 2009/2