Académique Documents
Professionnel Documents
Culture Documents
yacerque@gmail.com
ARCHIVOS EN C
Ing Yamil Armando Cerquera Rojas yacerque@gmail.com
Especialista en Sistemas Universidad Nacional
Docente Universidad Surcolombiana
Neiva - Huila
CONTENIDO
Qu es un archivo?.......................................................................................2
Diferencias con el manejo de pantalla y teclado:.............................................2
Funcin FILE:..........................................................................................2
Apertura de un archivo: fopen().......................................................................3
Comprobar si un archivo est abierto..........................................................4
Cierre de un archivo: fclose()...........................................................................5
Operaciones bsicas con archivos.....................................................................6
Archivos de texto...........................................................................................7
Creacin de un archivo:...............................................................................7
Las funciones fprintf() y fscanf():..................................................................8
Ejemplo: Utilizacin de la funcin fprintf......................................................9
Comprobar fin de archivo feof.................................................................9
Ejemplo: Utilizacin de la funcin fscanf:...................................................10
Las funciones fgets(), fputs(), getc() fgetc(), putc() fputc().......................11
Ejemplo: Uso de la funcin putc...............................................................12
Ejemplo: Uso de la funcin fgetc..............................................................12
Lectura de una cadena de caracteres con la funcin fgets:...........................13
Escritura de una cadena de caracteres con la funcin fputs..........................13
Ejemplo: OPCION A: Uso de fputs y fgets..................................................13
Ejemplo: OPCION B: Uso de fputs y fgets..................................................15
Ejemplo: Uso de la funcin gets, fprintf y fscanf.........................................15
Ejemplo: Uso de la funcin getc y putc......................................................16
Ejemplo: Almacenamiento de estructuras en archivos de tipo texto con fprintf.
...........................................................................................................17
Archivos Binarios..........................................................................................18
Escritura:.................................................................................................18
Fwrite...................................................................................................18
Lectura:...................................................................................................20
Fread....................................................................................................20
Estructuras guardadas en archivos binarios:..................................................21
Acceso directo a registros en archivos binarios..............................................24
fseek y ftell..............................................................................................24
fseek....................................................................................................24
ftell......................................................................................................25
Archivos con Jerarqua de clases..................................................................30
Creacin del objeto.................................................................................31
Universidad Surcolombiana
1de48
Universidad Surcolombiana
2de48
Listado de Ejemplos
Ejemplo 1: Utilizacin de la funcin fprintf.............................................12
Ejemplo 2: Utilizacin de la funcin fscanf:............................................14
Ejemplo 3: Uso de la funcin putc........................................................15
Ejemplo 4: Uso de la funcin fgetc........................................................16
Ejemplo 5: Uso de fputs y fgets sin control de errores al abrir y cerrar.......17
Ejemplo 6: Uso de fputs y fgets con control de errores al abrir y cerrar......17
Ejemplo 7: Uso de fputs y fgets...........................................................18
Ejemplo 8: Uso de la funcin gets, fprintf y fscanf...................................18
Ejemplo 9: Uso de la funcin getc y putc...............................................19
Ejemplo 10: Almacenamiento de estructuras en archivos de tipo texto
haciendo uso de la funcin fprintf....................................................20
Ejemplo 11: Uso de la Funcin fwrite....................................................22
Ejemplo 12: Uso d ela funcin fread.....................................................23
Ejemplo 13: Almacenamiento de estructuras en archivos de binarios.........24
Ejemplo 15: Almacenamiento de estructuras en archivos de binarios.........25
Ejemplo 16: Uso de fflush, fwrite..........................................................26
Ejemplo 17: Uso de fread....................................................................26
Ejemplo 18: Uso de la funcin fseek.....................................................28
Ejemplo 19: Archivos binarios usando la funcin fseek().........................28
Ejemplo 20: Archivos..........................................................................30
Ejemplo 21.......................................................................................42
Ejemplo 22.......................................................................................42
Universidad Surcolombiana
3de48
Generalidades:
A menudo se necesita almacenar cierta cantidad de datos de forma
permanente. La memoria del ordenador RAM es voltil, y lo peor, escasa y
cara. De modo que cuando se necesita guardar datos durante cierto tiempo
se tiene que recurrir a sistemas de almacenamiento ms econmicos,
aunque sea a costa de que sean ms lentos.
Durante la historia de los ordenadores se han usado varios mtodos distintos
para el almacenamiento permanente de datos. Al principio se recurri a
cintas de papel perforadas, despus a tarjetas perforadas. A continuacin se
pas al soporte magntico, empezando por grandes rollos de cintas
magnticas abiertas.
Hasta aqu, todos los sistemas de almacenamiento externo eran
secuenciales, es decir, no permitan acceder al punto exacto donde se
guardaba la informacin sin antes haber partido desde el principio y sin
haber ledo toda la informacin, hasta el punto donde se encontraba la que
se estaba buscando.
Con las cintas magnticas empez lo que con el tiempo sera el acceso
aleatorio a los datos. Se poda reservar parte de la cinta para guardar cierta
informacin sobre la situacin de los datos, y aadir ciertas marcas que
hicieran ms sencillo localizarla.
Pero no fue hasta la aparicin de los discos magnticos cuando sta tcnica
lleg a su sentido ms amplio. En los discos es ms sencillo acceder a
cualquier punto de la superficie en poco tiempo, ya que se accede al punto
de lectura y escritura usando dos coordenadas fsicas. Por una parte la
cabeza de lectura/escritura se puede mover en el sentido del radio del disco,
y por otra el disco gira permanentemente, con lo que cualquier punto del
disco pasa por la cabeza en un tiempo relativamente corto. Esto no pasa con
las cintas, donde slo hay una coordenada fsica.
Con la invencin y proliferacin de los discos se desarrollaron los archivos de
acceso aleatorio, que permiten acceder a cualquier dato almacenado en un
archivo en relativamente poco tiempo.
Actualmente, los discos duros tienen una enorme capacidad y son muy
rpidos, aunque an siguen siendo lentos, en comparacin con la memoria
RAM del PC. El caso de los CD es algo intermedio. En realidad son
Universidad Surcolombiana
4de48
secuenciales en cuanto al modo de guardar los datos, cada disco slo tiene
una pista de datos grabada en espiral. Sin embargo, este sistema,
combinado con algo de memoria RAM, proporciona un acceso muy prximo
al de los discos duros.
Qu es un archivo?
Universidad Surcolombiana
5de48
Universidad Surcolombiana
6de48
Universidad Surcolombiana
7de48
Funcin FILE:
C define la estructura de datos FILE en el archivo de cabecera "stdio.h" para
el manejo de archivos. Se debe usar siempre punteros a estas estructuras.
La definicin de sta estructura depende del compilador, pero en general
mantienen un campo con la posicin actual de lectura/escritura, un buffer
para mejorar las prestaciones de acceso al archivo y algunos campos para
uso interno.
Para apuntar al rea de buffer se utiliza la siguiente declaracin:
FILE *punt_archivo;
Donde:
El puntero FILE *
Todas las funciones de estrada/salida estndar usan este puntero para
conseguir informacin sobre el fichero abierto. Este puntero no apunta al
archivo sino a una estructura que contiene informacin sobre l.
Esta estructura incluye entre otras cosas informacin sobre el nombre del
archivo, la direccin de la zona de memoria donde se almacena el fichero,
tamao del buffer.
Como dato curioso se adjunta la definicin de la estructura FILE definida en
el fichero stdio.h:
typedef struct
{ int _cnt;
char *_ptr;
char *_base;
int _bufsiz;
int _flag;
Universidad Surcolombiana
8de48
int _file;
char *_name_to_remove;
int _fillsize;
} FILE;
Typedef struct
{ int eda ;
Float alt;
Char nom[10] ;
} yamil ;
Yamil xx,yy ;
Universidad Surcolombiana
9de48
Universidad Surcolombiana
10de48
Si pfich es igual a NULL, significa que no se ha podido abrir por algn error.
Lo ms conveniente es salir del programa. Para salir se utiliza la funcin
exit(1), el 1 indica al sistema operativo que se han producido errores.
Universidad Surcolombiana
11de48
Universidad Surcolombiana
12de48
exit(1); }
}
Tipos de archivo:
Texto
o Archivos ASCII planos, obtenidos y manejados desde programa
utilizando cadenas de caracteres.
o Se pueden ver con un editor de texto.
Binario
o Archivos con los datos guardados como copia exacta de la memoria
del ordenador (binario).
o Slo comprensible desde un programa que sepa qu tipos de
o datos contiene el archivo y de qu forma estn guardados.
o Si se visualizan con un editor de texto no son comprensibles.
o Los archivos binarios y los programa que utilizan archivos binarios
no son fcilmente portables a otros ordenadores y otros
compiladores (el tamao de las variables puede variar).
Archivos de texto
Los archivos de texto son legibles y fciles de portar, pero ocupan ms
espacio para almacenar la informacin. Los archivos binarios no son
legibles con un editor de texto y no son portables de un ordenador a otro,
pero ocupan menos espacio.
Ejemplo: Cuatro dgitos numricos 2563, que se desee guardar.
Como archivo texto ocupa 4 bytes as:
2
5
6
3
00110010 00110101 00110110 00110011
Como archivo binario ocupara 2 bytes en programacin de 16 bit`s as:
2563
00001010 00000011
Universidad Surcolombiana
13de48
Creacin de un archivo:
Un archivo secuencial debe ser creado antes de ser procesado.
Formas de crear un archivo:
o Directamente: Mediante el uso de un editor de texto (archivos de
texto).
o Indirectamente: Mediante un programa que reciba informacin, la
procese y la guarde en un archivo (texto o binario).
La lectura y escritura de archivos vara segn el tipo de archivos:
Texto: fprintf, fscanf, getc, putc, fgets, fputs
Binarios: fwrite, fread, fseek
Son los archivos que contienen caracteres ASCII.
Los archivos pueden guardar cadenas de caracteres:
Es posible utilizar las funciones de biblioteca utilizadas para escribir y/o
leer cadenas.
La diferencia est en que ahora cuando se utilicen estas funciones hay
que incluir el puntero al buffer del archivo
o putc(carcter,puntero)
o getc(puntero)
o fputs(cadena,puntero)
o fgets(cadena,numero de caracteres,puntero)
o fprintf(puntero,cadena de control,variables)
o fscanf(puntero, cadena de control,variables)
fprintf():
El funcionamiento es idntico al de printf() salvo que ahora es
necesario indicar en qu archivo ha de escribir.
Valor retornado:
o xito: devuelve el nmero de bytes que ha escrito
o Fracaso: devuelve EOF
Universidad Surcolombiana
14de48
Sintaxis:
int fprintf(FILE *fichero, const char *formato, ...);
La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la
salida se dirige a un archivo en lugar de a la pantalla.
fscanf():
El funcionamiento es idntico al de scanf() salvo que ahora es
necesario indicar de qu archivo ha de leer.
Valor retornado (cuando slo se lee un valor):
o xito: devuelve el valor 1 si ha ledo correctamente
o Fracaso: devuelve 0 si ha ocurrido un error en la lectura por una
mala especificacin de formato.
o EOF: si no se ha ledo nada porque se ha llegado al final del
archivo.
Sintaxis:
int fscanf(FILE *fichero, const char *formato, ...);
La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la
entrada se toma de un archivo en lugar del teclado.
Ejemplo 1: Utilizacin de la funcin fprintf.
En este ejemplo cada vez que se ejecute el programa se crea de nuevo el
archivo con el nombre yamil.txt sobre la raz del disco duro etiquetado
como C. Si ya existen datos previamente guardados, es decir el archivo ya
existe, los datos almacenados se perdern y se crear uno nuevo con los tres
datos que se piden al usuario ingrese por teclado.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ int n=3,
i=1;
FILE *pfich;
int dato;
clrscr();
Universidad Surcolombiana
15de48
124
123
Universidad Surcolombiana
while ( !feof(archivo) )
16de48
Universidad Surcolombiana
17de48
Lectura de un carcter:
int fgetc(FILE *puntero_a_archivo)
int getc(FILE *puntero_a_archivo)
Leen el siguiente carcter del archivo.
Valor de retorno:
xito: el carcter ledo
Fracaso: Si llega al final de archivo u ocurre un error, el valor de
retorno es EOF.
Escritura de un carcter:
int fputc(int car, FILE * puntero_a_archivo)
int putc(int car, FILE * puntero_a_archivo)
Escriben el carcter car en el archivo
puntero_a_archivo.
Valor de retorno:
xito: el propio carcter escrito
Error: EOF
al
que
apunta
Universidad Surcolombiana
18de48
Lee
una
cadena
de
caracteres
del
archivo
apuntado
por
puntero_a_archivo y la almacena en cadena.
La lectura se acaba cuando se encuentra el carcter \n (que S se escribe
en la cadena), cuando se encuentra el fin de archivo (en este caso no se
escribe \n en la cadena) o cuando se han ledo tam_cad caracteres. En
Universidad Surcolombiana
19de48
Universidad Surcolombiana
20de48
Universidad Surcolombiana
21de48
Universidad Surcolombiana
22de48
Universidad Surcolombiana
23de48
Una vez ejecutado el programa, se crea un archivo en la raz del disco duro
C, el cual contendr la siguiente informacin.
Resultado: al abrir el archivo c:\datos.txt con un editor de texto ver los
siguientes 35 caracteres.
Yamil Cerquera
179
Armando Rojas
180
Archivos Binarios
Los archivos binarios se utilizan para almacenar la informacin como una
copia exacta de la memoria del ordenador.
Normalmente, no se pueden ver con un editor de texto, pues sera una
casualidad que los bytes que contienen fuesen caracteres legibles.
til cuando se desea guardar en un archivo bloques de informacin. Permite
escribir los bloques de una sola vez sin necesidad de escribir cada uno de sus
componentes.
Problema de portabilidad
Permiten el acceso directo a los datos en el archivo. En estos casos se
utilizan las funciones fwrite() y fread():
Ambas funciones hacen un acceso directo a la memoria del ordenador a
partir de la direccin donde inicia la estructura de tipo FILE.
Universidad Surcolombiana
24de48
Escritura:
Fwrite
Empecemos con fwrite, que nos permite escribir en un archivo. Esta funcin
tiene el siguiente formato:
size_t fwrite(void *estructura, size_t tamano, size_t numero, FILE *parchivo);
Universidad Surcolombiana
25de48
Lectura:
Fread
La funcin fread se utiliza para sacar informacin de un archivo. Su formato
es:
size_t fread(void *buffer, size_t tamano, size_t numero, FILE *parchivo);
Siendo buffer la variable donde se van a escribir los datos ledos del archivo
parchivo.
El valor que devuelve la funcin indica el nmero de elementos de tamao
'tamano' que ha conseguido leer. Se puede pedir a fread que lea 10
elementos (numero=10), pero si en el archivo slo hay 6 elementos fread
devolver el nmero 6.
Siguiendo con el ejemplo anterior ahora se leen los datos que se haban
guardado en "c:\\yamil.txt".
Universidad Surcolombiana
26de48
Universidad Surcolombiana
27de48
Universidad Surcolombiana
28de48
Universidad Surcolombiana
29de48
Hay veces en que se necesita acceder una y otra vez al fichero para leer sus
datos, modificar parte de ellos, por el medio. Imagine, por ejemplo, que se
tiene guardado en un archivo una agenda de telfonos, con los amigos. A
veces se quiere consultar uno que est en medio del archivo, o cambiar su
nmero de telfono, o borrarlo como amigo porque ya n o est o no se desea
tener.
C ofrece esta posibilidad. La funcin fseek() permite desplazarse
rpidamente, sin necesidad de ir leyendo registro a registro, hasta una
posicin concreta de un fichero. Esto es lo que se conoce como acceso
aleatorio a un fichero.
La funcin fseek permite situar en la posicin que se desee de un archivo
abierto. Cuando se lee un archivo hay un 'puntero o cursor' que indica en
qu lugar del archivo se encuentra. Cada vez que se lea datos del archivo,
Universidad Surcolombiana
30de48
del
archivo
se
desplaz
Los parmetros de entrada son: un puntero a una estructura FILE del archivo
en el que se quiere cambiar el cursor de lectura/escritura, el valor del
desplazamiento y el punto de origen desde el que se calcular el
desplazamiento.
archivo: Puntero al buffer del archivo con el que se esta trabajando.
posicin: Desplazamiento en bytes a partir de lo que indique origen.
Son las posiciones (o bytes) que se quiere desplazar el puntero.
Este desplazamiento puede ser de tres tipos dependiendo del valor
de modo:
origen: Especifica donde comienza la bsqueda. El parmetro origen
puede tener tres posibles valores:
SEEK_CUR: El desplazamiento se cuenta desde la posicin
actual del cursor.
SEEK_END: El desplazamiento se cuenta desde el final del
fichero.
SEEK_SET: el desplazamiento se cuenta desde el principio del
fichero. El primer byte del fichero tiene un desplazamiento
cero.
Estas tres constantes estn definidas en el fichero <stdio.h>. Como
curiosidad se indican a continuacin sus definiciones:
#define SEEK_SET
#define SEEK_CUR
#define SEEK_END
0
1
2
Universidad Surcolombiana
31de48
fseek(fp,1,SEEK_SET);
fseek(fp,10*sizeof(producto[0]),SEEK_SET);
fseek(fp,2*sizeof(producto[0]),SEEK_CUR);
Funcin ftell
Esta funcin es complementaria a fseek, devuelve la posicin actual del
cursor dentro del archivo.
Su formato es el siguiente:
long int ftell(FILE *parchivo);
El valor que devuelve ftell puede ser usado por fseek para volver a la
posicin actual y estos valores corresponden a la posicin donde se
encuentre o -1 en caso de algn error.
El parmetro de entrada FILE *parchivo es un puntero a una estructura
FILE del fichero del que queremos leer la posicin del cursor de
lectura/escritura.
Ejemplo 19: Uso de las funciones fseek() y ftell()
Universidad Surcolombiana
32de48
Universidad Surcolombiana
33de48
Universidad Surcolombiana
34de48
}
printf("\n:::::ARCHIVO LEIDO:::::\n");
void modificar(void)
{ FILE *punt; T_Ficha registro;
int cont=0;
T_Cadena30 cadena;
fflush(stdin);
printf("\n Introduzca nombre a buscar:\n");
gets(cadena);
printf("\n Leyendo File y Buscando Name solicitado .....\n");
punt=fopen("c:\yamil.txt","rb+");
if (punt==NULL)
{ printf("\nERROR"); exit(1);
}
do
{ fread(®istro,sizeof(T_Ficha),1,punt);
cont++; }
while ((strcmp(registro.nombre,cadena)!=0)&&(cont<5));
if (strcmp(registro.nombre,cadena)==0)
{ printf("\n...INDIVIDUO ENCONTRADO.....\n");
printf("\n...DATOS ACTUALES:\n");
printf("NOMBRE: %s\n",registro.nombre);
printf("EDAD: %d\n",registro.edad);
printf("\n:::::INTRODUZCA NUEVOS DATOS::::::\n");
fflush(stdin);
printf("Introduzca el nombre de la persona:\n");
gets(registro.nombre);
printf("Introduzca la edad de la persona:\n");
scanf("%d",®istro.edad);
printf("\n MODIFICANDO LOS DATOS EN EL ARCHIVO...\n");
fseek(punt,(cont-1)*sizeof(T_Ficha),SEEK_SET);
fwrite(®istro,sizeof(T_Ficha),1,punt);
printf("\n..DATOS MODIFICADOS EN EL ARCHIVO....\n");
}
else
printf("\n:El nombre solicitado no se encuentra en el file:\n");
if (fclose(punt) != 0)
{ printf("\n:::::ARCHIVO GUARDADO:::::\n"); exit(1); }
}
Universidad Surcolombiana
35de48
Universidad Surcolombiana
36de48
Universidad Surcolombiana
37de48
Universidad Surcolombiana
38de48
Universidad Surcolombiana
Clase
ofstream
ifstream
ios::out | ios::trunc
ios::in
39de48
fstream
ios::in | ios::out
Universidad Surcolombiana
40de48
Archivo salida
alumno
Hola
Hola1
Hola2
Ahora vea que se puede tambin realizar la insercin del contenido una
variable entera, cuyo contenido se convierte de forma automtica en una
cadena de caracteres. Adems se puede observar otra forma de insertar el
caracter de fin de lnea agregando \n
Universidad Surcolombiana
41de48
int num = 1;
ArchivoSal << num << Hola\n;
Num++;
ArchivoSal << num << Hola\n;
1Hola
2 Hola
HolaMundo
Hola Mundo
21
32
33
Hola4
4Mundo
Archivo entrada
variables
En este primer ejemplo vemos como extrae una simple cadena de caracteres
de un archivo de texto tipo ifstream llamado ArchivoEnt.
string Texto;
ArchivoEnt >> Texto;
alumno
Texto = alumno
Universidad Surcolombiana
42de48
alumno1 alumno2
Texto1 = alumno1
Texto2 = alumno2
alumno1
alumno2
Texto1 = alumno1
Texto2 = alumno2
alumno 1
Texto = alumno
num = 1
Universidad Surcolombiana
43de48
Archivo entrada
Archivo salida
alumno
alumno
char buff[10];
ifstream ArchiEnt("entrada.txt");
ofstream ArchiSal("salida.txt");
ArchiEnt.get(buff, 10);
ArchiSal << buff << endl;
ArchiEnt.get(buff, 10);
ArchiSal << buff << endl;
Alumno gu
Alumno gu
Alumno qu
e no pien
Ahora vemos que pasa cuando se tiene una lnea vaca. Aclaramos que en la
salida del segundo ejemplo, hay dos lneas vacas.
char buff[10];
ifstream ArchiEnt("entrada.txt");
ofstream ArchiSal("salida.txt");
Universidad Surcolombiana
Alumno
no aprueba
Alumno
44de48
no aprueb
char buff[10];
ifstream ArchiEnt("entrada.txt");
ofstream ArchiSal("salida.txt");
for (int i=1; i<=3; i++)
{ ArchiEnt.get(buff, 10);
ArchiSal << buff << endl;}
Alumno
no aprueba
Alumno
Hay que destacar que el mtodo getline, escribe directamente en una porcin
de memoria del string, que contiene la cadena c_string sin modificar ninguna
de las propiedades de la clase string. Es por ello, que al querer escribir en un
archivo se debe especificar que se desea escribir el contenido c_str() del
string, dado que si quiero escribir directamente el string, como no se
modificaron sus propiedades, la longitud de la cadena es cero, y por lo tanto
virtualmente la cadena esta vaca.
Una forma de forzar a que se actualicen las propiedades del string, es
realizar una asignacin de su propio contenido:
string Texto;
Universidad Surcolombiana
45de48
ifstream ArchiEnt("entrada.txt");
ofstream ArchiSal("salida.txt");
ArchiEnt.getline(Texto.begin(),
Texto.max_size()/2);
Texto = Texto.c_str();
ArchiSal << Texto << endl;
Mtodos especiales
eof()
Es uno de los mtodos ms importantes. Devuelve true si se lleg al final de
archivo. Encontr el carcter EOF (End Of File).
is_open()
Este mtodo devuelve true si se abri correctamente el archivo.
good()
Este mtodo devuelve true si no ocurri ningn error.
bad()
Universidad Surcolombiana
46de48
Ejemplo 23
Implementar una funcin que lea un archivo de texto llamado Lineas.txt,
que contiene un nmero indeterminado de renglones, que contiene frases, y
devuelva la cantidad lneas que contienen la palabra casa.
Para resolverlo debemos realizar un ciclo que lea lnea por lnea cada uno de
los renglones, busque la palabra casa y los cuente, y por ltimo informe el
resultado.
float CantidadCasas()
{ int cont = 0;
string s;
AnsiString Linea;
ifstream Archivo(Lineas.txt);
while (getline(Archivo, s))
{ Linea = s.c_str();
if (Linea.Pos(casa) cont++;
Universidad Surcolombiana
47de48
}
return cont;
EJEMPLO 18:
#include <vcl.h>
#pragma hdrstop
#include <condefs.h>
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#pragma argsused
int main(int argc, char* argv[])
{ char b[80];
ifstream infile("yamil.cpp");
//infile.open("yamil.cpp");
if (!infile) return 0;
while (!infile.eof())
{ infile.getline(b,sizeof(b));
cout <<b<<endl;
}
infile.close();
cout <<"presione una tecla" <<endl;
getch();
return 0;
}
Universidad Surcolombiana
48de48