>
>struct reg {
>int matricula;
>char *nombre;
>char *apellido;
>}
>dato ;
>
>printf( PFILE, dato->nombre , "/ t" );
>printf( PFILE, dato->apellido , "/ t" );
>
Esto te va a ocasionar un comportamiento indefinido, en el mejor de los casos una excepción y en el peor de los casos, que le salga humo a tu computadora. Como lo estás haciendo creo que está bien.
Si tu archivo no contiene muchos registros, puedes cargarlos en un array, hacer el sort en dicho array (quicksort, bubblesort, etc: como lo sepas hacer) y guardas cada elemento en el archivo.
Si tiene muchos registros, una opción es tener la posición que ocuparía el campo dentro del bloque de memoria que ocupa tu objeto serializado (en este caso, struct reg). Por ejemplo, en tu ejemplo creo que matricula sería tu llave. Entonces el primer registro se encuentra desde el byte 0 hasta el byte sizeof(int). El segundo registro se encuentra en el byte sizeof(struct reg) + 1 hasta el byte sizeof(struct reg) + 1 + sizeof(int). Etcétera.
Así, entonces sólo tienes que cargar en tu archivo las llaves (matrículas), las ordenas y después copias los datos del archivo original a otro archivo, pero ahora en el orden enq ue estén las matrículas. Ahora, se supone que ya sabes, i.e., que la matrícula 2 está en el primer bloque de memoria, mientras que la 1 está en el segundo bloque. Así, cuando escribas la matrícula 1 la sacas del segundo bloque de memoria -- sizeof(struct reg) + 1 hasta sizeof(struct reg)*2 -- y la escribes en la primera posición (solo haciendo un append, dado que tu archivo es nuevo). Y así te sigues.
Saludos.