Bueno, no se si me equivoco en algo pero...
¿esto que es?
no tiene sentido, es un bucle que no hace nada y que te dejará el programa colgado si el fichero está vacio.
Según veo yo el codigo, solo comprobaras el primer registro, ya que no tienes realmente creado un bucle.
Cuando encuentres un caracter de separacion '|' o '\n' compararas el nombre leido.
do
{
read(fd,&x.nombre[i],1);
if(x.nombre[i] !='|'&&x.nombre[i]!='\n'&&!eof (fd))
i++;
else
break;
}
while (x.nombre[i-1]!='|'&&x.nombre[i-1]!='\n'&&!eof (fd));
}
if(strcmp(x.nombre,x.buscar)==0)
si acertaste te mostrara el nombre, sino te dira q no lo encontro.
Creo q lo que buscas es algo mas parecido a esto
Do{
[bucle q compara caracter a caracter buscando '|' o '\n']
[comparacion de nombres]
{si aciertas
[imprimes el nombre y escribes en el registro]
}While (se llegue al final del archivo)
Espero que lo entiendas. Mira bien como están construidos los bucles en tu codigo que no están bien.
Si te queda alguna duda, ya sabes...
un saludo