Clase No.8 (Archivos)

Anuncio
Algoritmos
Fundamentales
Manejo
de Archivos
ARCHIVOS DE DATOS
Nos Permiten almacenar información de modo
Permanente, acceder y modificar a la misma cuando
sea
necesario.
Los archivos de datos se localizan en dispositivos de
Almacenamiento como: disco duro, cinta, disquetes,
etc.
Tipo de Archivos (en este curso) :
• Textos
• Binarios
ARCHIVOS DE DATOS
En C el manejo de archivo es realizado a través del
concepto de flujo (streams) o canal, también llamado
secuencia.
Flujo, es por donde fluyen/transportan los datos
entre el programa y los dispositivos de
almacenamiento.
Abrir un archivo supone establecer una conexión del
Programa con el dispositivo que contiene a este.
Por este canal va a fluir la secuencia de datos.
El acceso a archivo se hace a través de buffer donde
Almacenan los datos dirigidos al archivo o desde el
archivo , el buffer es como un arreglo.
ARCHIVOS DE DATOS
Puntero FILE
Establece el área de buffer donde se va a almacenar
temporalmente la información, mientras se está
transfiriendo entre la memoria del computador y el
archivo de datos.
Abrir un Archivo
Supone conectar el programa con el archivo externo
y decir el modo en como va a ser tratado, y que tipo
de archivo es: texto(t) o binario(b).
Un archivo es abierto a través de la función fopen(),
la cual devuelve un puntero a la estructura FILE.
ARCHIVOS DE DATOS
sintaxis
fopen(nombre_archivo,modo);
nombre_archivo [cadena] :nombre o identificador
externo del archivo.
modo [cadena] :
modo de apertura o como
va a ser tratado el archivo.
La función fopen(), devuelve un puntero a FILE a
traves del cual el programa hace referencia al
archivo.
Devuelve:
NULL: si no puede abrir el archivo.
EOF: Si la operación falla o llega a fin de archivo.
ARCHIVOS DE DATOS
Modo de Apertura
“r”
“w”
“a”
Sólo de lectura
Salida, crear archivos, si existe se pierden sus
datos.
Append, para añadir al final.
“r+” Lectura/escritura. (modificar)
“w+” Crear archivos Lectura/escritura, si existe se
pierden sus datos.
“a+” Para modificar(Lectura/escritura) al final.
ARCHIVOS DE DATOS
Si el archivo es de texto, seria:
“rt” “wt” “at” “r+t” “w+t” “a+t”
Si el archivo es de binario, seria:
“rb” “wb” “ab” “r+b” “w+b” “a+b”
Cerrar un Archivo
Se usa la función fclose(puntero_file), cierra el
archivo asociado al puntero_file, devuelve EOF si
ocurre un error al cerrar.
Ej: sólo como abrir y cerrar un archivo.
#include <stdio.h>
#define NULL 0
main()
{
FILE *fpt;
fpt=fopen(“C:\windows\muestra.txt”,”r+”);
if (fpt == NULL)
printf(“\n Error: No se pudo abrir archivo”);
else
{ /*hacer algunos calculos */
......
fclose(fpt);
}
}
FUNCIONES DE LECTURA Y ESCRITURA (cont)
fputc=putc : escribe un carácter del archivo asociado
al puntero a file.
fputc(c,puntero_file); devuelve EOF si no puede
putc(c,puntero_file); escribir el archivo.
fgetc=getc : lee un carácter en el archivo asociado al
puntero a file.
fgetc(puntero_file); devuelve el carácter leido ó EOF
getc(puntero_file); si hay error o fin de archivo.
FUNCIONES DE LECTURA Y ESCRITURA
fputs() escribe una cadena en el archivo asociado al
puntero a file.
fputs(cadena,puntero_file); devuelve EOF si no puede
escribir la cadena.
fgets(): lee una cadena en el archivo asociado al
puntero a file. Termina de leer cuando encuentra el
carácter de fin de línea o cuando ha leido n-1
caracteres.
fgets(cadena,n,puntero_file); devuelve NULL si ha
habido un error.
Crear un archivo a partir de otro.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MX 121
#define MN 30
int main()
{
FILE *entrada, *salida;
char nom1[]=“cartas.dat”;
char nom2[]=“primero.dat”;
char cad[MX];
entrada=fopen(nom2,”rt”);
salida =fopen(nom1,”at”);
if (entrada == NULL || salida == NULL)
{ printf(“\n Error: No se pudo abrir archivo”);
return 0;
}
while(fgets(cad,MX,entrada))
{
if(strlen(cad) >=MN)
fputs(cad,salida);
else
puts(cad);
}
fclose(entrada);
fclose(salida);
return 0;
}
feof() Igual a macro EOF,
feof(nombre_archivo),
devuelve un valor diferente de Cero 0 (true), cuando
se lee el carácter de fin de archivo, de lo contrario
devuelve cero 0(false);
rewind() coloca el puntero del archivo al inicio de
este.
SINTAXIS:
rewind(puntero_archivo);
ARCHIVOS DE DATOS
Binarios.
Los archivos binarios son secuencia de 0’s y 1’s. Estos
archivos optimizan la memoria ocupada por un
archivo.
La mayor eficiencia de los archivos binarios se
contrapone con el echo de que su lectura se tiene que
hacer en modo binario y que sólo se pueden visualizar
desde un entorno de un programa C.
ARCHIVOS DE DATOS
Binarios.
fwrite(): escribe un buffer de cualquier tipo de dato de
un archivo binario.
Sintaxis:
fwrite(dirección_buffer,tamaño,num_elementos,puntero_archivo);
Se dispone de una muestra de las coordenadas de puntos de un
plano representada por pares de números enteros (x,y). Se desea
guardar en un archivo binario estos puntos.
#include <stdio.h>
struct punto
{
int x,y;
};
typedef struct punto PUNTO;
ARCHIVOS DE DATOS
Binarios.
#include <stdio.h>
struct punto
{
int x,y;
}
typedef struct punto PUNTO;
int main()
{
PUNTO p;
char *nom=“C:\PUNTOS.DAT”;
FILE *pp;
if ((pp=fopen(nom,”wb”))==NULL)
{
puts(“\n Error abriendo archivo”);
return 0;
}
ARCHIVOS DE DATOS
Binarios.
puts(“\n Introduce las coordenadas, para finalizar (0 0) ”);
do {
scanf(“%d %d”,&p.x,&p.y);
while(p.x <0 || p.y <0)
{ printf(“\n Coordenadas deben ser >=0 ”);
scanf(“%d %d”,&p.x,&p.y);
}
if( p.x >0 || p.y >0)
{
fwrite(&p,sizeof(PUNTO),1,pp);
}
} while ( p.x != 0 && p.y != 0);
fclose(pp);
return 0;
}
ARCHIVOS DE DATOS
Binarios.
fread(): lee de un archivo n bloques de bytes y los
amacena en el buffer.
Sintaxis:
fread(dirección_buffer,tamaño,num_bloques ,puntero_archivo);
Ejemplo. Ejemplo anterior, pero leer el mismo archivo
(archbin2.c)
ARCHIVOS DE DATOS Acceso Aleatorios
El acceso a este tipo de archivo se hace a través de su
posición relativa dentro del archivo. Se pueden leer o
escribir registros en cualquier orden y posición.
El inconveniente de este tipo de archivo es que se
necesita programar la relación existente entre el
contenido de un registro y la posición que ocupan.
Se usan las funciones : fseek() y ftell() las cuales
consideran al archivo como una secuencia de bytes, el
número de bytes es el índice del archivo.
ARCHIVOS DE DATOS Acceso Aleatorios
Mientras se va leyendo o escribiendo en el archivo la
posición actual se guarda en un puntero.
fseek() : permite cambiar la posición del puntero al
archivo a una dirección determinada. Devuelve un
valor entero, distinto de cero si se comete un error en
su ejecución, cero si no hay error.
Se puede tratar al archivo como un arreglo, la posición
del archivo va a depender del desplazamiento y el
origen relativo que se pasa como parámetro.
ARCHIVOS DE DATOS Acceso Aleatorios
Sintaxis:
fseek(puntero_archivo,desplazamiento,origen);
Desplazamiento: número de bytes a mover, debe ser
de
tipo long.
Origen:
es la posición a partir de la cual se
cuenta el número de bytes a mover,
valores que puede tener:
0: cuenta desde el inicio del archivo
1: cuenta desde la posición actual del
archivo
2: Cuenta desde el final del archivo.
Macro
SEEK_SET
SEEK_CUR
SEEK_END
ARCHIVOS DE DATOS Acceso Aleatorios
ftell() : con esta función se obtiene la posición actual
del archivo, del puntero a archivo que se pasa como
parámetro.
Sintaxis:
ftell(puntero_archivo);
La función devuelve la posición como número de byte,
en entero largo (long int), desde el inicio del
archivo(byte 0).
Descargar