necesito un programa de archivos indexados
Publicado por LIZ (1 intervención) el 25/07/2001 04:58:12
enviar un ejemplo
Valora esta pregunta


0
#include <stdio.h>
#include <stdlib.h>
struct Registro {
int clave;
char nombre[50];
// Otros campos del registro
};
struct Indice {
int clave;
long posicion;
};
void insertarRegistro(FILE* archivoDatos, FILE* archivoIndice, struct Registro registro) {
// Escribir el registro en el archivo de datos
fseek(archivoDatos, 0, SEEK_END);
fwrite(®istro, sizeof(struct Registro), 1, archivoDatos);
// Crear el índice para el registro
struct Indice indice;
indice.clave = registro.clave;
indice.posicion = ftell(archivoDatos) - sizeof(struct Registro);
// Escribir el índice en el archivo de índice
fseek(archivoIndice, 0, SEEK_END);
fwrite(&indice, sizeof(struct Indice), 1, archivoIndice);
}
void buscarRegistro(FILE* archivoDatos, FILE* archivoIndice, int clave) {
// Leer el índice correspondiente a la clave
struct Indice indice;
while (fread(&indice, sizeof(struct Indice), 1, archivoIndice) == 1) {
if (indice.clave == clave) {
// Moverse a la posición del registro en el archivo de datos
fseek(archivoDatos, indice.posicion, SEEK_SET);
// Leer y mostrar el registro
struct Registro registro;
fread(®istro, sizeof(struct Registro), 1, archivoDatos);
printf("Registro encontrado:\n");
printf("Clave: %d\n", registro.clave);
printf("Nombre: %s\n", registro.nombre);
// Mostrar otros campos del registro si es necesario
return;
}
}
printf("Registro no encontrado.\n");
}
int main() {
FILE* archivoDatos = fopen("datos.dat", "rb+");
FILE* archivoIndice = fopen("indice.dat", "rb+");
if (archivoDatos == NULL || archivoIndice == NULL) {
printf("Error al abrir los archivos.\n");
return 1;
}
// Ejemplo de inserción de un registro
struct Registro nuevoRegistro;
nuevoRegistro.clave = 1;
strcpy(nuevoRegistro.nombre, "Ejemplo");
insertarRegistro(archivoDatos, archivoIndice, nuevoRegistro);
// Ejemplo de búsqueda de un registro
buscarRegistro(archivoDatos, archivoIndice, 1);
fclose(archivoDatos);
fclose(archivoIndice);
return 0;
}