Manejo de Archivos

Download Report

Transcript Manejo de Archivos

Unidad 7
Manejo de Archivos
Copyright © 2005
Objetivos del Aprendizaje
• Identificar diferentes áreas en la resolución de
problemas que requieren leer o escribir datos en
dispositivos de almacenamiento secundario.
• Aprender a manejar los archivos de datos que ofrece
C.
• Discutir el método de manejar archivos secuenciales
(stream oriented files) en C.
• Listar y hacer uso de diversas funciones de librería
que permiten crear, leer y escribir archivos en disco.
ESCUELA DE COMPUTACIÓN
Almacenar Datos en Dispositivos Secundarios
• Algunas aplicaciones requieren que los datos estén
disponibles para varias ejecuciones del programa.
• Ejemplos de aplicaciones:
- Datos de los empleados, requeridos por las
aplicaciones de nómina de pagos.
- Datos de las cuentas de los clientes en sistemas
bancarios.
• A menos que sean explícitamente almacenados en
dispositivos de almacenamiento secundario, los
datos mantenidos en variables se pierde una vez que
el programa termina.
ESCUELA DE COMPUTACIÓN
Manejo de Archivos de Datos en C
• Los datos mantenidos en almacenamiento secundario
son permanentes a menos que sean eliminados por el
usuario
• Los datos se almacenan en forma de archivos de
datos.
• C ofrece un conjunto grande de funciones de librería
para crear y utilizar archivos de datos.
• Muchos lenguajes de programación clasifican los
archivos en:
- Archivos Secuenciales.
- Archivos de Acceso Directo o Acceso Aleatorio.
ESCUELA DE COMPUTACIÓN
Manejo de Archivos de Datos en C...2
• C ofrece dos tipos diferentes de archivos de datos
- Archivos secuenciales o archivos estándar (Stream Oriented
Data Files).
- Archivos de datos orientados al sistema o archivos de bajo
nivel.
• Los archivos secuenciales son más fáciles de programar
y manejar.
• Los archivos secuenciales se dividen en dos categorías:
- Archivos de texto.
- Archivos de datos sin formato.
ESCUELA DE COMPUTACIÓN
Archivos Secuenciales
• Archivos de texto:
- Consisten de una secuencia de caracteres.
- Pueden ser un carácter, una cadena de caracteres o
números.
- Varias funciones de librería están disponibles para
crear, leer y escribir archivos en disco.
• Archivos de datos sin formato:
- Los datos están organizados en bloques de bytes
contiguos.
- Se pueden usar para representar estructuras de datos
más complejas tales como arreglos, estructuras, etc.
- Existen funciones de librerías específicas para
transferir estructuras de datos completas.
ESCUELA DE COMPUTACIÓN
Crear un Área de Buffer
• Se debe de crear un área de buffer para trabajar con
archivos secuenciales.
• El área de buffer es el espacio en memoria que será
utilizado para transferir los datos desde la memoria al
dispositivo de almacenamiento secundario y viceversa.
FILE *ptr;
• FILE es un tipo de estructura especial que permite la
definición de un área de buffer.
• ptr es un puntero que apunta al inicio del área de buffer, se
denomina puntero a cadena (stream pointer).
• La palabra FILE se escribe en mayúsculas.
• La estructura FILE está definida en la librería stdio.h
por lo que debe incluirse la librería explicitamente en el
código.
ESCUELA DE COMPUTACIÓN
Abrir y Cerrar Archivos
• Un archivo de datos en C debe ser abierto antes de
que pueda ser procesado (incluso creado).
• Al abrir un archivo se crea una asociación entre el
nombre del archivo y el área de buffer.
• Cuando se abre un archivo se especifica su uso.
• Los archivos pueden ser:
- Read only (sólo para lectura).
- Write only (sólo para escritura).
- Read/write (lectura y escritura).
ESCUELA DE COMPUTACIÓN
Abrir y Cerrar Archivos...2
Existe una función de librería para abrir archivos:
ptr = fopen(file-name, file-type);
Donde:
file-name: Debe seguir las reglas para crear nombres
de archivos en los sistemas operativos específicos.
file-type: Cadena de caracteres que especifica cómo
puede ser usado el archivo.
ESCUELA DE COMPUTACIÓN
Especificaciones de Tipo de Archivo
Tipo de
Archivo
Significado
“r”
Abrir un archivo existente, en modo de sólo lectura
“w”
Abrir un nuevo archivo sólo para escritura. Si el archivo
existe, se borra y se crea un nuevo archivo
“a”
Abrir un archivo existente para agregar contenido al
final. Si el archivo no existe, un nuevo archivo es creado
“r+”
Abrir un archivo existente para lectura y escritura
“w+”
Abrir un nuevo archivo para lectura y escritura. Si el
archivo existe, se borra y se crea un nuevo archivo
“a+”
Abrir un archivo existente para leer y agregar al final. Si
el archivo no existe, un nuevo archivo es creado
ESCUELA DE COMPUTACIÓN
Más acerca de Abrir y Cerrar Archivos
• La función fopen retorna un puntero al inicio de la ubicación de
área de buffer asociada con el archivo.
• Si el archivo no puede ser abierto, retorna un valor NULL (cero).
• Un archivo no podrá abrirse si el archivo no puede ser encontrado,
o si se produce una falla al intentar abrirlo porque el archivo está
dañado.
• Al final de cada programa un archivo abierto debe ser cerrado.
• Una función de librería llamada fclose permite hacer esto:
fclose(buffer_pointer);
• Se recomienda cerrar explícitamente todos los archivos de datos al
final del programa, aunque la mayoría de compiladores en C los
cierran automáticamente.
• Considerar la previa declaración de: File * buffer_pointer;
ESCUELA DE COMPUTACIÓN
Abrir un Archivo
#include <stdio.h>
main(){
…
FILE *buff_ptr;
buff_ptr =
fopen(“misDatos.dat”,”r”);
…
…
fclose(buff_ptr);
…
…
}
ESCUELA DE COMPUTACIÓN
Chequeo por Condición de fopen()no Exitoso
#include <stdio.h>
#define NULL 0
main(){
FILE *buff_ptr;
buff_ptr = fopen(“misDatos.dat”,”r+”);
if(buff_ptr == NULL)
printf(“Error al abrir archivo\n”);
else{
…
…
…
fclose(buff_ptr);
}
}
ESCUELA DE COMPUTACIÓN
Chequeo por Condición de fopen()no Exitoso...2
#include <stdio.h>
#define NULL 0
main(){
FILE *buff_ptr;
if((buff_ptr = fopen(“misDatos.dat”,”r+”)) == NULL)
printf(“Error al abrir archivo\n”);
else{
…
…
…
fclose(buff_ptr);
}
}
ESCUELA DE COMPUTACIÓN
Crear Archivos de Datos
• Los archivos de datos deben ser creados antes de
usarlos.
• Los archivos secuenciales se crean:
- Directamente el archivo utilizando un editor de texto
o procesador de palabras.
- Indirectamente a través de un programa.
• Para crear un archivo a través de un programa se
pueden leer los datos del usuario desde el teclado y
escribirlos en el archivo de datos.
• Se usan funciones de librerías:
- getchar
- putc
ESCUELA DE COMPUTACIÓN
Leer y Mostrar Archivo de Texto... Ejemplo 1
#include <stdio.h>
main(){
FILE *myText;
/* Área de buffer */
char ch;
/* Abrir el archivo */
myText = fopen("myStory.dat","r");
if(myText == NULL)
printf("Error al abrir el archivo\n");
else{
ch = getc(myText);
while(ch != EOF){
putchar(ch);
ch = getc(myText);
}
}
fclose(myText);
}
ESCUELA DE COMPUTACIÓN
Escribir en un Archivo de Datos
main(){
FILE *myText; int ch;
myText = fopen("myStory.dat","w");
if(myText == NULL) printf("Error\n");
else{
printf("Ingrese un texto a ser \
almacenado dentro del archivo\n");
ch = getchar();
while( ch != '\n' ){
ch = toupper(ch);
putc(ch, myText);
ch = getchar();
}
fclose(myText);
}
}
ESCUELA DE COMPUTACIÓN
Funciones para Leer y Escribir en Archivos
• Para leer y escribir caracteres:
- getc
- putc
• Para leer y escribir cadenas de caracteres:
-
gets
puts
fgets
fputs
• Para leer y escribir estructuras complejas:
- fscanf
- fprintf
ESCUELA DE COMPUTACIÓN
Procesar un Archivo de Datos
• Cuando se escribe un un archivo se puede:
-
Agregar registros
Eliminar registros
Modificar registros
Reordenar los registros
• Un método para hacer esto es:
- Tener dos archivos, uno para entrada y el otro para salida.
- Leer los registros del archivo de entrada, hacer el
procesamiento y escribir los registros en el archivo de salida.
- Cuando se termina, borrar el archivo de datos de entrada y
reemplazarlo con el nuevo archivo actualizado.
• Otro método es:
- Leer un registro del archivo.
- Procesarlo y escribir de vuelta al mismo archivo
reemplazando el registro.
ESCUELA DE COMPUTACIÓN
Modo Texto vs Modo Binario
• Los archivos de datos se clasifican de acuerdo a como
se abren para su uso en:
- Archivos de texto
- Archivos binarios.
• Los archivos de texto y binarios difieren en tres áreas:
- Como se manejan los caracteres de cambio de línea.
- El manejo de la condición de fin de archivo.
- Como se almacenan números.
ESCUELA DE COMPUTACIÓN
Manejo de Caracteres de Cambio de Línea
• En el modo texto, el carácter de cambio de línea se
convierte en “retorno de carro y nueva línea” y luego
se escribe en el disco
• Cuando se realiza una lectura del disco, el “retorno de
carro y nueva línea” se convierte en un carácter de
cambio de línea.
• Cuando el archivo se abre en modo binario, no
ocurren estas conversiones.
• Para abrir un archivo en modo binario:
fptr = fopen(“miArchivo.dat”,”rb”);
• Se usa “b” para indicar que el archivo se abra en
modo binario.
• Se especifica “t” para indicar que el archivo se abra en
modo texto. Éste es el valor por defecto si se omite.
ESCUELA DE COMPUTACIÓN
Manejo de Fin de Archivo
• Para indicar el fin de archivo en modo texto se inserta
como último carácter el valor ASCII de 26.
• Cuando se encuentra el valor ASCII de 26 en el
archivo, la función de lectura retorna EOF (fin de
archivo) al programa que efectuó la llamada.
• En archivos en modo binario, no existe un carácter
especial que indique el fin de archivo.
• Para archivos binarios, el fin de archivo se deduce del
número de caracteres presentes en la entrada de
directorio del archivo.
• Si se almacenan los números en modo binario, se
deben leer también en modo binario.
ESCUELA DE COMPUTACIÓN
Manejo de Almacenamiento de Números
Función fprintf
• Los caracteres se almacenan en un 1 byte en memoria.
• Los números se almacenan como cadenas de caracteres.
• La función fprintf no almacena números ya que se
requieren 2 bytes en el caso de int y 4 bytes en el caso de
float.
• Los números se almacenan como cadenas de caracteres
• El número 5643 se almacena en 4 bytes.
• El número punto flotante 25.625 se almacena en 6 bytes.
• Cuando se utilizan archivos de texto para almacenar números
grandes es bastante ineficiente por el espacio que ocupa.
• Una alternativa es abrir el archivo en modo binario y utilizar las
funciones fread y fwrite.
ESCUELA DE COMPUTACIÓN
Archivos sin Formato
• Algunas aplicaciones requieren el uso de archivos de datos
que almacenen bloques de datos y cada bloque consiste de
un número fijo de bytes almacenados en forma contigua.
• Los bloques de datos pueden representar estructuras
complejas de datos (estructuras de C o arreglos).
• Se debe tener la posibilidad de leer o escribir bloques
completos de datos, en lugar de manejar los elementos
individuales de las estructuras complejas.
• Se utilizan las funciones de librería de C fread y fwrite
son funciones de lectura/escritura sin formato.
• Los archivos son denominan archivos de datos sin formato.
ESCUELA DE COMPUTACIÓN
fwrite y fread
• Las funciones fread y fwrite requieren cuatro argumentos.
• Un puntero al bloque de datos.
• El tamaño del bloque de datos.
• El número de bloques de datos a ser manejados en la
transferencia.
• Un puntero cadena (stream pointer).
• Ejemplo de uso de fwrite
fwrite(&stud, sizeof(marks_list), 1, mark_ptr);
donde:
stud: la variable estructura de tipo marks_list,
mark_ptr:el puntero asociado con el archivo
1: indica el número de bloques a ser transferidos.
ESCUELA DE COMPUTACIÓN
Uso de Archivos sin Formato...Ejemplo 1
1 #include <stdio.h>
2 #define SIZE 2
3 /* Estructura */
4 typedef struct{
5
char idno[9];
6
char nombre[45];
7 /* Notas de los 6 cursos */
8
float notas[6];
9 }LISTA_NOTAS;
10 /* Función para obtener datos del usuario y
almacenarlo en un archivo */
11 void almacenarDatos(){
12
FILE *in_mark_ptr;
13
LISTA_NOTAS in_stud[SIZE];
14
int j,k;
15 /* Abrir archivo modo escritura */
16
in_mark_ptr = fopen("history.dat","wb");
17
k = 0;
ESCUELA DE COMPUTACIÓN
Uso de Archivos sin Formato... Ejemplo 1
18 /* Leer datos de los estudiantes */
19 while(k < SIZE){
20
printf("Introduzca IDNO");
21
scanf("%s",in_stud[k].idno);
22
fflush(stdin);printf("Ingrese el Nombre\n");
23
scanf("%s",in_stud[k].nombre);
24
printf("Ingresar las notas de 6 cursos \n");
25
for(j = 0; j < 6; j++){
26
do{
27
printf("Notas de los Cursos No: %d[0-100]\n",j+1);
28
scanf("%f", &in_stud[k].notas[j]);
29
}while((in_stud[k].notas[j]<0)||(in_stud[k].notas[j]>100));
30
}
31
k++;
32 }
33 for(k = 0; k < SIZE; k++)
34
fwrite(&in_stud[k], sizeof(LISTA_NOTAS),1,in_mark_ptr);
35 /* Cerrar archivo */
36 fclose(in_mark_ptr);
37}
ESCUELA DE COMPUTACIÓN
Uso de Archivos sin Formato... Ejemplo 1
38 /* Leer los datos del archivo e imprimirlos */
39 void recuperarDatos(){
40
FILE *out_mark_ptr; LISTA_NOTAS out_stud[SIZE];
41
int j,k;
42 /* Abrir archivo modo lectura */
43
out_mark_ptr = fopen("history.dat","rb");
44 /* Leer datos de los estudiante del archivo */
45
k = 0;
46
while (k < SIZE){
47
fread(&out_stud[k], sizeof(LISTA_NOTAS), 1, out_mark_ptr);
48
k++;
49
}
50 /* Cerrar archivo */
51
fclose(out_mark_ptr);
52
for(k = 0; k < SIZE; k++){
53
printf("\n%s:%s\n",out_stud[k].idno,out_stud[k].nombre);
54
printf("Notas en los Cursos:\n");
55
for(j = 0; j < 6; j++)
56
printf("%6.2f\n", out_stud[k].notas[j]);
57
}
58 }
ESCUELA DE COMPUTACIÓN
Resumen
• Se identificaron diferentes áreas en la resolución de
problemas que requieren leer o escribir datos en
dispositivos de almacenamiento secundario.
• Se aprendió a manejar los archivos de datos que
ofrece C.
• Se discutió el método de manejar
secuenciales (stream oriented files) en C.
archivos
• Se presentaron y usaron diversas funciones de librería
que permiten crear, leer y escribir archivos en disco.
ESCUELA DE COMPUTACIÓN