1 / 24

Programación Científica

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

rumor
Télécharger la présentation

Programación Científica

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. 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

  2. 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!

  3. 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

  4. 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

  5. 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.

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

  7. 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.

  8. 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…”);

  9. 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”.

  10. 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.

  11. 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); }

  12. 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); }

  13. 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); }

  14. 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); }

  15. 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);

  16. 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().

  17. 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);

  18. 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);

  19. 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");

  20. 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

  21. 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().

  22. 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

  23. 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); }

  24. 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;

More Related