Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UESFIAEIEPEL115
1/12
PROGRAMACIN I
Gua de Laboratorio #1 Tema: E/S en C++
Profesor:
Instructor:
CICLOII2012
Gua#1
UESFIAEIEPEL115
2/12
INTRODUCCIN:
La presente gua incluye los temas entrada / salida con formato y archivos secuenciales en C++. Se presentan las clases, funciones miembros, indicadores y manipuladores usados para generar reportes en el monitor o en algn archivo, todo esto se encuentra en un pequeo marco terico. Adems se hace uso de cuatro ejemplo que sealan la ruta hacia el dominio de la entrada y salida en C++.
OBJETIVOS:
Al finalizar esta practica de laboratorio el estudiante debe ser capaz de: Utilizar las clases de entrada y salida con formato junto con todos las ordenes de formato, indicadores, manipuladores. Abrir, escribir, leer, cerrar archivos secuenciales de texto o binarios.
CICLOII2012
Gua#1
UESFIAEIEPEL115
3/12
Indicadores de entrada/salida
Cada flujo de C++ tiene asociados unos indicadores, que son unas variables miembro enum de tipo long que controlan el formato al activarse o desactivarse alguno de sus bits. Dichos bits y su significado son los siguientes: skipws: left: right: internal: dec: oct: hex: showbase: showpoint: uppercase : showpos: scientific: fixed: unitbuf: stdio se descartan los blancos iniciales a la entrada la salida se alinea a la izquierda la salida se alinea a la derecha se alinea el signo y los caracteres indicativos de la base por la izquierda y las cifras por la derecha salida decimal para enteros (defecto) salida octal para enteros salida hexadecimal para enteros se muestra la base de los valores numricos se muestra el punto decimal los caracteres de formato aparecen en maysculas se muestra el signo (+) en los valores positivos notacin cientfica para coma flotante notacin normal para coma flotante. salida sin buffer (se vuelca cada operacin) permite compatibilizar entrada / salida al modo de C con <stdio.h> y al modo de C++ con <iostream.h>.
La forma de definir las constantes anteriores permite componerlas fcilmente, guardando toda la informacin sobre ellas en una nica variable long. Existen unos indicadores adicionales (adjustfield, basefield y floatfield) que actan como combinaciones de los anteriores (mscaras): adjustfield es una combinacin excluyente (slo una en on) de left, rigth e internal basefield es una combinacin excluyente (slo una en on) de dec, oct e hex floatfield es una combinacin excluyente (slo una en on) de scientific y fixed Por defecto todos los indicadores anteriores estn desactivados, excepto skipws y dec.
Gua#1
UESFIAEIEPEL115
4/12
Se permite activar varios indicadores a la vez con el operador lgico OR binario. Ejemplo: cout.setf(ios::showpoint | ios::fixed);
Es necesario determinar el flujo afectado (cout) y la clase en la que estn definidos los indicadores (ios). Para desactivar los indicadores se utiliza la funcin unsetf() de modo similar a setf(). El segundo prototipo se debe utilizar para cambiar los indicadores que son exclusivos, como por ejemplo: cout.setf(ios::left, ios::adjustfield); que lo que hace es desactivar los tres bits que tienen que ver con la alineacin y despus activar el bit de alineacin por la izquierda. En la forma, cout.setf(0, ios::adjustfield); pone los tres bits de alineacin a cero.
La funcin flags() sin argumentos devuelve un long con la configuracin de todos los indicadores. Su prototipo es: long flags(); Existe otra definicin de la funcin flags() cuyo valor de retorno es un long con la configuracin anterior, que permite cambiar todos los indicadores a la vez, pasando un long con la nueva configuracin como argumento: long flags(long indic); donde indic contiene una descripcin completa de la nueva configuracin. El inconveniente de la funcin flags() es que establece una nueva configuracin partiendo de cero, mientras que setf() simplemente modifica la configuracin anterior manteniendo todo lo que no se ha cambiado explcitamente, por lo que debe ser considerada como una opcin ms segura. Se presenta a continuacin un ejemplo con todo lo citado hasta ahora: // se mostrar el signo + para nmeros positivos cout.setf(ios::showpos); // se mostrar el punto y no se utilizar notacin cientfica cout.setf(ios::showpoint | ios::fixed); cout << 100.0; que hace que se escriba por pantalla: +100.000000
CICLOII2012
Gua#1
UESFIAEIEPEL115
5/12
Gua#1
UESFIAEIEPEL115
6/12
Los manipuladores de entrada / salida ms utilizados se citan a continuacin: dec, hex y oct: establecen base para enteros ws: se saltan los blancos iniciales endl: se imprime un '\n' y se vaca el buffer de salida flush: se vaca el buffer de salida setw(int w): establece la anchura mnima de campo setprecision(int p): establece el nmero de cifras setfill(char ch ): establece el carcter de relleno setiosflag(long i) equivale al indicador setf() unsetiosflag(long i) equivale a unsetf() Un manipulador se utiliza de la forma: cout << hex << 100; cout << setw(10) << mat[i][j] << endl; El efecto de los manipuladores permanece en el flujo correspondiente hasta que se cambian por otro manipulador, a excepcin de setw() que hay que introducirlo en el flujo antes de cada dato al que se le quiera aplicar esa anchura de campo.
Manejo de Archivos
Para poder leer desde o escribir en Archivos (lectura / escritura de datos en unidades de almacenamiento permanente como los disquetes, discos duros, etc.), se debe incluir la librera <fstream.h>. En esta librera se definen las clases necesarias para la utilizacin de Archivos, que son ifstream, ofstream y fstream. Antes de abrir un Archivo hay que crear un flujo, es decir un objeto de las clases ifstream, ofstream o fstream e indicar el modo de apertura (lectura, escritura, lectura y escritura, etc.). Los modos en los que se puede abrir un Archivo son: ios::append ios::in ios::out aadir datos al final del Archivo abrir Archivo para leer datos abrir Archivo para escribir datos
Por ejemplo para abrir un Archivo para lectura de datos creando un fstream Archivo: fstream Archivo; Archivo.open("datos.dat", ios::in); y para escritura en ese mismo Archivo: fstream Archivo; Archivo.open("datos.dat", ios::out); Las clases ifstream y ofstream tienen tambin constructores que permiten abrir Archivos de forma automtica ifstream Archivo("datos.dat"); donde se sobreentiende que el Archivo se abre para lectura por haber utilizado ifstream. Si se hubiese utilizado ofstream el Archivo se hubiera abierto para escritura.
CICLOII2012
Gua#1
UESFIAEIEPEL115
7/12
int gcount();
La mayor parte de las funciones anteriores devuelven una referencia al flujo de entrada o de salida. Como se ver un poco ms adelante, esta referencia puede utilizarse para detectar errores o la condicin de fin de Archivo. Para conocer con ms detalle cmo se utilizan ests funciones acudir a alguno de los textos de C++.
Gua#1
UESFIAEIEPEL115
8/12
CICLOII2012
Gua#1
UESFIAEIEPEL115
9/12
EJEMPLOS.
Digite, compile y ejecute cada uno de los siguientes ejemplos.
CICLOII2012
Gua#1
UESFIAEIEPEL115
10/12
8. int main() 9. { 10. float x[NPUNTOS], y[NPUNTOS], 11. ymin=MAXFLOAT, ymax=-MAXFLOAT, 12. xmin, xmax; 13. cout<<"Introduzca el limite inferior de x: "; 14. cin>>xmin; 15. cout<<"Introduzca el limite superior de x: "; 16. cin>>xmax; 17. /*llenar vectores y determinar maximo y minimo de la funcion*/ 18. for (int i=0;i<NPUNTOS;i++) 19. { 20. x[i] = xmin+(xmax-xmin)/(NPUNTOS-1)*i; 21. y[i] = FUNCION(x[i]); 22. ymax = (y[i]>ymax) ? y[i]:ymax; 23. ymin = (y[i]<ymin) ? y[i]:ymin; 24. } 25. // alineacion a la derecha, formato en notacion cientifica, 26. // caracteres de formato en mayusculas y mostrar signo positivo 27. cout.setf(ios::right|ios::scientific|ios::uppercase|ios::showpos); 28. //escribir cabeceras 29. cout <<setfill(' ') 30. <<setw(6)<<"x" 31. <<setw(11)<<"f(x)" 32. <<setw(35)<<"grafico" 33. <<endl; 34. for (int i=0;i<NPUNTOS;i++) 35. { 36. cout<<'|'; 37. cout.width(9); //ancho de campo 9 38. cout.precision(2); //precision 2 39. cout.fill(' ');// llenar con blancos 40. cout<<x[i]<<'|'; 41. cout.width(9); //ancho de campo 9 42. cout.precision(2); //precision 2 43. cout.fill(' '); // llenar con blancos 44. cout<<y[i]<<'|'; 45. // el ancho del campo varia de acuerdo al valor de y[i] 46. // siendo 0 para y[i]=ymin y 52 cuando y[i]=ymax 47. cout.width( ( int ) 52 /(ymax-ymin)*(y[i]-ymin) ); 48. cout.fill(' '); // llenar con blancos 49. cout<<"*"<<endl; 50. } 51. return 0; 52. }
CICLOII2012
Gua#1
UESFIAEIEPEL115
11/12
CICLOII2012
Gua#1
UESFIAEIEPEL115
12/12
22. // Crear o sobreescribir el Archivo de salida 23. fs.open(argv[2], ios::out); 24. if( !fs ){ 25. cout << "El Archivo " << argv[2] << " no puede ser creado." << endl; 26. fe . close( ); 27. return 1; 28. } 29. // Bucle de copia: 30. do { 31. fe.read( buffer, 2048 ) ;//leer del archivo de entrada al buffer 32. //escribir el buffer en el archivo de salida 33. fs . write(buffer,fe.gcount()); 34. } while( !fe.eof( ) ); 35. // Cerrar Archivos: 36. fe . close( ); 37. fs . close( ); 38. return 0; 39. }
ASIGNACIONES
1- Realizar un programa que solicite un numero entero n entre 2 y 23 para que muestre un tringulo como el abajo que es para n=5 . 11 1212 123123 12351235 1235712357 2- Hacer un programa en C++ que acepte una oracin desde el teclado para luego imprimirla en un archivo en orden inverso. Se recomienda el uso de new y delete. 3- Hacer un programa en C++ que genere una matriz de nxn de nmeros aleatorios, y que guarde la matriz inversa correspondiente en algn archivo. Tanto 'n' como el nombre del archivo se pasar desde la lnea de comandos y, si el archivo existe se debe lanzar una advertencia con el fin de no hacer una sobre escritura. 4- Hacer un programa en C++ que escriba en un archivo mil nmeros enteros aleatorios. 5- El inventario de una tienda esta guardado en un archivo, en el cual cada producto utiliza los siguientes campos: cdigo de barras, nombre del producto, precio unitario y existencia. Hacer un programa en C++ que busque un producto en particular, y si esta en el inventario indicar toda la informacin relacionada con el. Desde la lnea de comando se pasar el nombre del producto y del archivo, si el nmero de parmetros no es adecuado se debe presentar un mensaje de error y si el producto no esta en el inventario se debe mostrar en pantalla '' Producto no encontrado '', si el archivo no existe se debe generar un beep y el mensaje ''Archivo no existe'' y si el archivo no se puede abrir se debe mostrar en pantalla '' Permiso denegado''.
CICLOII2012