La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.

Presentaciones similares


Presentación del tema: "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."— Transcripción de la presentación:

1 Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2

2 C HISTE DEL D ÍA Informática II 2011/2 2

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

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

5 F LUJOS Informática II 2011/2 5

6 E NCAPSULAMIENTO 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 6 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.

7 B UFFERING 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 2011/2 7

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

9 L IBRERÍA I NPUT /O UTPUT S TREAM Informática II 2011/2 9

10 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 Informática II 2011/2 10 L IBRERÍA I NPUT /O UTPUT S TREAM

11 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 Informática II 2011/2 11 L IBRERÍA I NPUT /O UTPUT S TREAM

12 L IBRERÍA I OSTREAM Cuando incluimos la librería iostream, se crean e inicializan cuatro objetos estándar. Informática II 2011/2 12 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.

13 O BJETO CIN I STREAM 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. Informática II 2011/2 13 int someVariable; cout << Enter a number: ; cin >> someVariable; Istream &operator >> (int &)

14 Informática II 2011/2 14 O BJETO CIN I STREAM 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.

15 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 15 O BJETO CIN I STREAM #include using namespace std; int main() { char ch; while ( (ch = cin.get()) != '\0') { cout << "ch: " << ch << endl; } cout << "\nDone!\n"; return 0; }

16 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 Informática II 2011/2 16 O BJETO CIN I STREAM #include 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; }

17 T IPS USO DE C IN 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. Informática II 2011/2 17 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 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; }

18 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 18 T IPS USO DE C IN #include 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; }

19 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 19 T IPS USO DE C IN #include 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; }

20 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. Informática II 2011/2 20 T IPS USO DE C IN #include 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. 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.

21 Cómo formatear datos Alinear columnas Escribir números en formato decimal y hexadecimal Informática II 2011/2 21 O BJETO COUT O STREAM 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<

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

23 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 23 O BJETO COUT O STREAM #include using namespace std; int main() { cout "; cout.width(25); cout << 123 << "< End\n"; cout "; cout.width(25); cout "; cout << 456 << "< End\n"; cout "; cout.width(10); cout << << "< End\n"; return 0; }

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

25 B ANDERAS DEL I OSTREAM 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: Informática II 2011/2 25 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) <

26 S TREAM 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 ( >). Informática II 2011/2 26 P RINTF () 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. \nNewline character \rCarriage return \tTab \\Backslash \ddd (octal number)ASCII character \aAlarm (ring bell). flushFlushes the output buffer endlInserts newline character and flushes the output buffer octSets output base to octal decSets output base to decimal hexSets output base to hexadecimal\aAlarm (ring bell).

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

28 P ASOS PARA TRABAJAR CON A RCHIVOS 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. Informática II 2011/2 28 #include 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; }

29 I FSTREAM Y O FSTREAM 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 29

30 M ODIFICAR O FSTREAM 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 Informática II 2011/2 30 #include 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())

31 T IPS PARA EL MANEJO DE A RCHIVOS 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 2011/2 31

32 A RCHIVOS B INARIOS Y E SCRITURA DE O BJETOS Además de los archivos de texto, en los que cada elemento es un caracter, se pueden escribir archivos binarios. Informática II 2011/ 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 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; }

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

34 P ARA RECIBIR ARGUMENTOS EN EL PROGRAMA P RINCIPAL 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 2011/2 34

35 Para usarlo declare main con argumentos –int argc -Contador de argumentos –char* argv[] -Vector de argumentos Informática II 2011/2 35 P ARA RECIBIR ARGUMENTOS EN EL PROGRAMA P RINCIPAL 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. Son equivalentes: char**, char*[], char[][]. argv[0] es el nombre del programa, y argv[1] es el primer parámetro del programa. #include using namespace std; int main(int argc, char *argv[]) { cout << "Received " << argc << " arguments...\n"; for (int i=0; i

36 Informática II 2011/2 36

37 B IBLIOGRAFÍA Pagina de Referencia lenguaje C++: am/http://www.cplusplus.com/reference/iostre am/ Heading49http://newdata.box.sk/bx/c/htm/ch16.htm# Heading49 Sams Teach yourselft C++ in 21 days: Heading1 37 Informática II 2011/2

38 Informática II 2009/2 38


Descargar ppt "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."

Presentaciones similares


Anuncios Google