Professional Documents
Culture Documents
ndice
A. Archivos secuenciales
A.1.Definicin
A.2.Apertura y cierre
A.3.Creacin
A.4.Leer dato
A.5.Escribir los datos
A.6.Ejemplos
B. Archivos Aleatorio
B.1. Definicin
B.2.Apertura y cierre
B.3. Leer datos
B.4. Escribir datos
B.5.Funciones de entrada/salida
B.6. Ejemplo programa
A. Archivos secuenciales
1. Definicin
R: Es la forma bsica de organizar un conjunto de registros, que forman un
archivo, utilizando una organizacin secuencial. En un archivo organizado
secuencialmente, lo registros quedan grabados consecutivamente cuando el
archivo se utiliza como entrada. En la mayora de los casos, los registros de un
archivo secuencial quedan ordenados de acuerdo con el valor de algn campo de
cada registro. Semejante archivo se dice que es un archivo ordenado; el campo, o
los campos, cuyo valor se utiliza para determinar el ordenamiento es conocido
como la llave del ordenamiento. Un archivo puede ordenarse ascendente o
descendentemente con base en su llave de ordenamiento.
La forma ms comn de estructura de archivo es el archivo secuencial. En este
tipo de archivo, un formato fijo es usado para los registros. Todos los registros
tienen el mismo tamao, constan del mismo nmero de campos de tamao fijo en
un orden particular. Como se conocen la longitud y la posicin de cada campo,
solamente los valores de los campos se necesitan almacenarse; el nombre del
campo y longitud de cada campo son atributos de la estructura de archivos.
2. Apertura y cierre:
Abrir:
Usar un archivo desde un programa en C, tanto secuencial como directo, lo
primero que hay que hacer es abrirlo. Esto crea un flujo que conecta nuestro
programa con el archivo.
La funcin para abrir archivos es fopen(), que tiene esta sintaxis:
FILE *fopen(char *nombre_archivo, char *modo);
Cierre:
Cuando un archivo no va a usarse ms, su flujo debe ser cerrado para liberar
memoria. Aunque tericamente todos los archivos abiertos por un programa se
cierran automticamente al finalizar dicho programa, el programador, por
precaucin, debe ocuparse de hacerlo dentro del cdigo.
Para cerrar un archivo se usa la funcin fclose(), con esta sintaxis:
int fclose(FILE* puntero_file);
EOF es una constante definida en stdio.h. La funcin feof(), nos dice si hemos
alcanzado el final de un archivo. Devuelve un 0 (falso) si an no se ha llegado al
final, y otro valor cuando se ha alcanzado. Es muy til para saber si podemos
seguir leyendo caracteres o ya los hemos ledo todos. Su prototipo es:
int feof(FILE* puntero_a_archivo);
fscanf():
Lee los datos de un archivo, en lugar de hacerlo del flujo stdin (es decir, del
teclado).
Los modos de apertura vlidos son:
Modo r: Abre el archivo existente para lectura en modo secuencial. El archivo
debe existir previamente.
Modo w: Crea un archivo nuevo para escritura en modo secuencial. Cuidado!
Si el archivo ya existe, se borrar y se crear uno nuevo.
Modo a: Abre un archivo existente para escritura en modo secuencial,
aadiendo los datos al final de los que haya. Si el archivo no existe, se
crea.
Modo r+: Abre el archivo para lectura/escritura en modo directo. El archivo debe
existir previamente. Se puede leer y escribir en cualquier posicin del archivo.
Modo w+: Crea un archivo para lectura/escritura en modo directo. Si el archivo
ya existe, se elimina y se crea de nuevo. Se puede leer y escribir en cualquier
posicin del archivo.
Modo a+: Abre un archivo existente para lectura/escritura en modo directo. Si el
archivo no existe, lo crea. La escritura slo se podr realizar al final del archivo
(modo aadir), aunque se puede leer en cualquier posicin.
A todos estos modos se les puede aadir la letra b si el archivo es binario, o t si
es de texto.
4. Leer datos:
Los archivos datos que contienen solo cadenas de cadena de caracteres pueden
crearse y leerse ms fcilmente con programas que utilizan funciones de la
biblioteca especialmente orientados para cadena de caracteres. Algunas funciones
de este tipo son gets, puts, fgets, fputs, las dos primeras leen o escriben cadenas
de caracteres desde dispositivos de salidas, mientras que las otras las
intercambias por archivos.
5. Escritura de los archivos secuenciales:
Los archivos secuenciales tienen algunas caractersticas que hay que tener en
cuenta:
Para escribir datos a un archivo se utilizan las instrucciones Write y WriteLn, como
si se quisiera escribir a la pantalla, con la diferencia de que se especificar la
variable de archivo ya declarada. Ejemplo:
B.
Archivos Aleatorios
1 Definicin:
Es aquel en donde los datos se guardan en registros mediante una estructura
definida de tipo Type.
Los archivos de acceso aleatorio son ms verstiles, permiten acceder a cualquier
parte del fichero en cualquier momento, como si fueran arrays en memoria.
Las operaciones de lectura y/o escritura pueden hacerse en cualquier punto del
archivo.
2 Apertura de un archivo aleatorio
Para procesar un archivo en C la primera operacin que hay que realizar es abrir
el archivo. La apertura del archivo supone conectar el archivo externo con el
programa, e indicar cmo va a ser tratado el archivo: binario, de caracteres, etc. El
programa accede a los archivos a travs de un puntero a la estructura FILE, la
funcin de apertura devuelve dicho puntero. La funcin para abrir un archivo es
fopen() y el formato de llamada es:
fopen(nombre_archivo, modo);
Donde nombre_archivo es un puntero a una cadena de caracteres que
representan un nombre vlido del archivo y puede incluir una especificacin del
directorio. La cadena a la que apunta modo determina como se abre el archivo.
La funcin devuelve un puntero a FILE, a travs de dicho puntero el programa
hace referencia al archivo. La llamada fopen() se debe hacer de tal forma que el
valor que devuelve se asigne a una variable puntero a FILE, para as despus
referirse a dicha variable.
El siguiente ejemplo declara una variable de tipo puntero a FILE y posteriormente
se utiliza una sentencia se apertura de archivo.
FILE* pf;
pf = fopen(nombre_archivo, modo);
A continuacin se muestra una tabla conteniendo los modos permitidos para abrir
un archivo as como su significado.
Modo
r
w
a
rb
wb
ab
Significado
Abre un archivo de texto para lectura.
Crea un archivo de texto para escritura.
Abre un archivo de texto para aadir.
Abre un archivo binario para lectura.
Crea un archivo binario para escritura.
Abre un archivo binario para aadir.
r+
w+
a+
r+b
w+b
a+b
Lectura de datos
fgetc
Esta funcin lee un caracter a la vez del archivo que esta siendo sealado con el
puntero *archivo. En caso de que la lectura sea exitosa devuelve el caracter ledo
y en caso de que no lo sea o de encontrar el final del archivo devuelve EOF.
El prototipo correspondiente de fgetc es:
char fgetc(FILE *archivo);
Esta funcin se usa generalmente para recorrer archivos de texto.
fgets
Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1
caracteres o hasta que lea un cambio de lnea '\n' o un final de archivo EOF. En
este ltimo caso, el carcter de cambio de lnea '\n' tambin es ledo.
El prototipo correspondiente de fgets es:
fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Esta funcin lee un bloque de una "stream" de datos. Efecta la lectura de un
arreglo de elementos "count", cada uno de los cuales tiene un tamao definido por
"size". Luego los guarda en el bloque de memoria especificado por "ptr". El
indicador de posicin de la cadena de caracteres avanza hasta leer la totalidad de
bytes. Si esto es exitoso la cantidad de bytes ledos es (size*count).
PARAMETROS:
ptr : Puntero a un bloque de memoria con un tamao mnimo de (size*count)
bytes.
size : Tamao en bytes de cada elemento (de los que voy a leer).
count : Nmero de elementos, los cuales tienen un tamao "size".
stream: Puntero a objetos FILE, que especifica la cadena de entrada.
fscanf
La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada
se toma de un fichero en lugar del teclado.
El prototipo correspondiente de fscanf es:
int fscanf(FILE *fichero, const char *formato, argumento, ...);
4.
Escritura de datos
fputc
Esta funcin escribe un carcter a la vez del archivo que esta siendo sealado con
el puntero *archivo. El valor de retorno es el carcter escrito, si la operacin fue
completada con xito, en caso contrario ser EOF.
El prototipo correspondiente de fputc es:
int fputc(int carcter, FILE *archivo);
fputs
Funcin fputs:
La funcin fputs escribe una cadena en un archivo. No se aade el carcter de
retorno de lnea ni el carcter nulo final.
El valor de retorno es un nmero no negativo o EOF en caso de error. Los
parmetros de entrada son la cadena a escribir y un puntero a la estructura FILE
del archivo donde se realizar la escritura.
Sintxis:
int fputs(const char *cadena, FILE *stream);
Funcin fwrite:
Esta funcin tambin est pensada para trabajar con registros de longitud
constante y forma pareja con fread. Es capaz de escribir hacia un archivo uno o
varios registros de la misma longitud almacenados a partir de una direccin de
memoria determinada.
El valor de retorno es el nmero de registros escritos, no el nmero de bytes.
Los parmetros son: un puntero a la zona de memoria donde se almacenarn los
datos ledos, el tamao de cada registro, el nmero de registros a leer y un
puntero a la estructura FILE del fichero del que se har la lectura.
Sintxis:
Funcin ftell:
La funcin ftell sirve para averiguar la posicin actual del cursor de
lectura/excritura de un archivo.
El valor de retorno ser esa posicin, o -1 si hay algn error. El parmetro de
entrada es un puntero a una estructura FILE del fichero del que queremos leer la
posicin del cursor de lectura/escritura.
Sintaxis:
long int ftell(FILE *fichero);
6. programa ejemplo
#include <stdio.h>
#include <stdlib.h>
struct stRegistro {
}
system("PAUSE");
}
// Muestra un registro por pantalla en forma de listado,
// si no est marcado como borrado
void Listar(long n, struct stRegistro *reg)
{
int i;
if(reg->valido == 'S') {
printf("[%6ld] %-34s", n, reg->nombre);
for(i = 0; i < 4; i++) printf(", %4d", reg->dato[i]);
printf("\n");
}
}
// Lee un nmero suministrado por el usuario
long LeeNumero()
{
char numero[6];
fgets(numero, 6, stdin);
return atoi(numero);
}
// Elimina los registros marcados como borrados
void Empaquetar(FILE **fa)
{
FILE *ftemp;
struct stRegistro reg;
ftemp = fopen("alea.tmp", "wb");
rewind(*fa);
while(fread(&reg, sizeof(struct stRegistro), 1, *fa))
if(reg.valido == 'S')
fwrite(&reg, sizeof(struct stRegistro), 1, ftemp);
fclose(ftemp);
fclose(*fa);
remove("alea.bak");
rename("alea.dat", "alea.bak");
rename("alea.tmp", "alea.dat");
*fa = fopen("alea.dat", "r+b");
Conclusin