240 likes | 343 Views
Programación Científica. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves Website: http://yalma.fime.uanl.mx /~ romeo/ Sesiones: 48
E N D
Programación Científica Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves Website: http://yalma.fime.uanl.mx/~romeo/ Sesiones: 48 * Slides aumentados con información de Dr. Roger Ríos, y Dr. Fernando López
40% Proyecto 30% Examen Parcial 30% Examen Final 10% Participación Temario: • Fundamentos de Programación en C • Apuntadores y Funciones • Arreglos y Estructuras • Manejo de Memoria • Recursividad • Entrada y Salida de Archivos • Desarrollo y Depuración de Proyecto de Programación Total a calificar: 110 puntos!
Material de apoyo: A. KELLY, I. POHL. A Book on C. Addison-Wesley, Reading, EUA, 1998. 2. B. KERNIGHAN, D. RITCHIE. The C Programming Language. Prentice Hall, Second Edition, 1988. 3. D. KNUTH. The Art of Computer Programming. Addison Wesley, 1998. 4. H. DEITEL, P. DEITEL. Como Programar en C/C++. Prentice Hall, Segunda Edición. 1995. 5. L. Joyanes, I. Zahonero. Programación en C - Metodología, Algoritmos y Estructura de Datos. McGraw Hill-Interamericana, 2006. 6. B. Stroustrup. The C++ Programming Language. Addison Wesley. Third Edition. 1997. Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html
Objetivo General: Aprender a utilizar las características típicas de los mecanismos de Entrada y Salida para archivos en C, así como las funciones de acceso más utilizadas. Entradas y Salidas por Archivos
Preliminares • Lectura: Es la operación de introducir (leer) datos al sistema. • Se realiza usualmente desde el teclado, el disco, o cualquier otro dispositivo de entrada • Escritura: Se relaciona a la operación de generar datos por el sistema. • Se realiza usando cualquier dispositivo de salida como monitor o impresora. • En C las funciones para entrada y salida están incorporadas como Biblioteca de Ejecución. • stdio.h: proporciona tipos de datos, macros y funciones para acceder a archivos. • El manejo de archivos se hace a través de flujos (streams) o canales, que conducen los datos entre el programa en ejecución y los dispositivos externos.
Flujos • Un flujo (stream) es una abstracción que refiere a una corriente de datos entre un origen o fuente (productor) y un destino (consumidor). • Entre el origen y destino debe existir una conexión o canal (pipe) por donde circulan los datos. • Por ejemplo: • extern FILE *stdout; • Es el flujoqueasocia la salidaestándar (pantalla) con el programa. Cuandoejecutamos: • printf(“Ejemplo en clase.”); • Se escriben los datos en stdout, esdecir, en pantalla.
Punteros FILE • Los archivos se ubican en dispositivosexternos, y se utilizanbuffersparaaccesarlos: • Dentro del programa, se hacereferencia a los archivosusandopunteros a unaestructurapredefinida: FILE • FILE contieneinformación sobre el archivo tal como la dirección del buffer que utiliza, su modo de apertura, etc. FILE se encuentra en stdio.h.
Ejemplos: • Declaración de punteros a FILE: FILE * pfile; FILE * stdin, stdout; En funciones: FILE * escribir(FILE *); • Apertura de archivos: Conexión del archivo externo con el programa en un determinado modo (e.g., binario, de texto). Se utiliza la función: FILE * fopen(constchar * nombre_archivo, const char * modo) Ejemplo: charnombre_archivo = “C:\test.txt”; FILE * pfile = fopen(nombre_archivo, “r”); if(pfile==NULL) puts(“ERROR al abrir el archivo…”);
Modos de apertura de un archivo • Tipo de archivos: • Texto: Se utilizauna “t” al final, e.g., “rt”, “a+t” • Binario: Se utilizauna “b”, eg., “rb”, “w+b”.
Cierre de archivos • Los archivos en C trabajan con unamemoriaintermediaconocidacomobuffer. • La entrada y salida de datos se almacenan en esebuffer, vaciándose a los archivos cuando están llenos. • Al terminar la ejecución del programa se tienen que cerrar los archivos para que cualquier dato en los buffers se vacíe a los archivos. • intfclose (FILE * pfile) • Devuelve EOF si hay un error al cerrar. Es una macro definida en stdio.h para indicar que se ha leído el fin del archivo.
Manejo de archivos secuenciales • Las funciones de E/S de archivos tienen mucho parecido con las funciones de E/S para los flujosstdin(teclado) y stdout(pantalla): printf, scanf, getchar, putchar, gets, puts, putc, getcantecediendo la letraf, ejemplo: fprintf, fscanf, fputc, fgetc, etc. • Ejemplo: Crea un archivo de texto con caracteres introducidos desde teclado, utiliza enter para parar. char * nfile = "test.txt"; FILE * pf = fopen(nfile,"w+t"); if(pf==NULL){ puts("Error al abrirarchivo!"); exit(0); }else{ int c; do{ c=getchar(); fputc(c,pf); }while(c!='\n');fclose(pf); }
Manejo de archivos secuenciales • Ejemplo: Lectura de archivos secuenciales. Lee un archivo y muestra sus caracteres en pantalla. Termina cuando se encuentre el fin del archivo (EOF). FILE * pf; char * nfile = "test.txt"; pf = fopen(nfile,"rt"); if(pf==NULL){ puts("Error abriendoarchivo."); return 1; }else{ int c; do{ c=fgetc(pf); if(c=='\n') printf("\n"); else putchar(c); }while(c!=EOF); //Puedesutilizarfeof()! fclose(pf); }
Manejo de archivos secuenciales • Ejemplo: Manipulando cadenas de caracteres, funciones fputs() y fgets(). • fputs() escribe la cadena en el archivo asociado, devuelve EOF si no ha podido escribirla • fgets() lee una cadena del archivo, termina su lectura cuando encuentra el carácter de fin de línea, o cuando ha leído n-1 caracteres si se especifica n en sus argumentos. • Ejemplos: Lee los primeros 10 caracteres de un archivo, y los coloca en un segundo. FILE * pf, *pf2; char * nfile = "test.txt"; char * nfile2 = "test2.txt"; pf = fopen(nfile,"rt"); pf2 = fopen(nfile2,"wt"); charcadena[10]; if(pf==NULL || pf2==NULL){ puts("Error abriendoarchivos."); return 1; }else{ fgets(cadena,10,pf); fputs(cadena,pf2); fclose(pf); fclose(pf2); }
Manejo de archivos secuenciales • Ejemplo: Manipulando variables de cualquier tipo de dato estándar usando códigos de formato (%d, %f, etc) con los flujos asociados, fprint() y fscanf(). • fprintf() escribe datos en secuencia en el archivo asociado formateados según los argumentos de la función. Retorna el número total de caracteres impresos si tuvo éxito, o un número negativo en caso contrario. • fscanf() lee datos formateados de un archivo asociado, y los almacena según el formato dado en variables adicionales pasadas como parámetros a la función. • Ejemplos: char * nfile2 = "test2.txt"; FILE *pf2 = fopen(nfile2,"w+"); if(pf2==NULL){ puts("Error abriendoarchivos."); return 1; }else{ fprintf(pf2,"%f %s",3.1416f,"PI"); rewind(pf2); //Coloca el indicador de posición al principio floatvalorpi; chardescripcion [100]; fscanf(pf2,"%f",&valorpi); fscanf(pf2,"%s",descripcion); printf("Valores leidos del archivo: %f %s",valorpi,descripcion); fclose(pf2); }
Resumen de Prototipo de funciones • Las funciones de E/S se encuentrandefinidas en la libreríastdio.h. intputc(int c, FILE* pf); intfputc(int c, FILE* pf); intgetc(FILE* pf); intfgetc(FILE* pf); intfputs(char * cadena, FILE* pf); char *gets(char * cadena, int n, FILE* pf); intfprintf(FILE* pf, const char * formato, …); intfscanf(FILE* pf, const char * formato, …); intfeof(FILE* pf);
Archivosbinarios • En C son secuencias de 0s y 1s. • Optimizan la memoriaocupadapor un archivo: • En modotextoprimero se convierte el valor numérico en unacadena de dígitos y después se escribe en el archivo. • Sin embargo, la lectura de archivos binarios se tiene que realizar desde un entorno de un programa en C. • C proporciona dos funciones de entrada y salida para archivos binarios: fread()y fwrite().
Archivosbinarios • fwrite(): Escribe un buffer de cualquiertipo de dato en un archivobinario. • fwrite(constvoid* ptr, size_t tam, size_t n, FILE *pf) • ptr: Puntero al buffer (e.g., arreglo, variable) quecontiene los datos • tam: Tamaño del tipo de datos de cada elemento del buffer • n: Número de elementos a escribir • pf: Puntero al archivo • Ejemplo: Elevar una variable real al cuadrado y guardar los resultados en un archivo binario FILE *fd; double x; fd = fopen(“numeros.dat","wb"); for(x=0.5;x>0.01;){ fwrite(&x, sizeof(double), 1,fd); x = pow(x,2.0); } fclose(fd);
Archivosbinarios • fread(): Lee un archivo de n bloques de bytes y los almacena en un buffer. . • fread(void* ptr, size_t tam, size_t n, FILE *pf) • ptr: Puntero al buffer donde se depositarán los datos • tam: Tamaño del tipo de datos de cada elemento a leer • n: Número de elementos a leer • pf: Puntero al archivo • Ejemplo: Leer los cuadrados de los números reales del ejemplo anterior. FILE *fd; double x, suma; fd = fopen(“numeros.dat","wb"); while(!eof(fd)){ fread(&x, sizeof(double), 1,fd); } fclose(fd);
Ejemplofread, fwrite typedefstruct { charnombre[SIZEOFNAME]; intidacc; floatlimite; floatbalance; floatcargos; floatcreditos; } ACCOUNT; ACCOUNT accounts[TOTALCUENTAS], acc; //…Asumeque el arreglo de cuentas ha sido //inicializado con datoshasta TOTALCUENTAS FILE *fw, *fr; //Abrearchivoparaescritura, asume no error fw = fopen("cuentas.dat","wb");
Ejemplofread, fwrite //Escribetodos los datos del arreglo al archivo fwrite(accounts,sizeof(ACCOUNT),TOTALCUENTAS,fw); fclose(fw); //Ahoraabre el mismoarchivoparalectura de datos fr = fopen("cuentas.dat","rb"); while(!feof(fr)){ //Lee el archivoregistroporregistro if(fread(&acc,sizeof(ACCOUNT),1,fr)) printAccount(acc); } EJERCICIOS: • Modifica la escrituraparaescribirregistroporregistro • Modifica la lecturapara leer todo el bloque de datos en unainstancia
Acceso aleatorio • El acceso aleatorio a los datos de un archivo se hace mediante su posición, es decir, el lugar relativo que estos ocupan. • Se pueden leer y escribir registros en cualquier orden y posición. • Se tiene que programar la relación existente entre el contenido del registro y la posición que ocupa. • Se utilizan las funciones fseek() y ftell().
Acceso aleatorio • fseek(): Puede tratar un archivo en C como un array, situando el puntero de un archivo en una posición aleatoria dependiendo de sus argumentos. • fseek(File* pf, longdesplazamiento, intorigen) El desplazamiento es el número de bytes a mover con respecto al origen. El origen es la posición desde la que se cuenta el número de bytes a mover. Toma tres valores: 0 : Desde el inicio del archivo (SEEK-SET) 1: Desde la posición actual del archivo (SEEK-CUR) 2: Desde el final del archivo (SEEK-END) Retorna 0 si es exitoso el posicionamiento
Acceso Aleatorio • Ejemplo: //Solicita el numero de registro int regnum; ACCOUNT acc; cout<<“El numero de registro a visualizar:"; cin>>regnum; //Desplazate a la posicion del registro int result = fseek(fr,regnum*sizeof(ACCOUNT),SEEK_SET); if(result!=0){ cout<<"Error!"<<endl; }else{ //Lee e imprime el registro fread(&acc,sizeof(ACCOUNT),1,fr); printAccount(acc); }
Acceso aleatorio • ftell(): Obtiene la posición actual del archivo. Devuelve la posición como el total de bytes desde el inicio del archivo. • ftell(File* pf) Retorna -1L si un error ocurre Ejemplo: int result = fseek(fr,regnum*sizeof(ACCOUNT),SEEK_SET); longmsize = ftell(fr); cout<<"Size "<<msize<<" sizeof account "<<sizeof(ACCOUNT)<<endl;