La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Archivos. Introducción Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos.

Presentaciones similares


Presentación del tema: "Archivos. Introducción Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos."— Transcripción de la presentación:

1 Archivos

2 Introducción Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de memoria secundaria. Estas colecciones de datos se conocen como archivos (antiguamente ficheros).

3 Introducción Los archivos de datos permiten almacenar información de modo permanente, para ser accedida o alterada cuando sea necesario. Se pueden dividir en dos categorías: Archivos de texto Archivos de texto Archivos binarios Archivos binarios

4 Archivos de texto Contienen caracteres consecutivos. Se pueden interpretar como datos individuales, como componentes de una cadena o como números. Archivos binarios Organiza datos de cualquier tipo de bloque de información (registro). Normalmente los usaremos para almacenar datos de tipo struct. No pueden visualizarse con un procesador de texto

5 El puntero a un archivo Cuando se trabaja con archivos secuenciales de datos, el primer paso es establecer un área de buffer, donde la información se almacena temporalmente mientras se está transfiriendo entre la memoria y el archivo de datos. El área de memoria se establece escribiendo: FILE * ptvar;

6 Donde FILE es un tipo de estructura que establece el área de buffer y ptvar la variable puntero que indica el comienzo de esta área. El tipo de estructura FILE está definido en stdio.h. Un archivo de datos debe ser abierto antes de ser creado o procesado. Esto asocia el área del buffer con el nombre del archivo. También se especifica la forma en que se va a usar el archivo. Se usa la función fopen

7 FILE *ptvar = fopen( nombre, modo) Donde nombre_archivo es un puntero a una cadena de caracteres que representan un nombre valido del archivo y puede incluir una especificación del directorio. La cadena a la que apunta modo determina como se abre el archivo. La siguiente tabla muestra los valores permitidos para modo. Apertura de un archivo

8 Modo Significado r t Abre un archivo de texto para lectura. w t Crea un archivo de texto para escritura. a t Abre un archivo de texto para añadir. rb Abre un archivo binario para lectura. wb Crea un archivo binario para escritura. ab Abre un archivo binario para añadir. r+ tAbre un archivo de texto para lectura / escritura. w+ tCrea un archivo de texto para lectura / escritura. a+t Añade o crea un archivo de texto para lectura / escritura. r+b Abre un archivo binario para lectura / escritura. w+b Crea un archivo binario para lectura / escritura. a+b Añade o crea un archivo binario para lectura / escritura.

9 La función fopen() devuelve un puntero a archivo. Un programa nunca debe alterar el valor de ese puntero. Si se produce un error cuando se esta intentando abrir un archivo, fopen() devuelve un puntero nulo (NULL). Se puede abrir un archivo bien en modo texto o binario. En la mayoría de las implementaciones, en modo texto, la secuencias de retorno de carro / salto de línea se convierten a caracteres de salto de línea en lectura. En la escritura, ocurre lo contrario: los caracteres de salto de línea se convierten en salto de línea. Estas conversiones no ocurren en archivos binarios.

10 Si se usa fopen() para abrir un archivo para escritura, entonces cualquier archivo existente con el mismo nombre se borrará y se crea uno nuevo. Si no existe un archivo con el mismo nombre, entonces se creará. Si se quiere añadir al final del archivo entonces debe usar el modo a. Si se usa a y no existe el archivo, se devolverá un error. La apertura de un archivo para las operaciones de lectura requiere que exista el archivo. Si no existe, fopen() devolverá un error. Finalmente, si se abre un archivo para las operaciones de leer / escribir, la computadora no lo borrará si existe; sin embargo, si no existe, la computadora lo creará.

11 “Rebobinar” un archivo La función rewind() inicializa el indicador de posición al principio del archivo. La función rewind() inicializa el indicador de posición al principio del archivo. void rewind(FILE *fp);

12 Cierre de un archivo La función fclose() cierra una secuencia que fue abierta mediante una llamada a fopen(). Escribe toda la información que todavía se encuentre en el buffer en el disco y realiza un cierre formal del archivo a nivel del sistema operativo. Un error en el cierre de una secuencia puede generar todo tipo de problemas, incluyendo la pérdida de datos, destrucción de archivos y posibles errores intermitentes en el programa. El prototipo de esta función es: int fclose(FILE *F); Donde F es el puntero al archivo devuelto por la llamada a fopen(). Si se devuelve un valor cero significa que la operación de cierre ha tenido éxito. Generalmente, esta función solo falla cuando un disco se ha retirado antes de tiempo o cuando no queda espacio libre en el mismo.

13 Fin de un archivo La función feof() sirve para detectar el fin de un archivo. La función feof() sirve para detectar el fin de un archivo. int feof(FILE *fp) Retorna un valor diferente de cero si ha ocurrido un fin de archivo.

14 Agregar datos a un archivo de texto Existen dos formas de agregar datos a un archivo de texto: 1. Usando un editor de texto 2. Escribir un programa que introduzca información en la computadora y la escriba en un archivo.

15 Funciones para agregar texto a un archivo Si queremos leer o escribir caracteres individuales, se pueden usar las funciones getc() (para leer desde un archivo) y putc() (para escribir sobre un archivo). Si queremos leer o escribir caracteres individuales, se pueden usar las funciones getc() (para leer desde un archivo) y putc() (para escribir sobre un archivo). char c =putc(char c, FILE *p) char c = putc(char c, FILE *p) Devuelve el carácter escrito o EOF char c = getc(FILE *p) Si alcanza fin de archivo devuelve EOF

16 Los archivos de texo que contienen sólo cadenas de caracteres pueden crearse y leerse más facilmente utilizando las funciones de biblioteca especialmente orientadas para cadenas: Los archivos de texo que contienen sólo cadenas de caracteres pueden crearse y leerse más facilmente utilizando las funciones de biblioteca especialmente orientadas para cadenas: int fputs(char *linea, FILE * fp); char * gets(char *linea, int lon, FILE *ptvar);

17 fgets fgets: lee la siguiente línea (incluyendo el carácter de nueva línea) del archivo fp y la deja en el arreglo de caracteres linea. La línea resultante se termina con ‘\0’. Normalmente, fgets regresa línea; en caso de fin de archivo o de error, regresa NULL. fgets: lee la siguiente línea (incluyendo el carácter de nueva línea) del archivo fp y la deja en el arreglo de caracteres linea. La línea resultante se termina con ‘\0’. Normalmente, fgets regresa línea; en caso de fin de archivo o de error, regresa NULL.

18 fputs fputs: escribe una cadena (que no necesita contener una nueva línea) a un archivo. fputs: escribe una cadena (que no necesita contener una nueva línea) a un archivo. Retorna EOF si ocurre un error y cero si no ocurre. Retorna EOF si ocurre un error y cero si no ocurre.

19 #include #include void main() { FILE *archivo; char texto[40]; archivo = fopen("c:\\dir1\\ejemplo.txt", "rt"); if(archivo == NULL) printf("No existe el archivo ! \n"); else{ while(! feof(archivo)) { fgets(texto, 40, archivo); printf("%s", texto); }}fclose(archivo);} En el nombre del archivo, la barra \ aparece repetida a propósito, porque es un código de control. fgets lee una cadena de texto, que se puede limitar en longitud (en este caso, a 40 caracteres), desde el archivo. Esta cadena conservará los caracteres de avance de línea.

20 #include #include void main() { FILE *archivo; char texto[40]; archivo = fopen("c:\\dir1\\ejemplo.txt", "wt"); if(archivo == NULL) printf("No se ha podido crear el archivo ! \n"); else{ fputs("Escribe una linea en el archivo \n", archivo); fclose(archivo);}}

21 Archivos binarios Cuando se necesita guardar en un archivo una colección de datos en cualquier formato (float, entero, array, estructuras, etc), resulta más sencillo trabajar con archivos binarios en lugar de traducir cada elemento a texto para su procesamiento. Se consigue mayor velocidad. Los archivos binarios pueden ser accedidos en forma secuencial o directa (cada elemento debe tener la misma cantidad de bytes).

22 Funciones Para trabajar con archivos binarios se usan las funciones: int fread(void *buffer, int num_bytes, int cuenta, FILE *fp) int fwrite(void *buffer, int num_bytes, int cuenta, FILE *fp) int fseek(FILE *fp, long num_bytes, int origen) long ftell(FILE *fp) rewind(FILE *fp)

23 int fread(void *buffer, int num_bytes, int cuenta, FILE *fp) buffer: dirección del bloque de datos. Puntero a la información que va a ser escrita en el archivo. buffer: dirección del bloque de datos. Puntero a la información que va a ser escrita en el archivo. num_bytes: tamaño del bloque de datos. Se usa la instrucción num_bytes: tamaño del bloque de datos. Se usa la instrucción sizeof(). cuenta: número de bloques a transferir. En caso de transferir un arreglo, la cantidad de celdas a copiar en el archivo. cuenta: número de bloques a transferir. En caso de transferir un arreglo, la cantidad de celdas a copiar en el archivo. fp: puntero al archivo. fp: puntero al archivo. Retorno: cantidad de bytes leidos. Generalmente es un número igual a num_bytes * cuenta. Pero puede ser menor. Retorno: cantidad de bytes leidos. Generalmente es un número igual a num_bytes * cuenta. Pero puede ser menor.

24 int fwrite(void *buffer, int num_bytes, int cuenta, FILE *fp) buffer: dirección del bloque de datos. Puntero en donde se copia la información leída desde el archivo. buffer: dirección del bloque de datos. Puntero en donde se copia la información leída desde el archivo. num_bytes: tamaño del bloque de datos (tamaño del registro). Se usa la instrucción num_bytes: tamaño del bloque de datos (tamaño del registro). Se usa la instrucción sizeof(). cuenta: número de bloques a transferir. En caso de copiar varios registros a la vez (sobre un arreglo). cuenta: número de bloques a transferir. En caso de copiar varios registros a la vez (sobre un arreglo). fp: puntero al archivo. fp: puntero al archivo.

25 int fseek(FILE *fp, long desplazamiento, int origen) fp: puntero al buffer asociado con el archivo. fp: puntero al buffer asociado con el archivo. desplazamiento: cantidad de bytes que se desplazará el indicador de posición a partir de origen. desplazamiento: cantidad de bytes que se desplazará el indicador de posición a partir de origen. origen: constante que determina el punto de referencia a partir del cual se realiza el desplazamiento. origen: constante que determina el punto de referencia a partir del cual se realiza el desplazamiento. SEEK_SET ó 0: a partir del comienzo del archivo SEEK_SET ó 0: a partir del comienzo del archivo SEEK_CUR ó 1: a partir de la posición actual del arch. SEEK_CUR ó 1: a partir de la posición actual del arch. SEEK_END ó 2: a partir del final del archivo. SEEK_END ó 2: a partir del final del archivo. Retorno: en caso de éxito devuelve 0 (cero)

26 long ftell(FILE *fp) Devuelve la posición actual del indicador de posición. Retorno: si la operación es exitosa devuelve la cantidad de bytes que hay desde el comienzo del archivo hasta el lugar en que se encuentra el indicador de posición del archivo, en caso contrario devuelve - 1L (-1 como long).

27 Tamaño de un archivo Para averiguar la cantidad de bytes que ocupa un archivo debemos llevar el apuntador hacia el final y luego retornar la posición del apuntador en bytes: Para averiguar la cantidad de bytes que ocupa un archivo debemos llevar el apuntador hacia el final y luego retornar la posición del apuntador en bytes: fseek(fp, 0,2); C = ftell(fp); C es una variable de tipo long.

28 Agregado: las funciones sprintf y sscanf

29 sprintf Crea una cadena de texto a partir de una especificación de formato y unos ciertos parámetros, al igual que printf, pero la diferencia está en que printf envía su salida por pantalla, mientras que la deja guardada en una cadena de texto: Crea una cadena de texto a partir de una especificación de formato y unos ciertos parámetros, al igual que printf, pero la diferencia está en que printf envía su salida por pantalla, mientras que sprintf la deja guardada en una cadena de texto: sprintf(cadena, “El número %d multiplicado por 2 vale %d \n”, 50, 50*2)

30 sprintf(cadena, “El número %d multiplicado por 2 vale %d \n”, 50, 50*2); Esta función no escribe nada por pantalla, sino que almacena en la variable de cadena (char cadena[]) el texto: “EL número 50 multiplicado por 2 vale 100” Ahora ya podríamos escribir este texto con cualquiera de estas instrucciones: puts(cadena); printf(“%s”, cadena); //fp es de tipo FILE * fputs(cadena, fp); //fp es de tipo FILE *

31 sscanf Es similar a scanf, con la diferencia de que los valores para las variables no se leen desde el teclado, sino desde una cadena de texto. Es similar a scanf, con la diferencia de que los valores para las variables no se leen desde el teclado, sino desde una cadena de texto. strcpy(cadena, “20 30”); sscanf(cadena, “%d %d”, &primerNum, &segundoNum);


Descargar ppt "Archivos. Introducción Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos."

Presentaciones similares


Anuncios Google