Archivos Introduccin Los datos que hemos tratado hasta

  • Slides: 31
Download presentation
Archivos

Archivos

Introducción Los datos que hemos tratado hasta el momento han residido en la memoria

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

Introducción Los archivos de datos permiten almacenar información de modo permanente, para ser accedida

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: l Archivos de texto l Archivos binarios

Archivos de texto Contienen caracteres consecutivos. Se pueden interpretar como datos individuales, como componentes

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

El puntero a un archivo Cuando se trabaja con archivos secuenciales de datos, el

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;

FILE * ptvar; Donde FILE es un tipo de estructura que establece el área

FILE * ptvar; 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

Apertura de un archivo FILE *ptvar = fopen( nombre, modo) Donde nombre_archivo es un

Apertura de un archivo 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.

Modo Significado l l l r t Abre un archivo de texto para lectura.

Modo Significado l l l 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+ t Abre un archivo de texto para lectura / escritura. w+ t Crea 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.

La función fopen() devuelve un puntero a archivo. Un programa nunca debe alterar el

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.

Si se usa fopen() para abrir un archivo para escritura, entonces cualquier archivo existente

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

“Rebobinar” un archivo l La función rewind() inicializa el indicador de posición al principio

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

Cierre de un archivo La función fclose() cierra una secuencia que fue abierta mediante

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.

Fin de un archivo l La función feof() sirve para detectar el fin de

Fin de un archivo l 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.

Agregar datos a un archivo de texto Existen dos formas de agregar datos a

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.

Funciones para agregar texto a un archivo Si queremos leer o escribir caracteres individuales,

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). char c = putc(char c, FILE *p) l Devuelve el carácter escrito o EOF char c = getc(FILE *p) Si alcanza fin de archivo devuelve EOF

l Los archivos de texo que contienen sólo cadenas de caracteres pueden crearse y

l 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);

fgets l fgets: lee la siguiente línea (incluyendo el carácter de nueva línea) del

fgets l 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 ‘’. Normalmente, fgets regresa línea; en caso de fin de archivo o de error, regresa NULL.

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. l Retorna EOF si ocurre un error y cero si no ocurre. l

#include <stdio. h> void main() { FILE *archivo; char texto[40]; archivo = fopen("c: \dir

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

#include <stdio. h> void main() { FILE *archivo; char texto[40]; archivo = fopen("c: \dir

#include <stdio. h> void main() { FILE *archivo; char texto[40]; archivo = fopen("c: \dir 1\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); } }

Archivos binarios Cuando se necesita guardar en un archivo una colección de datos en

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

Funciones Para trabajar con archivos binarios se usan las funciones: l l l int

Funciones Para trabajar con archivos binarios se usan las funciones: l l l 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)

int fread(void *buffer, int num_bytes, int cuenta, FILE *fp) l l l buffer: dirección

int fread(void *buffer, int num_bytes, int cuenta, FILE *fp) l l l 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 sizeof(). 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. Retorno: cantidad de bytes leidos. Generalmente es un número igual a num_bytes * cuenta. Pero puede ser menor.

int fwrite(void *buffer, int num_bytes, int cuenta, FILE *fp) buffer: dirección del bloque de

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. l num_bytes: tamaño del bloque de datos (tamaño del registro). Se usa la instrucción sizeof(). l cuenta: número de bloques a transferir. En caso de copiar varios registros a la vez (sobre un arreglo). l fp: puntero al archivo. l

int fseek(FILE *fp, long desplazamiento, int origen) fp: puntero al buffer asociado con el

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

long ftell(FILE *fp) Devuelve la posición actual del indicador de posición. Retorno: si la

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 -1 L (-1 como long).

Tamaño de un archivo l Para averiguar la cantidad de bytes que ocupa un

Tamaño de un archivo l 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.

Agregado: las funciones sprintf y sscanf

Agregado: las funciones sprintf y sscanf

sprintf l Crea una cadena de texto a partir de una especificación de formato

sprintf l 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*2)

sprintf(cadena, “El número %d multiplicado por 2 vale %d n”, 50*2); Esta función no

sprintf(cadena, “El número %d multiplicado por 2 vale %d n”, 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);

sscanf l Es similar a scanf, con la diferencia de que los valores para

sscanf l 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”, &primer. Num, &segundo. Num);