Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tecnologías Industriales
Fundamentos de Informática
Tema 10
Archivos de Datos -
Ficheros
• Introducción
Archivos
Un archivo es un conjunto de información que se almacena en un ordenador y puede ser
identificado por su ruta completa, cuyo fin ultimo es guardar o proporcionar información.
Utilizaremos archivos secuenciales.
La memoria RAM se borra en cuanto se corta la corriente.
Carpetas Archivos
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 4
Archivos
• Hasta ahora los programas han tomado y devuelto datos de:
• teclado - pantalla.
• Una operación de lectura de un fichero es parecida a una operación
de lectura de datos desde el teclado
• Una operación de escritura de un fichero es parecida a una
operación de escritura en pantalla.
• Utilizaremos archivos secuenciales.
• Operaciones con archivos:
– Apertura de archivos: fopen()
– Cierre de archivos: fclose()
– Lectura de archivos: fscanf () (texto), fread() (binarios)
– Escritura en archivos: fprintf () (texto), fprintf() (binarios)
Canal físico
Programa Canal lógico
Buffer
#include <stdio.h>
...
int main(void){
FILE *pfich;
...
pfich=fopen(“c:\\temp\\pepe.txt”,“r+”);/*Apertura*/
if(fclose(pfich)!=0){
printf(“Error al cerrar el archivo\n”);
printf(“Posible pérdida de datos”);
} de Informática
Fundamentos Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 13
Operaciones básicas con un archivo
#include <stdio.h>
int main(void)
Declaración de un
{ puntero a archivo
FILE *pfich;
Apertura en modo escritura
pfich = fopen(“datos.txt”,”w”); (w) del archivo “datos.txt”
Comprobación de que la
if (pfich == NULL) {
apertura ha sido correcta
printf(“\n Error al abrir el fichero”);
}
else {
... /* Se utiliza el archivo para escritura */
/* Al acabar de usar el archivo */
if (fclose(pfich) != 0) {
Cierre del archivo y comprobación de
printf(”\n Error al cerrar el archivo “); si se ha realizado correctamente
}
}
}
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 14
Sección 3
• Tipos de archivos
Tipos de archivos
• Tipos de archivo:
– Texto.
• Archivos ASCII planos, obtenidos y manejados desde programa utilizando cadenas
de caracteres.
• Se pueden ver con un editor de texto.
– Binario.
• Archivos con los datos guardados como copia exacta de la memoria del ordenador
(binario).
• Sólo comprensible desde un programa que “sepa” qué tipos de datos contiene el
archivo y de qué forma están guardados.
• Si se visualizan con un editor de texto no son comprensibles.
• Los archivos binarios y los programa que utilizan archivos binarios no son fácilmente
portables a otros ordenadores y otros compiladores (el tamaño de las variables puede
variar).
• Los archivos de texto son legibles y fáciles de portar, pero ocupan más espacio para
almacenar la información.
• 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: variable entera de valor 2563 (texto: 4 bytes; binario: 2 bytes).
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 16
Tipos de archivos
• Creación de un archivo:
• Un archivo secuencial debe ser creado antes de ser procesado.
• Formas de crear un archivo:
• Directamente: Mediante el uso de un editor de texto (sólo para
archivos de texto).
• Indirectamente: Mediante un programa que reciba información,
la procese y la guarde en un archivo (tanto para archivos de
texto o como binarios).
• La lectura y escritura de archivos varía según el tipo de archivos:
• Texto: fprintf, fscanf, fgets, fputs
• Binarios: fwrite, fread,
• Archivos de texto
Archivos de texto
• Son los archivos que contienen caracteres ASCII.
• Apertura y cierre de fichero.
• Según lo visto en las transparencias anteriores.
• Los archivos guardan caracteres ASCII:
• Es posible utilizar las funciones de biblioteca utilizadas para
escribir o leer cadenas vistas a lo largo del curso.
• La diferencia está en que ahora cuando se utilicen estas
funciones hay que incluir el puntero al buffer del fichero
• fputs(cadena,puntero)
• fgets(cadena,numero de caracteres,puntero)
• fprintf(puntero,cadena de control,variables)
• fscanf(puntero, cadena de control,variables)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{int n; /*Valor devuelto por fscanf*/
FILE *fichero; /*Puntero al archivo*/
double dato; /*Dato leído del fichero*/
double sum_tot; /*Suma de los datos*/ • El archivo pepe.txt contiene
después de escribir:
/*Abrimos el fichero para introducir datos*/ 1.3
fichero=fopen("c:\\temp\\pepe.txt", "w"); 3.4
if(fichero==NULL){ 4.5
printf("Error de apertura"); 123.4
} • El resultado sería:
else El valor de la suma es:
132.600000
{
fprintf(fichero,"1.3\n3.4\n4.5\n123.4");
1 2
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 23
Archivos de texto
1 2
/*Cerramos el fichero*/
if(fclose(fichero)!=0){
printf("Error al cerrar le fichero\n");
}
}
/*Abrimos el fichero para leer datos, aunque podría haberse evitado abrir y
cerrar si la apertura se hace con “w+” y aquí se usa un rewind(fichero);*/
fichero=fopen("c:\\temp\\pepe.txt", "r");
if(fichero==NULL)
printf("Error de apertura");
else
{
sum_tot=0.0;
n=fscanf(fichero,"%lf",&dato);
while((n == 1)) {
sum_tot=sum_tot+dato;
n=fscanf(fichero,"%lf",&dato);
}
1 3
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 24
Archivos de texto
1 3
/*Imprimimos la suma*/
/*Cerramos el fichero*/
if(fclose(fichero)!=0)
{
printf("Error al cerrar el fichero\n");
}
}
}
• Archivos binarios
Archivos binarios
• Los archivos binarios se utilizan para almacenar la información como una
copia exacta de la memoria del ordenador.
• Normalmente, no se pueden ver con un editor de texto, pues sería una
casualidad que los bytes que contienen fuesen caracteres legibles.
• Útil cuando se desea guardar en un archivo bloques de información
• Permite escribir los bloques de una sola vez sin necesidad de escribir cada
uno de sus componentes.
• Problema de portabilidad
• Es necesario al abrir el fichero poner en el modo ‘b’ de binario.
• Permiten el acceso directo a los datos en el archivo
• Ejemplos:
fseek(fp,0,SEEK_SET); /* Va a la primera posición del archivo */
fseek(fp,10*sizeof(T_PRODUCTO),SEEK_SET); /* Va al 11º producto */
fseek(fp,2*sizeof(T_PRODUCTO),SEEK_CUR); /* Se salta dos productos desde la
poisción actual */
char nombre[40];
char calle [30];
char ciudad[30]; La siguiente función busca la
char provincia[20]; estructura num_cliente
int cod_postal;
}T_INFO;
especificada de tipo T_INFO
if((fp=fopen("correo.dat", "rb"))==NULL) {
printf("No se puede abrir el fichero.\n");
}
else {
// Buscar la estructura escogida
fseek(fp, num_cliente*sizeof(T_INFO), SEEK_SET);
fclose(fp);
}
}
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 54
Archivos binarios: ejemplo fseek()
#include <stdio.h> void introducir_datos(T_Lista lista) 1/4
{
#include <stdlib.h>
int cont;
#include <string.h> printf("Introduzca los nombres y edades de 5
personas: \n");
for (cont=0;cont<5;cont++) {
typedef struct{ fflush(stdin);
char nombre[30]; printf("Introduzca el nombre de la persona:\n");
int edad; gets(lista[cont].nombre);
printf("Introduzca la edad de la persona:\n");
}T_Ficha; scanf("%d",&lista[cont].edad);
typedef T_Ficha T_Lista[10]; }
}
void introducir_datos(T_Lista lista);
void pinta_datos(T_Lista lista); void pinta_datos(T_Lista lista)
{
void guardar_fichero(T_Lista lista);
int cont;
void cargar_fichero(T_Lista lista); printf("\n:::::Los datos del fichero leido son:\n");
void modificar(void); for (cont=0;cont<5;cont++) {
printf("NOMBRE: ");
puts(lista[cont].nombre);
int main(void) printf("EDAD: ");
{ printf("%d\n",lista[cont].edad);
}
T_Lista lista,lista2;
}
Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 55
Archivos binarios: ejemplo fseek()
void guardar_fichero(T_Lista lista) 2/4
{ void cargar_fichero(T_Lista lista)
FILE *punt; {
int cont; FILE *punt;
int cont=0;
printf("\nGUARDANDO FICHERO....\n"); printf("\nLEYENDO FICHERO.................\n");
punt=fopen("a:datos.dat","wb"); punt=fopen("a:datos.dat","rb");
if (punt==NULL) {
printf("\nERROR"); if (punt==NULL) {
exit(1); printf("\n Error al abrir el fichero");
} exit(1);
}
for(cont=0;cont<5;cont++) { while ( fread(&lista[cont],sizeof(T_Ficha),1,punt)) == 1) {
cont++;
fwrite(&lista[cont],sizeof(T_Ficha),1,punt);
}
}
if (fclose(punt) != 0) {
/* Otra opción en vez del bucle anterior
printf(“Error cerrando el fichero “);
fwrite(lista,sizeof(T_Ficha),5,punt); */
exit(1);
}
if (fclose(punt) != 0) {
printf("\n:::::FICHERO LEIDO:::::\n");
printf(“Error al cerrar el archivo”);
}
exit(1);
}
printf("\n:::::FICHERO GUARDADO:::::\n");
} Fundamentos de Informática Tema 10: Archivos de Datos - Ficheros
ICAI – 1º Grado en Ingeniería en Tecnologías Industriales 56
Archivos binarios: ejemplo fseek()
3/4
void modificar(void)
{
FILE *punt;
T_Ficha registro;
int cont=0;
T_Cadena30 cadena;
fflush(stdin);
printf("\nIntroduzca nombre a buscar:\n");
gets(cadena);
printf("\nLEYENDO FICHERO Y BUSCANDO NOMBRE SOLICITADO..............\n");
punt=fopen("a:datos.dat","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));
• Valor devuelto:
• Un valor distinto de 0: cuando se intenta leer un registro del fichero y nos
encontramos con un EOF (fin del fichero)
• 0: en cualquier otro caso
www.comillas.edu