Sei sulla pagina 1di 11

CAPTULO 5

MANEJO DE ARCHIVOS

Actualmente existen dos formas para manejar los archivos en lenguaje C, uno llamado de primer nivel
(tambin llamado secuencial) y otro llamado de segundo nivel (tambin llamado tipo registro o de alto nivel).
En el estndar UNIX tradicional, se diseo un sistema de archivos con buffer para operar sobre archivos
textos y un sistema de archivos sin buffer para operar sobre archivos binarios. Finalmente el comit ANSI decidi
que no haba razn para que existiesen dos sistemas separados para el manejo de archivos por lo que el sistema de
archivos sin buffer no forma parte del estndar propuesto. En la actualidad un gran nmero de compiladores
soporta la operaciones de bajo nivel.
En el nivel ms bajo se considera el archivo como un conjunto de bytes continuos, esto sin tener en cuenta
como se han grabado, un usuario puede leer la cantidad de bytes que desee no importando la posicin en la cual se
encuentren stos.
En el modo de ms alto nivel se puede acceder a uno o varios registros, es decir, lo que se lee cada vez es
una agrupacin lgica. Las operaciones de primer nivel, como se las llama a las de nivel ms bajo, son las ms
potentes. Se dice que estas operaciones son las primitivas del sistema: son las operaciones bsicas. Las de segundo
nivel se construyen a partir de stas.

5.1. INSTRUCCIONES A BAJO NIVEL

La siguiente tabla muestra las instrucciones de primer nivel para manejo de archivos. Todas estas
funciones se encuentran definidas en el archivo io.h.

Funcin Descripcin

read() Lee un buffer de datos


write() Escribe un buffer de datos
open() Abre un archivo en disco
close() Cierra un archivo
lseek() Busca un byte especificado
unlink() Elimina un archivo del directorio

Tabla 5.1. Funciones para manejo de archivo en bajo nivel.

Apertura de archivo

int open(char *nomfich,int modo) /* devuelve un numero de archivo */

Si la operacin ha resultado sin fallas, open devuelve el nmero que ha adjudicado al archivo que acaba
de abrir. Devuelve un -1 en el caso de que se produzca un error. Para esta funcin el modo puede tener los
siguientes valores:
44 Preparado por Juan Ignacio Huircn

Modo Efecto

0x01 Slo Lectura O_RDONLY


0x02 Slo Escritura O_WRONLY
0x04 Lectura/Escritura O_RDWR

Tabla 5.2. Modos de acceso de archivo.

Sin embargo, si el archivo no existe, se producir un error. Para especificar el modo se debe recurrir
entonces a otras configuraciones de bits. Definidas en fcntl.h, los principales son los siguientes:

Modo Descripcin

O_APPEND (0x0800) Escritura al final del archivo


O_CREAT (0x0100) Creacin si el fichero no existe
O_TRUNC (0x0200) Vaca un archivo que ya existe
O_TEXT (0x4000) Considera loa archivo como texto.
O_BINARY (0x8000) Considera los archivos como binarios, no existen caracteres especiales.

Tabla 5.3. Modos de apertura de archivo.

Cuando se vaya a crear un archivo debe especificarse un tercer argumento. Este tercer argumento indica el
modo de proteccin, los cuales estn definidos en sys\stat.h

Modo de proteccin Descripcin

S_IWRITE Sin proteccin contra escritura.


S_IREAD Sin proteccin contra lectura.
S_IREAD | S_IWRITE Lectura y escritura autorizada.

Tabla 5.4. Modos de proteccin.

Ej 5.1. Abriendo un archivo

#include <stdio.h>
#include <io.h>
void main()
{
int f, modo=0x01;
if( (f= open("Nombre1", modo))==-1)
{
printf("NO se puede abrir ! ");
}
}

Para este ejemplo el archivo NOMBRE1 debe existir. Si NO existe la funcin open devuelve -1.
Apuntes de Herramientas de Programacin 45

Ej 5.2. Abriendo un archivo que no existe.

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
void main()
{
int f, modo=0x04; /* Se puede usar O_RDWR en vez de modo */
if( (f= open("Nombre1", modo|O_CREAT))==-1)
{
printf("NO se puede abrir ! ");
} else printf(" Archivo Abierto !");
}

Para este ejemplo si el archivo NO existe lo crea. El acceso ser de lectura-escritura. Todo lo que escriba
en el archivo borrar la informacin existente. Si el modo es O_RDONLY , slo se podr leer.
Para proteger los archivos, se pueden utilizar los modos de proteccin indicados, estos deben pasarse a la
funcin open como un tercer argumento.

Lectura de archivos

int read(int fn, char *buf,int nbytes);

Lee el nmero de caracteres especificados por nbytes, contados a partir de la posicin actual en el
archivo identificado por el nmero que contiene fn. Los bytes ledos se almacenan en la zona de memoria
apuntada por buf.
La funcin devuelve el nmero de caracteres que realmente se hayan ledo. Si se produce un error
devuelve -1.
Si el nmero de caracteres ledos es inferior al nmero de caracteres pedidos significa que se ha llegado al
final del archivo. Cada vez que se efecta la operacin read, se incrementa en nbytes el puntero de posicin
actual en el archivo.

Escritura de archivos

int write(int fn,char *buf,int nbytes);

Escribe el nmero de caracteres especificados por nbytes, los que se deben encontrar en la zona
apuntada por buf, a partir del puntero de la posicin actual del archivo.
Esta funcin devuelve el nmero de caracteres realmente escritos. En el caso de que se produzca un error
devuelve un -1.

Posicionamiento de un archivo

long lseek(int fn, long desp1,int modo);


46 Preparado por Juan Ignacio Huircn

Devuelve el nuevo valor del puntero de posicin actual en un archivo, o sea el desplazamiento en nmero
de bytes (en formato long) relativo al principio del archivo. Si ocurre un error retorna -1L (-1 en formato
long).
Cambia el valor del puntero de posicionamiento en el archivo. El desplazamiento es siempre relativo a
una posicin que depende del modo.

Modo Descripcin

0 Principio del archivo


1 Posicin actual en el archivo
2 Al final del archivo

Tabla 5.4. Modos de posicionamiento

Se recalca que el desplazamiento es un valor long, es decir:

lseek(5, 180L, 0);

Se est accesando el archivo 5, a 180 caracteres respecto del principio. La definicin de esta funcin se
encuentra el prototipo io.h.

Cierre de archivos

int close(int fn);

Siempre deben cerrarse aunque el sistema los cierra al final de la ejecucin del programa.

Ej 5.3. Ejemplos de apertura de archivos

Un archivo se puede crear con las ordenes open, creat o creatnew . Cuando se trabaja en DOS para la
creacin de un archivo se debe especificar un tercer argumento.

open("NOMBRE", O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IREAD|S_IWRITE);

Crea un archivo con nombre "NOMBRE", en modo binario. Si el archivo ya existiera, ser borrado el
antiguo. No tiene ninguna proteccin (se podr borrar sin ningn problema).

open("NOMBRE", O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);

Igual al caso anterior, pero en este caso el archivo est protegido contra escritura.

open("NOMBRE", O_WRONLY|O_APPEND|O_TEXT,S_IREAD,S_IWRITE);

Se abrir un archivo "NOMBRE" tipo texto, y el puntero se posicionar al final del archivo, escribir a
continuacin.

open("NOMBRE", O_CREAT|O_RDONLY|O_TEXT);
Apuntes de Herramientas de Programacin 47

Se abre el archivo "NOMBRE" tipo texto si no existe lo crea, en caso contrario lo abre pero no se
modifica el escribir sobre l.

5.2. INSTRUCCIONES DE SEGUNDO NIVEL (ALTO NIVEL)

En las instrucciones de segundo nivel los archivos ya no se designan por un nmero, sino, por un puntero
a una estructura compleja llamada FILE cuya descripcin se haya en el archivo stdio.h.

Apertura de archivo

FILE *fopen(char *nombrefich, char *modo);

fopen devuelve un puntero a una estructura FILE. En el caso de existir un error devuelve NULL. El
modo se especifica mediante una cadena de caracteres.

Modo Descripcin

"r" Para lectura solamente.


"w" Para escritura solamente (si el archivo ya existiera lo borra).
"a" Aadir al final de un archivo que ya existe.
"r+" Actualizar uno que ya existe.

Tabla 5.5. Modos de apertura en alto nivel.

Ej 5.4. Para abrir un archivo binario o texto

#include <stdio.h> #include <stdio.h>


void main() void main()
{ {
FILE * fp; FILE * fp;
fp=fopen("NOMBRE", "wb"); fp=fopen("NOMBRE", "wt");
... ...
} }

Lectura de archivo

int fread(char *p,int s,int n, FILE *fp);

Lee n registros de tamao s del archivo indicado por fp y los almacena en la zona de memoria indicada
por p. fread devuelve el nmero de registros leidos, si este nmero es menor que el pedido, se ha llegado al final
del archivo. Para mayor precisin se usa el feof.
48 Preparado por Juan Ignacio Huircn

Escritura de archivo

fwrite(char *p,int s,int n, FILE *fp);

Escribe n registros de tamao s del archivo indicado por fp. Los registros se encuentran almacenados en
la zona de memoria indicada por p. La funcin devuelve el nmero de registros realmente escritos.

Cerrar archivo

int fclose(FILE *fp);

Posicionamiento en un archivo

fseek(FILE *fp, long pos, int modo); /* Anloga a lseek */

Condicin de fin de archivo

int feof(FILE *fp);

Posicionamiento al comienzo de un archivo

rewind(FILE *fp);

Ej 5.5. Creacin de un archivo de registros.

#include <stdio.h>
#include <string.h>
void main()
{
FILE *fp;
struct {char nombre[10]; int edad;}persona;
char buf[65];
fp=fopen("PERSONAS", "wb");
printf("\nNOMBRE :?");
gets(&buf[0])
wihile(buf[0])
{
strcpy(persona.nombre,&buf[0]);
printf("\nEDAD :?");
gets(&buf[0]);
sscanf(&buf[0],"%d",&persona.edad);
fwrite((char *)&persona,12,1,fp);
printf("\nNOMBRE :?");
gets(&buf[0])
}
fclose(fp);
}
Apuntes de Herramientas de Programacin 49

Ej 5.6. Creacin de un archivo ASCII.

#include <stdio.h>
#include <string.h>
void main()
{
FILE *fp;
struct {char nombre[10]; int edad;}persona;
char buf[65];
fp=fopen("PERSONAS", "wt");
printf("\nNOMBRE :?");
gets(&buf[0])
wihile(buf[0])
{
strcpy(persona.nombre,&buf[0]);
printf("\nEDAD :?");
gets(&buf[0]);
sscanf(&buf[0],"%d",&persona.edad);
fprintf(fp,"%12s %d\n",persona.nombre,persona.edad);
printf("\nNOMBRE :?");
gets(&buf[0])
}
fclose(fp);
}

5.3. FORMAS ADICIONALES DE ENTRADA/SALIDA

Una de la forma muy comn de ingreso de datos es la que se realiza por teclado, a continuacin se dan
algunos ejemplos, ya que indirectamente ha sido referenciadas.

Funciones para lectura de caracteres desde teclado y funciones a la salida estndar

Estas funciones se encuentran definidas en conio.h y stdio.h.

Funciones Descripcin

int getch(); Lee caracter desde teclado


int getche(); Lee caracter desde teclado e imprime en pantalla
cputs(char *str); Imprime una cadena de caractres en pantalla
char *cgets(char *str); Lee un string. str[0] especifica el largo, str[1] el tamao del string
leido y apartir de str[2] se encuentra la cadena leida. Retorna &str[2].

Tabla 5.6. Funciones para lectura de caracteres.


50 Preparado por Juan Ignacio Huircn

Ej 5.7. Utilizando funciones para imprimir caracteres en pantalla.

#include <conio.h>
#include <string.h>
void main()
{
char s[30]={"XXX"};
int i;
clrscr();
puts(&s[0])
getch();
}

A continuacin se indican algunas funciones definidas en stdio.h

Funciones Descripcin

char *gets(char *s); Lee un string desde el stdin hasta que se ingresa un caracter nueva
lnea (\n) retorna un puntero a s.
fgets(char *s,int n, FILE * fp); Realiza la misma operacin pero desde un archivo. si fue bien
realizada restorna un puntero a s, sino un NULL.
fputs(char *s,int n,FILE *fp); Escribe una cadena en un archivo.

Tabla 5.7. Funciones defindas en stdio.h.

Funciones de E/S con formato

int printf(const char *format...); /* Imprime en pantalla con formato */


int scanf(const char *format...); /* Lee de teclado con formato */

int fprintf(FILE *fpconst char *format...); /* Imprime en un archivo */


int fscanf(FILE *fp,const char *format...); /* Lee desde un archivo */

Para las funciones cada format se especifica con % seguido de un caracter que indica el tipo de
conversin (type), todo entre comillas ("). Tambin se pueden intercalar entre ambos otros especificadores.

% [flag][width][.prec][F|N|h|l] type
Apuntes de Herramientas de Programacin 51

type Formato de salida

d Entero decimal con signo


i Entero decimal con signo
o entreo octal sin signo
u decimal sin signo
x Hexadecimal sin signo
f Punto flotante[-]dddd.ddd
e Punto flotante [-]d.ddde [+/-] ddd
c Caracter
s Cadena de caracteres

Tabla 5.8. Especificacin de tipo para el formato.

[flag] Descripcin [width] Descripcin

nada Justificacin a la derecha n Relleno con n Caracteres en blanco


- Justificacin a la izquierda 0n Relleno con 0

Tabla 5.9. Descripcin de [flag] y [width].

[.prec] Descripcin

nada Precisin por defecto


.0 Precisin por defecto para d,i,o,u,x,e, E,f
.n n decimales

Tabla 5.10. Precisin.

Ej 5.8. Imprimiendo datos en pantalla con formato

#include <stdio.h>
#include <conio.h>

void main()
{
int entero =123;
char caracter=37;
float real=3.14159;
char cadena[20]={"HOLA FLACO"};
clrscr();
printf("%d\n",caracter);
printf("%c\n",caracter);
printf("%d\n",entero);
52 Preparado por Juan Ignacio Huircn

printf("%8d\n",entero);
printf("%x\n",entero);
printf("%f\n",real);
printf("%4.3f\n",real);
printf("%-8.4f\n",real);
printf("%e\n",real);
printf("%s\n",cadena);
getch();
}

Ej 5.9. Leyendo datos con formato desde teclado

#include <stdio.h>
#include <conio.h>
void main()
{
int entero =123;
float real=3.14159;
clrscr();
printf("ENTERO : ?");
scanf("%d",&entero);
printf("REAL: ?");
scanf("%f",&real);
printf("%d %f\n",entero,real);
printf("Pueden ser ingresados separdos por un espacio\n");
scanf("%d %f",&entero, &real);
printf("%d %f\n",entero, real);
getch();
}

Ej 5.10. Escritura y lectura desde un archivo

#include <stdio.h> #include <stdio.h>


#include <conio.h> #include <conio.h>
void main() void main()
{ {
int entero=34; int entero;
float real=0.5; float real;
FILE *fp; FILE *fp;
fp=fopen("TEXTO.TXT","wt"); fp=fopen("TEXTO.TXT","rt");
if(fp!=NULL) if(fp!=NULL)
{ {
fprintf(fp,"%d %f\n",45,34.56); fscanf(fp,"%d %f\n",&entero,&real);
fprintf(fp,"%d %f\n",40,3304.56); printf("%d %f\n",entero,real);
fprintf(fp,"%d %f\n",entero,real); fscanf(fp,"%d %f\n",&entero,&real);
fclose(fp); printf(fp,"%d %f\n",entero,real);
} printf("NO SE PUEDE ABRIR!\n"); fscanf(fp,"%d %f\n",&entero,&real);
getch(); printf(fp,"%d %f\n",entero,real);
}
fclose(fp);
}printf("NO SE PUEDE ABRIR!\n");
getch();
}
Apuntes de Herramientas de Programacin 53

Potrebbero piacerti anche