Serve una coppia (indice, chiave), così se si cerca una chiave si fa una ricerca binaria su tutte le coppie, quando si trova la coppia giusta si guarda nel file (simbolicamente rappresentato dall' array record) l' indice che corrisponde alla chiave cercata.
Il problema era che prima di ordinare l' array dovevi tenere traccia di quelli che erano gli indici originali delle chiavi.
Ho rivisionato il tuo codice e la struttura l' ho chiamata index (mi accorgo ora che il nome non è molto significativo perché in realtà è una coppia), facendo la bsearch su tutte le coppie e andando a guardare il risultato nell' array record avente come indice il campo "indice" della coppia trovata.
codice:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int valore_chiave;
int indice;
}index;
int compare_index (const void* a, const void* b)
{
return ((index*)a)->valore_chiave - ((index*)b)->valore_chiave;
}
int main (int argc, char **argv)
{ /*Dichiarazioni*/
struct _record
{
int id;
char nome[30];
} record [] =
{
{1, "pippo"}
,{5, "topolino"}
,{2, "pluto"}
,{0, "minnie"}
}; /*array di record di esempio da trovare*/
size_t elem_size = sizeof(struct _record); /* dimensione di un record */
size_t elem_count = sizeof(record) / elem_size; /* quanti record nell'array */
index* indice;
int i; /* contatore */
index find; /* elemento da trovare */
index *trovato; /* elemento trovato */
/* Implementazione */
indice = (index*)malloc(sizeof(index)*elem_count); /*1) Allocazione memoria */
if(indice==NULL) return 1;
for(i=0;i<elem_count;++i) /*2) riempimento indice */
{
indice[i].valore_chiave = record[i].id;
indice[i].indice=i;
}
qsort(indice, elem_count, sizeof(index), compare_index); /*3) Ordinamento indice*/
find.valore_chiave=5;
trovato = bsearch(&find, indice, elem_count, sizeof(index), compare_index);
if(trovato != NULL) /*5) stampa risultato */
printf("Record trovato:nID: %d nNome: %s", record[trovato->indice].id,record[trovato->indice].nome);
else
printf("Non trovato");
free(indice); /*6) liberazione memoria allocata */
}