Creo que te complicas mucho la vida, yo usaria archivos con registros de tamaño fijo.
En este ejemplo puedes ver como crear un archivo secuencial y lo relleno y luego busco en el tanto por nombre como por numero de registro. Es mucho mas sencillo de manejar.
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM_MAX_PALABRA 50
int main(int argc, char* argv[])
{
struct{
char palabra[TAM_MAX_PALABRA];
int index;
}registro;
char nombre[TAM_MAX_PALABRA];
int cantidad, x, indice, encontrada, nread, salir=0;
char caracter;
FILE *archivo;
//ZONA DONDE CREO EL ARCHIVO SECUENCIAL Y LO RELLENO CON LOS REGISTROS
printf("\nIndique el numero de palabras a usar: ");
scanf("%d",&cantidad);
archivo = fopen("prueba.txt","w"); //Abro el fichero para escritura
if(archivo != NULL){ //Si el archivo se ha abierto correctamente...
for(x = 0; x < cantidad; x++){
printf("\n\nIntroduce el nombre del registro %d: ", x);
fflush(stdin); //Limpiamos el buffer de entrada
fgets(registro.palabra,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
printf("\nIntroduce el numero del registro %d: ", x);
scanf("%d",®istro.index);
fwrite(®istro,sizeof(registro),1,archivo); //Guardo el registro
}
fclose(archivo); //Cierro el archivo
}
//ZONA DONDE BUSCO EL REGISTRO DESEADO
archivo= fopen("prueba.txt","r");
if (archivo== NULL){
printf("\nEl archivo no se encuentra.\n");
}else{
do{
//Mostramos el menú y esperamos hasta que se elija una opcion correcta
system("CLS"); //Limpiamos la pantalla
printf("\n\nELIGE EL TIPO DE BUSQUEDA\n");
printf("-------------------------\n\n");
printf("\t1.Por indice\n");
printf("\t2.Por nombre\n");
printf("\t3.Salir\n\n");
printf("\tOpcion: ");
scanf("%d",&x);
switch(x)
{
case 1:
printf("\nElige el indice a buscar: ");
scanf("%d",&indice);
break;
case 2:
printf("\nElige el nombre a buscar: ");
fflush(stdin); //Limpiamos el buffer de entrada
fgets(nombre,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
break;
case 3:
salir = 1;
break;
default:
printf("\n\tValor introducido incorrecto.");
printf("\n\tPulse Intro para continuar.");
fflush(stdin); //Limpiamos el buffer de entrada
getchar(); //Esperamos a que se pulse intro
}
}while(x < 1 || x > 3); //Si elegimos una opcion correcta saldremos del bucle
if(salir == 0){
encontrada = 0;
while (!feof(archivo)){
nread = fread(®istro,sizeof(registro),1,archivo);
if(nread == 0) //Si no lee mas registros es porque llegamos al final
break;
switch(x)
{
case 1:
if(indice == registro.index){
printf("\nPalabra encontrada: %s", registro.palabra);
encontrada = 1;
}
break;
case 2:
if(strcmp(nombre, registro.palabra) == 0){
printf("\nPalabra encontrada. Registro: %d", registro.index);
encontrada = 1;
}
break;
}
}
if(encontrada == 0)
printf("\nPalabra no encontrada.");
fclose(archivo); //Cerramos el archivo
printf("\n\n");
system("PAUSE");
}
}
return 0;
}
//---------------------------------------------------------------------------