1 / 63

Capítulo 6

Capítulo 6. Estructuras-Archivos. Estructuras. Estructuras. Recordemos que los arreglos son un conjunto de datos de un mismo tipo. Una estructura es un conjunto de datos que no son necesariamente del mismo tipo.

tuvya
Download Presentation

Capítulo 6

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. Capítulo 6 Estructuras-Archivos

  2. Estructuras

  3. Estructuras • Recordemos que los arreglos son un conjunto de datos de un mismo tipo. • Una estructura es un conjunto de datos que no son necesariamente del mismo tipo. • No hay limitaciones en el tipo ni cantidad de variables que pueda contener una estructura, la única restricción es que una estructura no puede contenerse a sí misma como miembro.

  4. Idea • Consideremos que deseamos mantener la información de una persona. Estos datos podrían ser: su edad, su estatura, su peso, su nombre, sexo M o F, etc. Una estructura nos permite agrupar en un conjuntos a todos estos tipos de datos:

  5. Partes de una estructura

  6. Arreglos y Estructuras

  7. Declaración • Una estructura utiliza la palabra reservada struct, un nombre identificador y entre llaves sus campos con sus determinados tipos. structpersona { int edad; float estatura, peso; char nombre[50]; char sexo; }; struct persona gente1, gente2;

  8. Otra Manera • Podemos declarar la estructura y definir la variables al mismo tiempo. structpersona { int edad; float estatura, peso; char nombre[50]; char sexo; } gente1, gente2;

  9. Inicialización • Al igual que los arreglos las estructuras pueden ser inicializadas al declararla. struct persona { int edad; float estatura, peso; char nombre[50]; char sexo; } gente1 = {29, 1.89, 98, “Francisco Bórquez", ‘M'}

  10. Acceso a los elementos • Para dirigirnos a un campo de una estructura existe un operador que relaciona al nombre al nombre de ella con un campo determinado, este operador es el punto. Su sintaxis es Nombre_estructura.nombre_campo Ejemplo: gente1.edad=30; gente1.peso=80.5;

  11. Ejemplo

  12. Ejemplo • Desarrollar un programa que utilice la definición del tipo alumno que se muestra abajo, permita llenar los datos y calcular su promedio de notas, e informar por pantalla si aprobó o no. struct alumno { char nombre [50]; char rut[12]; int c1, c2, c3; float prom; };

  13. Ejemplo void main ( ) { struct alumno alum_prg; printf ( "ingrese nombre” ); scanf ( "%s", alum_prg.nombre ); printf ( "ingrese rut“ ); scanf ( "%s", alum_prg.rut ); printf ( "ingrese los 3 certamenes” ); scanf ( "%d %d %d", &alum_prg.c1, &alum_prg.c2, &alum_prg.c3 ); alum_prg.prom = ( alum_prg.c1 + alum_prg.c2 + alum_prg.c3 ) / 3; if ( alum_prg.prom >= 55 ) printf ( "aprobado” ); else printf ( "reprobado” ); }

  14. Info dentro de estructuras • Dentro de una estructura podemos tener no solo datos simples, sino tipo de datos estructurados e incluso otras estructuras. struct coord { int x, y; }; struct datos { float velocidad; int eventos[20]; struct coord posicion; };

  15. Ejemplo int main ( ) { struct datos movil; int i; movil.velocidad = 1.45; movil.posicion.x = 3; movil.posicion.y = 7; for ( i = 0; i < 20; i ++ ) movil.eventos [ i ] = i; }

  16. Usos de Arreglo de Estructuras Tenemos la siguiente estructura: struct vehiculo { int num_serie; char marca[30]; int anio; float costo; }; • Suponer, que estamos interesados en guardar la información varios autos (unos 50). Ante esto podríamos crear 50 variables y llenarlas con información. Pero si analizamos, tenemos 50 variables que pueden conformar una colección de datos de un mismo tipo, definición de: ARREGLO • De esta manera se llega a un Arreglo de Estructuras: struct vehiculo inventario[50];

  17. Arreglo de Estructuras

  18. Ejercicio • Una librería desea almacenar sus productos en un arreglo de registros. Cada registro debe incluir los campos título, autor, ISBN (código), precio y stock. Diseñe un programa C que permita realizar las siguientes operaciones: - Ingresar una partida de 100 libros. - Encontrar un libro a partir de un código ISBN ingresado por el usuario, mostrando el título, autor, precio y stock correspondiente.

  19. Ejercicio • Se requiere almacenar la información de un curso de 10 alumnos a un arreglo de registros. A cada alumno se le deben ingresar las 3 notas, y luego calcular su promedio. • Se pide desarrollar un programa que permita el ingreso de todos los datos del alumno, las 3 notas, y se le calcule promedio. Mostrar por pantalla, nombre promedio, y además mostrar el promedio del curso.

  20. Ejercicio struct alumno { char nombre[30]; char rol[12]; int nota [ N ]; float promedio; } curso [ A ];

  21. Utilizando typedef • Sentencia para asignar un alias de tipo de dato, puede dar un nuevo nombre a un tipo de dato ya existente. Típicamente utilizada para darle un nombre a tipos de datos no simples. - enum - struct - arreglos

  22. Creando Nuevos Tipos

  23. Archivos

  24. ¿Qué es un archivo? • Un archivo es una estructura de datos de un mismo tipo, sean éstos simples o estructurados. • Un archivo se almacena en un dispositivo secundario (disco duro, cinta, CD-DVD, etc.), la particularidad es que los datos contenidos en un archivo después de ejecutar el programa no se pierden.

  25. Usos • La entrada y salida estándar de datos (teclado y pantalla) pueden ser reemplazado por el uso de archivos. • Los programas pueden utilizan archivos para comunicarse con el otros programas, además es la forma más simple de almacenar información (hacer persistente los datos). Por ejemplo con el objetivo de generar informes, documentos y/o reportes.

  26. Leer-Gurdar información

  27. Tipos • Tipo Texto: Es una secuencia de caracteres. En un flujo de texto, pueden ocurrir ciertas conversiones de caracteres si el entorno del sistema lo requiere. El número de bytes escritos y leídos puede no ser iguales. • Tipo Binario: Es una secuencia de bytes con una correspondencia de uno a uno con los dispositivos externos. No se realizan conversiones de caracteres. El número de bytes escritos y leídos es el mismo.

  28. Archivos para C • La entrada y salida a archivos es un aspecto dependiente del S.O. Las librerías de C proveen un conjunto de funciones para trabajar con archivos. • Se pueden distinguir dos tipos de funciones de E/S, las tipos Unix-Linux que trabajan sin buffer, y la estándar ANSI que utilizan buffer intermedio (trabajaremos con el sistema ANSI).

  29. Sistema de archivos ANSI C • La librería stdio.h nos provee un cojunto de funciones: - fopen( ): abrir un archivo - fclose( ): cerrar un archivo - fputc ( ): escribe un char en archivo - fgetc ( ): lee un char de un archivo - fseek ( ): busqueda de byte - fprintf ( ): printf para archivos - fscanf ( ): scanf para archivos - feof ( ): indentificador de final de archivo - ferror ( ): devuelve 1 o 0 si hubo error en el flujo - rewind ( ): se posiciona al inicio del archivo - remove ( ): borra una archivo

  30. Stream-File • Las operaciones de archivos se hacen a través de un stream. Un stream es una serie ordenada de byte (cadena de muchos bytes). • Leer o escribir un archivo implica leer o escribir un stream. • Para asociar un stream con un archivo se crea un puntero a una estructura FILE, la cual contiene la información necesaria para interactuar con el S.O.

  31. Sistema de Archivos • La lógica para trabajar con archivo será: - Para lectura: abrir un archivo, leo la información y luego se cierra el archivo - Para escritura: abrir (crear) archivo, escribir la información y luego cerrar el archivo. • La inicialización de un *FILE, o dicho en otras palabras, la apertura de un archivo se hace con la función fopen(archivo, modo). El cierre se hace con fclose(archivo).

  32. Abrir archivo • Interfaz • FILE *fopen(const char *nombre_archivo, const char *modo); • Donde - Nombre_archivo: es el archivo con el cual se trabajará (path incluido). - Modo: es el modo de acceso para el stream.

  33. Modos de Acceso • El modo indica si el archivo se abrirá, o si se creará, si es de texto o binario. Los modo posibles para C son: - r: sólo lectura. El archivo debe existir. - w: se abre para escritura, se crea un archivo nuevo o se sobreescribe si ya existe. - a: añadir, se abre para escritura, el cursor se sitúa al final del archivo. Si el archivo no existe, se crea. - r+: lectura y escritura. El archivo debe existir. - w+: lectura y escritura, se crea un archivo nuevo o se sobreescribe si ya existe. - a+: añadir, lectura y escritura, el cursor se sitúa al final del archivo. Si el archivo no existe, se crea. - t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t" - b: tipo binario.

  34. Ejemplo FILE *a, *b, *c, *d; main ( ) { a = fopen ( "datos.txt", "r” ); b = fopen ( "nombres.dat", "a+” ); c = fopen ( "ipc.tex", "rt” ); d = fopen ( "c:\\cambios.rtf", "r+b” ); .......... }

  35. Error al abrir un archivo • Abrir una archivo (lectura, agregar) que no existe causa un error. Esta situación puede ser fácilmente detectada de la siguiente forma: FILE *arch; If ( ! ( arch = fopen ( nombre_archivo, modo ) ) ) { printf ( "no es posible leer %s", nombre_archivo ); return ( 1 ); } Sin no existe el archivo, la función fopen devuelve NULL.

  36. Cerrar un Archivo • No se debe olvidar cerrar todos los archivos abiertos. Al cerrar los archivos, se guardan los datos que aún están en el buffer y además actualiza algunos datos de la cabecera del arch que mantiene el S.O. • Además, libera el archivo para que otros programas puedan abrirlo.

  37. Cerrando Archivos • La función es fclose, y su prototipo es int fclose(FILE *archivo); Devuelve cero si no hay error, y EOF en caso contrario. • Ejemplo FILE *arch; arch = fopen ( “archivo.grande", "r“ ); ...... fclose ( arch );

  38. Trabajando sobre archivos • Las operaciones de lectura o escritura que podemos realizar sobre los archivos son funciones de la librería stdio.h que pueden trabajar en base a: - Caracteres (char) - Líneas - Bloques

  39. Funcionfgetc ( ) • Lectura de sólo un carácter desde un archivo, el prototipo de esta función es: int fgetc ( FILE *archivo ); • El valor de retorno es un carácter leído como un unsigned char convertido a int. Si al leer no hay un carácter disponible el valor de retorno es EOF.

  40. Función fputc ( ) • Escritura de sólo un carácter hacia un archivo. int fputc ( int carácter, FILE *archivo ); • El valor de retorno es el carácter escrito, si la operación de escritura fue realizada, de los contrario devuelve EOF. • Los parámetros son el carácter convertido a int y un puntero FILE al archivo.

  41. Funcionfeof ( ) • Prototipo • int feof ( FILE *archivo ); Función que se utiliza para comprobar si se ha llegado a fin de archivo (end of file). En los archivos guardas datos de un mismo tipo ya sean simple o estructuras, no tenemos información de cuantos registros hay, la idea será ir realizando lecturas consecutivas hasta que se llegue a final de archivo. El valor de retorno es 1 cuando se ha llegado a fin de archivo, de los contrario el retorno es 0.

  42. Función rewind ( ) • Prototipo: • void rewind ( FILE *archivo ); • Función rebobinar, sitúa el cursor de • lectura/escritura en el primer elemento del archivo (la información que fue registrada primero que todas).

  43. Ejemplo 1 • Realizar un programa en el cual guarde en un archivo la información introducida por el usuario a través del teclado. Se termina la introducción por el teclado con el carácter $. • Realizar un programa que lea lo introducido.

  44. Ejemplo 1 do { c = getchar ( ); putc ( c, archivo ); } while ( c != '$‘ ); rewind ( archivo ); while ( ! feof ( archivo ) ) { c = fgetc ( archivo ); printf ( "%c", c ); } fclose ( archivo ); return ( 0 ); } #include <stdio.h> int main ( ) { FILE * archivo; char c; if ( ! ( archivo = fopen ( "datos.dat", "w+“ ) ) ) { printf ( "No se puede abrir el archivo“ ); return ( 1 ); }

  45. Ejemplo 2 // Muestra dos veces el archivo. #include <stdio.h> int main ( ) { FILE *arch; arch = fopen ( "ejemplo1.c", "r” ); while ( ! feof ( arch ) ) fputc ( fgetc ( arch ), stdout ); rewind ( arch ); while ( ! feof ( arch ) ) fputc ( fgetc ( arch ), stdout ); fclose ( arch ); getchar ( ); return ( 0 ); }

  46. fprintf ( ) • Prototipo int fprintf ( FILE *archivo, const char *formato, ... ) Impresión en archivo, funciona de manera similar que printf, pero no imprime la información por pantalla (stdout) sino que la salida es dirigida a un archivo. • El retorno es el numero de caracteres enviados, si es negativo se produce un error en la salida.

  47. fscanf ( ) • Prototipo: int fscanf ( FILE *archivo, const char *formato, ... ) Ingreso de valores, funciona de manera similar a scanf, con la diferencia que los datos no son de teclado (stdin), sin que la entrada se toma desde un archivo. • Retorna el número de datos asignado y EOF si ocurrió un error.

  48. Ejemplo

  49. Funcion fflush • Prototipo int fflush ( FILE * archivo ); Esta función fuerza la salida de los datos acumulados en el buffer de salida del archivo. Para mejorar el manejo de archivos se utilizan buffers (almacenes temporales de datos en memoria) las operaciones de salida se hacen a través del buffer, y sólo cuando el buffer se llena se realiza la escritura en el disco y se vacía el buffer. En ocasiones nos hace falta vaciar ese buffer de un modo manual. El valor de retorno es 0 en caso de éxito, y EOF en caso contrario.

  50. Funcion fseek • Prototipo int fseek ( FILE *archivo, long int desp, int origen ); Función cuya utilidad es posicionar el cursor del archivo para leer o escribir en un lugar deseado Retorna 0 en caso de éxito. Parámetros: el archivo, el desplazamiento desp en Bytes. El parámetro de origen (define 0, 1, 2) - SEEK_SET: /* comienzo de archivo */ - SEEK_CUR: /* ubicación actual */ - SEEK_END: /* fin de archivo */

More Related