Está en la página 1de 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
read()
write()
open()
close()
lseek()
unlink()

Descripcin
Lee un buffer de datos
Escribe un buffer de datos
Abre un archivo en disco
Cierra un archivo
Busca un byte especificado
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
0x01
0x02
0x04

Efecto
Slo Lectura
Slo Escritura
Lectura/Escritura

O_RDONLY
O_WRONLY
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
O_APPEND
O_CREAT
O_TRUNC
O_TEXT
O_BINARY

Descripcin
(0x0800)
(0x0100)
(0x0200)
(0x4000)
(0x8000)

Escritura al final del archivo


Creacin si el fichero no existe
Vaca un archivo que ya existe
Considera loa archivo como texto.
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
S_IREAD
S_IREAD | S_IWRITE

Sin proteccin contra escritura.


Sin proteccin contra lectura.
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
0
1
2

Descripcin
Principio del archivo
Posicin actual en el archivo
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
"r"
"w"
"a"
"r+"

Descripcin
Para lectura solamente.
Para escritura solamente (si el archivo ya existiera lo borra).
Aadir al final de un archivo que ya existe.
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>
void main()
{
FILE * fp;
fp=fopen("NOMBRE", "wb");
...
}

#include <stdio.h>
void main()
{
FILE * fp;
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
int getch();
int getche();
cputs(char *str);
char *cgets(char *str);

Descripcin
Lee caracter desde teclado
Lee caracter desde teclado e imprime en pantalla
Imprime una cadena de caractres en pantalla
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);


fgets(char *s,int n, FILE * fp);
fputs(char *s,int n,FILE *fp);

Lee un string desde el stdin hasta que se ingresa un caracter nueva


lnea (\n) retorna un puntero a s.
Realiza la misma operacin pero desde un archivo. si fue bien
realizada restorna un puntero a s, sino un NULL.
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...);


int scanf(const char *format...);

/* Imprime en pantalla con formato */


/* Lee de teclado con formato */

int fprintf(FILE *fpconst char *format...);


int fscanf(FILE *fp,const char *format...);

/* Imprime en un archivo */
/* 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


type
d
i
o
u
x
f
e
c
s

51
Formato de salida

Entero decimal con signo


Entero decimal con signo
entreo octal sin signo
decimal sin signo
Hexadecimal sin signo
Punto flotante[-]dddd.ddd
Punto flotante [-]d.ddde [+/-] ddd
Caracter
Cadena de caracteres

Tabla 5.8. Especificacin de tipo para el formato.

[flag]

Descripcin

[width]

nada
-

Justificacin a la derecha
Justificacin a la izquierda

n
0n

Descripcin
Relleno con n Caracteres en blanco
Relleno con 0

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

[.prec]
nada
.0
.n

Descripcin
Precisin por defecto
Precisin por defecto para d,i,o,u,x,e, E,f
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 <conio.h>
void main()
{
int entero=34;
float real=0.5;
FILE *fp;
fp=fopen("TEXTO.TXT","wt");
if(fp!=NULL)
{
fprintf(fp,"%d %f\n",45,34.56);
fprintf(fp,"%d %f\n",40,3304.56);
fprintf(fp,"%d %f\n",entero,real);
fclose(fp);
} printf("NO SE PUEDE ABRIR!\n");
getch();
}

#include <stdio.h>
#include <conio.h>
void main()
{
int entero;
float real;
FILE *fp;
fp=fopen("TEXTO.TXT","rt");
if(fp!=NULL)
{
fscanf(fp,"%d %f\n",&entero,&real);
printf("%d %f\n",entero,real);
fscanf(fp,"%d %f\n",&entero,&real);
printf(fp,"%d %f\n",entero,real);
fscanf(fp,"%d %f\n",&entero,&real);
printf(fp,"%d %f\n",entero,real);
fclose(fp);
}printf("NO SE PUEDE ABRIR!\n");
getch();
}

Apuntes de Herramientas de Programacin

53

También podría gustarte