Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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
Apertura 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
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
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
#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
#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
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
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
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
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
Siempre deben cerrarse aunque el sistema los cierra al final de la ejecucin del programa.
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.
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
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
Lectura de archivo
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
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
Posicionamiento en un archivo
rewind(FILE *fp);
#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
#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);
}
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 Descripcin
#include <conio.h>
#include <string.h>
void main()
{
char s[30]={"XXX"};
int i;
clrscr();
puts(&s[0])
getch();
}
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.
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
[.prec] Descripcin
#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();
}
#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();
}