You are on page 1of 15

Programación Estructurada Utilización

¿Qué es una Estructura?

Estructuras en Lenguaje C • A diferencia de los arreglos, donde los elementos son


todos del mismo tipo, una estructura puede
considerarse como un arreglo , cuyos elementos
individuales pueden ser de distinto tipo.

Andrés G. Puente P. • Estos elementos individuales se llaman


miembros/componentes de la estructura
Ingeniero Civil Informático • En C, son el mecanismo y la forma más versátil de
Universidad del BioBio trabajar con fichas de información.
apuente@ucsc.cl

Programación Estructurada Programación Estructurada

Declaración Declaración

Sintaxis: struct nombre_estructura{ • Una vez que la composición a sido definida, las
tipo1 miembro1; variables de este tipo de estructuras pueden
tipo2 miembro2; declararse como sigue:
...................
tipoN miembroN; Sintaxis: struct nombre_estructura var1, var2, ..., varN;
};
• Es posible combinar la declaración de la estructura
con la declaración de las variables.
• La palabra struct define la estructura
• nombre_estructura es el nombre que identifica
estructuras de este tipo, (misma composición) • En este caso, el nombre de la estructura es
• miembro1, ..., miembroN, son declaraciones de opcional).
miembros individuales. Los miembros pueden ser
variables ordinarias, punteros, arreglos u otras
estructuras.
Programación Estructurada Programación Estructurada

Declaración Ejemplo

• Sintaxis (2 posibilidades) struct cuenta { • Definición de estructura.


struct nombre_estructura{ int numero_cuenta; 1. Esta estructura se llama
tipo1 miembro1; char tipo_cuenta; cuenta y contiene cuatro
char nombre[30]; miembros;
tipo2 miembro2;
................... float saldo;
tipoN miembroN; };
struct cuenta cliente1, cliente2; 2. Declaración de 2
} var1, var2,..., varN;
variables de tipo cuenta.
• ó 3. Combinación de la
struct cuenta {
struct { declaración de la
int numero_cuenta;
tipo1 miembro1; estructura con la de las
char tipo_cuenta;
tipo2 miembro2; variables.
char nombre[30];
................ float saldo;
tipoN miembroN; } cliente1, cliente2;
} var1, var2,..., varN;
Programación Estructurada Programación Estructurada

1
Estructuras Anidadas Ejemplo
• Anidamiento de
• Una estructura puede ser miembro de otra, (el ANSI struct fecha { estructuras.
establece que se puede anidar hasta 15 estructuras, int mes; 1. Declaración de una
pero la mayoría de los compiladores admiten más ). int dia; estructura fecha.
int anio;
• En tal situación, la declaración de la estructura };
interna debe aparecer antes que la declaración de la 2. Declaración una
estructura externa. struct cuenta { estructura con el
nombre cuenta donde
int numero_cuenta;
el último miembro es
• También se pueden definir arreglos de estructuras. char tipo_cuenta; una estructura
char nombre[30]; previamente
struct fecha ultimo_pago; declarada.
} clientes[100]; 3. Declaración de un arreglo
de 100 estructuras de
tipo cuenta.
Programación Estructurada Programación Estructurada

Inicialización de una Estructura Ejemplo

• Una estructura puede inicializarse en el momento de Inicialización de una estructura


su declaración. struct fecha {
char nombre[80];
• La estructura debe tener un almacenamiento estático int mes;
para poderse inicializar en el momento de su int dia;
declaración. Esto significa que debe ser una int anio;
estructura global o (static). };

1. Inicialización de los campos de la estructura nacimiento.


static struct fecha nacimiento = {"Ana" , 5, 24, 90};

Programación Estructurada Programación Estructurada

Ejemplo Referencia a los miembros de una estructura

2. Inicialización de un arreglo • Los miembros individuales de una estructura se referencian


static struct fecha nacimientos[]={"Ana" , 5, 24, 66, utilizando el operador punto (.) y se pueden procesar de la
"Jose", 12, 30, 73, misma manera que las variables ordinarias.
"Raúl", 7, 15, 72,
}; 1. Cliente es una variable de tipo cuenta y clientes[100] es un
arreglos de 100 estructuras.
struct cuenta cliente,
3. Separar la inicialización de cada estructura por un par de
llaves. clientes[100];
static struct fecha nacimientos[]={ { "Ana" , 5, 24, 66,}
{ "Jose", 12, 30, 73,} 2. Acceso a los campos individuales de la estructura cliente.
{ "Raúl", 7, 15, 72,}}; cliente.nombre = "Jose";
cliente.saldo = 1000;

Programación Estructurada Programación Estructurada

2
Referencia a los miembros de una estructura Operación de Asignación

• En algunas versiones antiguas de C, las estructuras debían ser


3. Acceso al campo ultimo_pago de cliente. (La referencia se
procesadas campo a campo y la única operación permisible
hace desde la estructura más externa a la más interna).
con la estructura completa era tomar su dirección.
cliente.ultimo_pago.mes;

• Sin embargo las nuevas versiones de C, incluso el nuevo


Acceder al numero de cuenta del cliente 25. ANSI, permiten asignar una estructura completa a otra del
clientes[24].no_cuenta ; mismo composición.
clientes[24].saldo ;
struct cuenta cliente1, cliente2;
......
cliente2 = cliente1;
Operación de asignación.
1. Declaración de dos variables
2. cliente1 ha sido inicializada.
3. Se copian todos los campos.
Programación Estructurada Programación Estructurada

Tipos definidos por el usuario Tipos definidos por el usuario

• La instrucción typedef permite a los usuarios definir nuevos • La instrucción typedef es particularmente útil cuando se
tipos de datos que san equivalentes a los tipos existentes, es definen estructuras ya que elimina la necesidad de escribir
decir darle nuevos nombre a los tipos existentes. repetidamente la palabra calve struct.
• Sintaxis: typedef tipo nuevo_tipo;
• donde tipo es el tipo existente y nuevo_tipo es el nuevo Sintaxis: typedef struct {
nombre. tipo1 miembro1;
• La definición de un nuevo tipo de dato no reemplaza al tipo2 miembro2;
anterior, sino añade un nuevo nombre y con lo cual, ambos ...................
nombres se pueden usar para declarar variables.
tipoN miembroN;
typedef int edad;
} nuevo_tipo;
edad bebe, joven, adulto;

• donde nuevo_tipo es el tipo de la estructura definida por el


typedef float altura[100]; usuario. Las variables pueden definirse en términos del nuevo
altura hombre, mujeres; tipo de datos.

Programación Estructurada Programación Estructurada

Tipos definidos por el usuario Paso de estructuras a funciones


1. Declaración de un tipo estructura llamado fecha. • Se pueden transferir los campos individuales o las estructuras
typedef struct { completas.
int mes; • Cuando se pasan campos individuales de una estructura a una
int dia; función, el manejo es idéntico a las variables ordinarias.
int anio;
• El paso de los valores se puede hacer por valor o por
}fecha ; referencia.
2. Declaración de un tipo estructura llamado Registro ( Notar que contiene
1. prototipo de funciones.
el nuevo tipo fecha).
void fun1(float );
typedef struct {
int numero_cuenta; void fun2(float *);
char tipo_cuenta; 2. Declaración de una variable cliente.
char nombre[30]; registro cliente;
float saldo; 3. Llamada por valor.
fecha ultimo_pago; fun1(clinte.saldo);
}registro; 4. Llamada por referencia.
3. Declaración de un arreglo. fun2(&cliente.saldo);
registro clientes[100];
Programación Estructurada Programación Estructurada

3
Paso de estructuras a funciones Paso de estructuras a funciones

• Se permite una transferencia por valor e incluso una función 3. Declaración de una variable cliente1 y cliente2.
puede devolver mediante la instrucción return una registro cliente1, cliente2 = {"Jose", 1200, 120.000};
estructura; (Notar el contraste de con los arreglos, que no ....
pueden ser pasados por valor ni se devuelven mediante la
instrucción return). 4. Llamada por referencia.
1. la definición de registro debe ser visible. fun1(&cliente2);
typedef struct {
char nombre[20]; 5. Llamada por valor.
int no_cuenta; fun2(cliente2);
float saldo;
} registro; 6. La función devuelve una estructura
cliente1 = fun3();
2. Prototipo de funciones.
void fun1(registro *pt);
void fun2(registro cliente);
registro fun3(void);
Programación Estructurada Programación Estructurada

Programación Estructurada Utilización

¿Por qué punteros?

Punteros en Lenguaje C • En lenguaje C toda variable ocupa un lugar en la


memoria del computador.

• Los punteros existen para acceder a dichas variables


de manera más eficiente.
Andrés G. Puente P.
• Facilitan el paso de gran cantidad de información a
Ingeniero Civil Informático una función.
Universidad del BioBio
• La aritmética de punteros es muy eficiente y muchas
apuente@ucsc.cl veces posee soporte de hardware.

Programación Estructurada Programación Estructurada

Definición Definición

Definición de un puntero • En el puntero se guarda el valor de una dirección de


memoria. Ejemplo:

• Un puntero se define de manera análoga a una


char* c;
variable, pero se antepone un asterisco al nombre.
c = 1000;

Ejemplos:
Int *a; c

Char *c;
Float *f; h o l a

999 1000 1001 1002 1003

Programación Estructurada Programación Estructurada

4
Operadores Ejemplo

Operadores asociados a punteros Ejemplo 1

• Operador * Int *a;


Se utiliza para obtener el valor apuntado por una int b,c;
variable de tipo puntero.
b = 4; /* se pasa el valor 4 a la variable ‘b’ */
• Operador & a = &b; /* la variable ‘a’ guarda la dirección de ‘b’ */
Se utiliza para obtener la dirección en memoria c = *a; /* el valor apuntado por ‘a’ es 4 */
donde podemos encontrar una variable.

Ahora es equivalente escribir ‘b’ o ‘*a’

Programación Estructurada Programación Estructurada

Ejemplo Punteros y Arreglos

Ejemplo 2 Punteros y arreglos

char *c; • En C, los punteros y los arreglos son equivalentes.


char d, e;
e = ‘z’; • Los arreglos pueden ser considerados como punteros de
c = &e; valor constante
d = *c; int a[100];

De manera análoga al ejemplo anterior, el a /* es equivalente a la posición de memoria del


valor almacenado en ‘d’ es ‘z’ elemento A[0], es decir, &a[0] */

Programación Estructurada Programación Estructurada

Ejemplo Aritmética

Ejemplo 3 Aritmética de punteros


• Si un puntero es solo una dirección de memoria, ¿Por
int x[10]; qué existen de diverso tipo?
int *p;
int v; float* f; /* puntero de tipo flotante (real) */
x[0] = 0; x[1] = 1; x[2] = 2; … x[9] = 9; char* c; /* puntero de tipo caracter */
p = x; /* ‘p’ apunta al primer elemento de x */ f = f + 1; /* siguiente posición de memoria */
c = c + 1; /* siguiente posición de memoria */
entonces,
Debido a que el largo de un flotante en memoria es
d = *(p + 2); /* ‘d’ es igual a 2 */ distinto al largo de un caracter, el tipo es
importante.
*(p + 5) = 8; /* luego x[5] toma el valor de 8 */

Programación Estructurada Programación Estructurada

5
Funciones y Punteros Ejemplo

Funciones y punteros Ejemplo 4


int a[10], b;
• Los punteros se usan en conjunción con funciones, b = suma(a);
cuando: …
int suma(int* x) /* aquí se pasa el arreglo como puntero */
– Se requiere pasar un arreglo de datos a una {
función. int i, s;
s = 0;
– Se requiere que una función modifique el valor de for(i = 0; i < 10; i++)
un determinado parámetro. s += *(x + i);
return s;
– Se necesita manejar Listas Encadenadas (fuera de }
los alcances del curso).

Programación Estructurada Programación Estructurada

Ejemplo Utilización

Ejemplo 5 Utilización de punteros


swap(&x, &y); /* la función necesita las direcciones
de las variables a intercambiar */ • En este curso se utilizarán punteros para pasar
void swap(int* a, int* b) valores “tipo arreglo” a una función.
{
int tmp;
• Para el manejo de cadenas de caracteres.
tmp = *a;
*a = *b;
*b = tmp;
}

Programación Estructurada Programación Estructurada

Ejemplo OJO

Ejemplo 6 ¡Precauciones!
• Un puntero no se puede utilizar si no ha sido inicializado.
• Función que calcula el tamaño de un string Ejemplo:
int strlen(char* s)
int *p;
{
int b;
char* p = s;
*p = 66; /* error, se está guardando un valor, en una
while(*p)
posición de memoria desconocida */
p++; p = &b;
return (p – s); *p = 66; /* correcto, porque ‘p’ apunta a un lugar
} conocido y válido */

Programación Estructurada Programación Estructurada

6
Introducción

• Las estructuras de datos como arreglos, punteros, etc.


se encuentran almacenadas en memoria principal.

• Este tipo de almacenamiento, conocido por


almacenamiento principal o primario, tiene dos
ventajas:
– Su pequeño tiempo de acceso
– Este tiempo necesario para acceder a los datos
almacenados en una posición es el mismo que el
tiempo necesario para acceder a los datos
almacenados en otra posición del dispositivo.

Programación Estructurada Programación Estructurada

Introducción Introducción
• Estas limitaciones dificultan:

• Sin embargo, no siempre es posible almacenar los datos • La manipulación de gran número de datos, ya que—
en la memoria central o principal del computador, en ocasiones—pueden no caber en la memoria
debido a las limitaciones que su uso plantea: principal.
• La transmisión de salida de resultados de un
programa pueda ser tratada como entrada a otro
• La cantidad de datos que puede manipular un programa programa.
está limitada a la memoria del computador.

• Para poder superar estas dificultades se necesitan


• La existencia de los datos en memoria, está supeditada dispositivos de almacenamiento secundario que permite
al tiempo que el computador está encendido y el su recuperación posterior.
programa ejecutándose (tiempo de vida efímero).

• Las estructuras de datos aplicadas a colecciones de


datos en almacenamientos secundarios se llaman
organización de archivos.
Programación Estructurada Programación Estructurada

Introducción Definición

• La noción de archivo o fichero está relacionada con los ¿Qué es un archivo?


conceptos de:
• Almacenamiento permanente de datos. • Es una estructura de datos compuesto por registros y
• Fraccionamiento o partición de grandes volúmenes éstos a su vez por campos. Reside en una unidad de
de información en unidades más pequeñas que almacenamiento permanente (cinta magnética, disco
puedan ser almacenadas en memoria central y magnético, disco óptico, disco láser, etc.)
procesadas por un programa.
Código Nombre Precio
Registros bjc250 Canon B.J. 30.000
oki10 Okidata StylusC. 50.000

Campos

Programación Estructurada Programación Estructurada

7
Definición Definición

Campos
Componentes • Los caracteres se agrupan en campos de datos. Un
campo es un ítem o elemento de datos elementales,
tales como un nombre, rut, ciudad, teléfono, etc.
1. Registros: Corresponden a cada una de las filas
contenidas en el archivo. Normalmente se le asocia • Un campo está caracterizado por su tamaño o longitud
un identificador o clave. y su tipo de datos (cadena de caracteres, entero, lógico,
etc.).
2. Campos: Corresponden a las columnas contenidas
en los registros. A cada uno se le asocia su propio • Los campos pueden incluso variar en longitud. En la
tipo de dato básico o compuesto, así como también mayoría de los lenguajes de programación los campos
su tipo de validación y regla de integridad. de longitud variable no están soportados y se suponen
de longitud fija

Programación Estructurada Programación Estructurada

Definición Definición

Campos Registros
• Un campo es la unidad mínima de información de un • Un registro es una colección de información,
registro. normalmente relativa a una entidad particular.

• Los datos contenidos en un campo se dividen con • Un registro es una colección de campos lógicamente
frecuencia en subcampos; por ejemplo, el campo fecha relacionados, que pueden ser tratados como una unidad
se divide en los subcampos día, mes, año. por algún programa.

• Un ejemplo de un registro puede ser la información de


un determinado empleado que contiene los campos de
nombre, dirección, fecha de nacimiento, estudios,
salario, teléfono, etc.

Programación Estructurada Programación Estructurada

Definición Definición

Registros Archivos
• Los registros pueden ser todos de longitud fija; por • Un Archivo de datos - o simplemente un archivo - es
ejemplo, los registros de empleados pueden contener el una colección de registros relacionados entre sí con
mismo número de campos, cada uno de la misma aspectos en común y organizados para un propósito
longitud para nombre, dirección, fecha, etc. También específico.
pueden ser de longitud variable.
• Por ejemplo, un archivo de una asignatura, contiene un
• Los registros organizados en campos se denominan conjunto de registros de los estudiantes de esa
registros lógicos. asignatura. Otros ejemplos pueden ser el Archivo de
nóminas de una empresa, inventarios, stocks, etc.

Programación Estructurada Programación Estructurada

8
Definición Clasificación

Archivos
Clasificación General
• Un archivo en un computador es una estructura
diseñada para contener datos. • La forma de clasificación más básica se realiza de
acuerdo al formato en que residen estos archivos.
• Los datos están organizados de tal modo que puedan
ser recuperados fácilmente, actualizados o borrados y
almacenados de nuevo en el archivo con todos los • De esta forma hablamos de archivos ASCII (de texto) y
cambios realizados. archivos binarios.

Programación Estructurada Programación Estructurada

Clasificación Tipos de Acceso a los Archivos

Definición archivo binario Secuencial


• Se accesan uno a uno los registros desde el primero
Estructura de datos permanente compuesto por hasta el último o hasta aquel que cumpla con cierta
registros (filas) y éstos a su vez por campos condición de búsqueda. Se permite sobre archivos de
(columnas). Se caracteriza por tener un tipo de dato Organización secuencial y Secuencial Indexada.
asociado, el cual define su estructura interna.
Random
• Se accesan en primera instancia la tabla de índices de
Definición archivo texto manera de recuperar la dirección de inicio de bloque en
donde se encuentra el registro buscado. (dentro
Estructura de datos permanente no estructurado del rea primaria o de overflow). Se permite para
formado por una secuencia de caracteres ASCII. archivos con Organización Sec.Indexada.

Programación Estructurada Programación Estructurada

Tipos de Acceso a los Archivos Clasificación de los Archivos

Según su Uso
Dinámico
• Se accesan en primera instancia la tabla de índices de • La siguiente tabla resume las distintas denominaciones
manera de recuperar la dirección de inicio de bloque en dadas a los archivos según la utilización dada:
donde se encuentra el registro buscado. (dentro
del rea primaria o de overflow). Se permite para Tipo Definición Ejemplo
archivos con Organización Sec.Indexada.
Maestros Perduran durante todo el Archivo de empleados en un
ciclo de vida de los sistemas sistema de Remuneraciones
Directo
Transaccio Se utilizan para actualizar Archivo de ventas diarias en
• Es aquel que utiliza la función de Hashing para nales otros archivos. Pueden ser un sistema de ventas
recuperar los registros. Sólo se permite para archivos eliminados al término de
con Organización Relativa. este proceso o conservados
como respaldos
De Son copias de seguridad de
Respaldo otros archivos
Programación Estructurada Programación Estructurada

9
Clasificación de los Archivos Organización Básica de Archivos

Tipo Definición Ejemplo


Secuencial
De Paso Son creados y eliminados
entro de un proceso
computacional • Es la organización más común. Los registros se
Históricos Registran acontecimientos a Registros de movimientos almacenan uno tras otro por orden de llegada.
través del tiempo. diarios de CC en un Sistema
Bancario de CC
De Corresponden a los archivos Registro % imposiciones % • Para accesar un registro determinado se deben leer
Referencia de consultas de parámetros descuentos isapre, etc todos los registros que están almacenados antes que él.
Informes o Son respuestas del sistema Planillas de sueldos en un
reportes computacional cuyos sistema de Remuneraciones
contenidos deben ser • Se recomienda: para archivos de procesamiento batch
interpretados por personas. (aquellos para los cuales se debe realizar la misma
Pueden ser en forma escrita, operación sobre la mayor parte de sus registros)
por pantalla e incluso hacia
algún archivo con formato
editable

Programación Estructurada Programación Estructurada

Organización Básica de Archivos Organización Básica de Archivos

Secuencial Indexada Relativa

• Los registros son almacenados en una distribución tal • Existe una relación directa entre la ubicación lógica de
que permiten ser consultados a través de índices. En un registro y su ubicación física.
ellos se distinguen 3 áreas de almacenamiento: • Para ello se necesita una función matemática que
1.De índices: Mecanismo de acceso a los registros de datos. asigne a un valor de clave una dirección física única.
2.Primaria o de datos: En donde se encuentran los datos
propiamente tal.
3.De overflow: Encargada de recibir aquellos registros que no • El encontrar una Fh óptima es tarea compleja por lo
pueden ser almacenados en el área primaria. que esta organización es poco utilizada.

• Se recomienda : Para archivos de consulta. • Se recomienda: Para archivos en donde sea crucial
minimizar tiempos de acceso.

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Rut Nº Mat. Apellido Nombre ..... ..... Cod_car
Clasificación 111 12001 Bustamante Víctor 23
222 15003 Rojas Ana 12
• Consiste ordenar el archivo a partir de uno o más
criterios impuestos sobre sus campos. 333 12345 Pérez Claudio 14

• Es normal que los archivos estén ordenados por clave o


por algún campo alfabético ascendente o Proceso de clasificación (ordenar por cod_car)
descendentemente.

Rut Nº Mat. Apellido Nombre ..... ..... Cod_car

222 15003 Rojas Ana 12


333 12345 Pérez Claudio 14

111 12001 Bustamante Víctor 23

Programación Estructurada Programación Estructurada

10
Operaciones Básicas de Archivos Operaciones Básicas de Archivos

Concatenación Intercalación
• Consiste en generar un archivo
Clave Datos Clave Datos
• Consiste en unir 2 ó más archivos en 10 “
ordenado según algún criterio preestablecido 10 “
uno (uno a continuación del otro). 17 “ a partir de dos ó más archivos que pueden 13 “
23 “ o no encontrarse en la misma secuencia. 17 “
Clave Datos Clave Datos 35 “ Clave Datos Clave Datos 22 “
10 “ 13 “ 47 “ 10 “ 13 “ 23 “
17 “ 22 “ 55 17 “ 22 “ 30
23 “ 30 “ 62 23 “ 30 “ 35
35 “ 40 “ 13 35 “ 40 “ 40
Proceso Proceso
47 “ 92 “ 22 47 “ 92 “ 47
de de
55 “ 30 55 “ 55
Concatenaci Intercalaci
62 “ 40 62 “ 62
ón ón
92 92

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Rut Nº Mat. Apellido Nombre ..... ..... Cod_car
Pareamiento 111 12001 Bustamante Víctor 12
222 15003 Rojas Ana 12
• Consiste en ubicar registros correspondientes entre 2 ó
más archivos. 333 12345 Pérez Claudio 14
• Consiste en ubicar aquellos pares de registros
pertenecientes a dos archivos diferentes que cumplen
una cierta relación de correspondencia. Proceso de Edición

Edición Listado de Alumnos I. C. I.


Código:12 Fecha: 15 de Octubre de 2002
• Consiste en preparar los datos que constituyen a uno ó Rut Nº Mat. Apellido Nombre
más archivos para que sean interpretados por personas. 111 12001 Bustamante Víctor
• Se asocia generalmente a la generación de listados en
papel impreso. 222 15003 Rojas Ana

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos

Validación Actualización

• Consiste en asegurar la veracidad e integridad de los • Consiste en agregar y eliminar registros desde un
datos que ingresan a un archivo. Existen numerosas archivo, así como también modificar el valor de uno ó
técnicas de validación tales como: Dígito verificador, más campos. También se conoce como mantención de
chequeo de tipo, chequeo de rango. uno o más archivos.
Listado Archivo Listado
de de de
Errores transac. Errores
Maestro
de VALIDACIÓN VALIDACIÓN
Artículos
Maestro Maestro Maestro
de de de
Artículos’ Artículos Artículos’

Programación Estructurada Programación Estructurada

11
Operaciones Básicas de Archivos Operaciones Básicas de Archivos

Trabajando con archivos Definiendo las estructuras


typedef enum {False, True} boolean;
struct TNombre
Nombre: ARCHIVOS.CPP {
Utilidad: Este programa ejemplifica la actualizacion de un archivo tipificado de char Codigo[40], Nombre[40], Apellido[40];
longitud fija utilizando funciones de acceso directo (crear archivo, agregar, };
modificar, eliminar y listar registros) struct TFecha
#include <stdio.h> {
#include <conio.h> int dia,mes,anio;
#include <string.h> };
#include <stdlib.h> struct TEmpleado
#include <ctype.h> {
#include <dos.h> struct TNombre Identificacion;
#define archivo "empleados.dat" /* Nombre fisico del archivo */ char direccion[50];
struct TFecha FechaNac;
boolean Existe;
};

FILE *f; /* Puntero al archivo */

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos

Verificando existencia del archivo


Visualizar un registro completo, después de la lectura desde archivo
boolean FileExist(FILE **Empleados, char filename[30])
{
clrscr(); void Ver(struct TEmpleado R)
{
if ((*Empleados=fopen(filename,"rb"))==NULL) gotoxy(20,4); printf("Codigo : %s",R.Identificacion.Codigo);
{ gotoxy(20,5); printf("Nombre : %s",R.Identificacion.Nombre);
if ((*Empleados=fopen(filename,"wb"))==NULL) gotoxy(20,6); printf("Apellido : %s",R.Identificacion.Apellido);
return False; /* No se pudo crear */ gotoxy(20,7); printf("Direcci¢n : %s",R.direccion);
else /* Se crea uno nuevo */ gotoxy(20,8); printf("Fecha Nacimiento : %d / %d / %d ",R.FechaNac.dia,
{
R.FechaNac.mes, R.FechaNac.anio);
fclose(*Empleados);
return True; }
}
}
else /* Se abre uno existente */
{
fclose(*Empleados);
return True;
}
}

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Ubicando un registro
/* Devuelve posición de registro si es que existe, de lo contrario devuele (-1) */ Rellenar el registro, previo a la grabación
long Posicion(FILE *f, char N[40]) /* Ingresa desde el teclado un registro */
{ void Leer(struct TEmpleado *R)
struct TEmpleado Registro; { gotoxy(20,14); printf("C¢digo : ");
int Encontrado; gets((*R).Identificacion.Codigo);
long int num_reg=0;
gotoxy(20,15); printf("Nombre : ");
Encontrado=False; gets((*R).Identificacion.Nombre);
fseek(f, 0L, SEEK_SET); /* Se ubica en el primer registro */ gotoxy(20,16); printf("Apellido : ");
gets((*R).Identificacion.Apellido);
while(!feof(f) && !Encontrado) gotoxy(20,17); printf("Direcci¢n : ");
{ gets((*R).direccion);
fread(&Registro, sizeof(struct TEmpleado), 1, f); gotoxy(20,18); printf("Fecha Nacimiento (dia) : ");
Encontrado=!(strcmp(Registro.Identificacion.Codigo, N)); scanf("%d",&(*R).FechaNac.dia);
num_reg++;
gotoxy(20,19); printf("Fecha Nacimiento (mes) : ");
}
scanf("%d",&(*R).FechaNac.mes);
if (Encontrado) gotoxy(20,20); printf("Fecha Nacimiento (a¤o) : ");
return ((num_reg-1)*sizeof(struct TEmpleado)); scanf("%d",&(*R).FechaNac.anio);
else (*R).Existe=True;
return (-1); fflush(stdin);
} PulsarTecla();}
Programación Estructurada Programación Estructurada

12
Operaciones Básicas de Archivos Operaciones Básicas de Archivos
Listar Archivo
Calcular Tamaño en bytes del archivo /* Lista el contenido del archivo (lo que existe) */
long filesize(FILE *stream) void Listado(FILE **f)
{ struct TEmpleado R;
{ /* Abriendo para lectura */
long curpos,length; if ((*f=fopen(archivo,"rb"))==NULL)
{
printf("Archivo no existe!!!");
curpos=ftell(stream); PulsarTecla();
}
fseek(stream,0L,SEEK_END); else
length=ftell(stream); { fseek(*f, 0L, SEEK_SET); /* Se ubica al principio del archivo */
fseek(stream,curpos,SEEK_SET); while(!feof(*f))
{clrscr();
printf("Registro %ld de %ld", (ftell(*f)/sizeof (struct TEmpleado))+1,
return length; filesize(*f)/sizeof(struct TEmpleado));
if (fread(&R, sizeof(struct TEmpleado), 1, *f)!=1) break;
} if (R.Existe){Ver(R);PulsarTecla();
}
else{
gotoxy(25,10);
printf("******* Registro Eliminado *******");
PulsarTecla();
}
}
fclose(*f);
}
}
Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Agregar Registros Agregar Registros
void Agregar(FILE **f) }else
{struct TEmpleado R,E; {
long int I; fseek(*f, I, SEEK_SET);
/* Abriendo para Lectura-Escritura */ fread(&R, sizeof(struct TEmpleado), 1, *f);
if((*f=fopen(archivo,"r+b"))==NULL) if (R.Existe)
{printf("Error de apertura");PulsarTecla(); {
} gotoxy(20,21);
else printf("Registro ya existe");
{ do PulsarTecla();
{ gotoxy(10,12); printf("[Nuevo Registro Empleado]"); }
Leer(&E); else
Ver(E); {
I=Posicion(*f, E.Identificacion.Codigo); fseek(*f, 0L, SEEK_END); /* Graba al final */
if(I==-1) /* Verificacion de existencia */ fwrite(&E, sizeof(struct TEmpleado), 1, *f);
{I=filesize(*f)/sizeof(struct TEmpleado); gotoxy(20,11);
fseek(*f, 0L, SEEK_END); /* Se ubica al final del archivo */ printf("Grabando Registro...");
if(fwrite(&E, sizeof(struct TEmpleado), 1, *f)!=1) delay(4000);
{ }
printf("Error de escritura"); }
PulsarTecla(); clrscr();
break; gotoxy(25,23);
} printf("Presione - n - para salir de [Inserci¢n]");
gotoxy(20,11); } while(toupper(getch())!='N');
printf("Grabando Registro..."); fclose(*f);
delay(4000); }
}
Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Modificar Registros Modificar Registros
void Modificar(FILE **f) if(aux.Existe){ clrscr();
{ char codigo[40]; gotoxy(25,2);
struct TEmpleado aux; printf("[Modifica Registro %ld]", pos/sizeof(struct TEmpleado)+1);
long int pos; Ver(aux);
gotoxy(20,11);
if ((*f=fopen(archivo,"r+b"))==NULL) printf("¨Desea modificar estos datos(S/N)? ");
{ if(toupper(getch())=='S')
printf("Archivo no existe!!!"); {
PulsarTecla(); Leer(&aux);
} fseek(*f,pos,SEEK_SET);
else { fwrite(&aux, sizeof(struct TEmpleado), 1, *f);
do }
{ clrscr(); }
gotoxy(25,2); printf("[MODIFICA]"); else
gotoxy(25,4); printf("Introduzca c¢digo de empleado: "); {
gets(codigo); gotoxy(20,11);
fflush(stdin); printf("No existe (eliminado en sesi¢n anterior)");
pos=Posicion(*f, codigo); PulsarTecla();
if(pos==-1) }
{ gotoxy(20,11); }
printf("Registro no existe"); gotoxy(25,23);
}else printf("Presione - n - para salir de [Modificar]");
{ fseek(*f, pos, SEEK_SET); } while(toupper(getch())!='N');
if(fread(&aux, sizeof(struct TEmpleado), 1, *f)!=1) break; fclose(*f);
}
}

Programación Estructurada Programación Estructurada

13
Operaciones Básicas de Archivos Operaciones Básicas de Archivos
Eliminación Lógica (marcado de registro) if (E.Existe)
void EliminarLogico(FILE **f) {
{ struct TEmpleado E; gotoxy(20,3); clreol();
char N[40]; Ver(E);
int I; E.Existe=False; /* Eliminacion logica */
/* Abriendo para Lectura-Escritura */ fseek(*f, I, SEEK_SET);
if ((*f=fopen(archivo, "r+b"))==NULL) fwrite(&E, sizeof (struct TEmpleado), 1, *f);
{printf("Error de Apertura");PulsarTecla();} gotoxy(20,11);
else
printf("Eliminando Registro...");
{ fseek (*f, 0L, SEEK_SET);
delay(4000);
gotoxy(25,2);
do }
{ clrscr(); else
gotoxy(20,2); printf("[Eliminaci¢n]"); {
gotoxy(20,5); printf("C¢digo Empleado a Eliminar: "); gotoxy(20,11);
gets(N) ; printf("Registro no existe...");
fflush(stdin); }
I=Posicion(*f,N); }
if(I==-1) gotoxy(25,23);
{ printf("Presione - n - para salir de [Eliminaci¢n]");
gotoxy(20,11); } while (toupper(getche())!='N');
printf("Registro no existe..."); fclose(*f);
} }
else
}
{
fseek(*f, I, SEEK_SET);
fread(&E, sizeof(struct TEmpleado), 1, *f);

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


Eliminación física printf("Eliminando fisicamente los registro del archivo %s ...", archivo);
void EliminarFisico(FILE *f) delay(4000);
{ rewind(f);
FILE *temp; rewind(temp);
struct TEmpleado aux; while(!feof(f))
int cuenta=0; {
fread(&aux, sizeof(struct TEmpleado), 1, f);
if((f=fopen(archivo,"rb"))==NULL) if(aux.Existe)
{ fwrite(&aux, sizeof(struct TEmpleado), 1, temp);
printf("Error al abrir el archivo %s", archivo); else cuenta++; /* Cuenta los registros que no existen */
PulsarTecla(); }
} fclose(f);
else fclose(temp);
{ if(cuenta!=0)
if (filesize(f)!=0) {remove(archivo);
{ rename("temp.dat", archivo);
if((temp=fopen("temp.dat","wb"))==NULL) }else remove("temp.dat");
{ } }
printf("Error de creaci¢n del archivo temporal"); else /* Si el archivo se encuentra vacio */
PulsarTecla(); { fclose(f);
} printf("El archivo %s se encuentra vacio", archivo);
else PulsarTecla();
{ }
}
}

Programación Estructurada Programación Estructurada

Operaciones Básicas de Archivos Operaciones Básicas de Archivos


void Consultar(FILE *f) {
{ struct TEmpleado E;
long int I; gotoxy(20,11);
char N[40]; printf("No existe (eliminado en sesi¢n anterior)");
/* Abriendo para lectura */ }
if ((f=fopen(archivo, "rb"))== NULL) }
{printf("Archivo no existe!!!");PulsarTecla();} gotoxy(25,23);
else printf("Presione - n - para salir de [consultas]");
{ fseek (f, 0L, SEEK_SET); } while(toupper(getche())!='N');
do fclose(f);
{ clrscr(); }
gotoxy(25,2); printf("[Consulta]"); }
gotoxy(25,4); printf("Introduzca codigo de empleado: ");
gets(N);
fflush(stdin);
I=Posicion(f,N);
if (I==-1)
{gotoxy(20,11);printf("Registro no existe");
}
else
{fseek (f,I,SEEK_SET); /* Ubica puntero en el registro I */
if(fread (&E, sizeof (struct TEmpleado), 1, f)!=1) break;
if(E.Existe)
{clrscr();
gotoxy(25,2);
printf("[Consulta Registro %ld]", I/sizeof(struct TEmpleado)+1);
Ver(E);
}else
Programación Estructurada Programación Estructurada

14
Operaciones Básicas de Archivos

Programa Principal
/* Bloque principal */
int main(void)
{
clrscr();
if (!FileExist(&f,archivo))
{
printf ("Error de apertura o creacion de archivo");
exit(1);
}
else
Menu(); //Menú de operaciones básicas

return(0);
}

Programación Estructurada

15

You might also like