Leer fichero y guardar datos en struct en C

#include <stdio.h>
#include <stdlib.h>
#define MAX_CHAR 10000

struct Talumno{ 
 char nombre[50]; 
 char apellido1[100]; 
 char apellido2[100]; 
 float notas[2]; 
 float media;
};

struct Talumno *leerdatos(char *nombrearchivo, int numlineas);
int numlineasarchivo(FILE *p);
int mediamasalta(struct Talumno *info, int tam);

int main(int argc, char* argv[]){
 
 struct Talumno *clase;
 int numalumnos,mejornota;
 FILE *parchivo;

 
 
 if (argc!=2)
  printf("Error, el número de argumentos no es correcto\n");
 else {
  parchivo=fopen(argv[1],"r");
  if (parchivo==NULL) {
   printf("Error al abrir el archivo");
  }
  else {
   //obtenemos el número de líneas del fichero
   numalumnos =numlineasarchivo(parchivo);
   fclose(parchivo);
   
   clase=leerdatos(argv[1],numalumnos);
   
   mejornota=mediamasalta(clase,numalumnos);   
   printf("El alumno con mejor nota se llama %s %s %s y ha sacado un %f\n",(clase+mejornota)->nombre,(clase+mejornota)->apellido1, (clase+mejornota)->apellido2,(clase+mejornota)->media);
   free(clase);      
  }

 }

 return 0;
}

int numlineasarchivo(FILE *p)
{
 int nlineas;
 char linea[MAX_CHAR];

 //obtenemos el número de líneas del fichero
 nlineas = 0;
 while (!feof(p)) {
  fgets(linea,MAX_CHAR,p);
  nlineas++;
 }
 return nlineas;
}


struct Talumno *leerdatos(char *nombrearchivo, int numlineas)
{
 FILE *parchivo;
 struct Talumno *info;
 int i;
 
 parchivo=fopen(nombrearchivo,"r");
 if (parchivo==NULL) {
  printf("Error al abrir el archivo");
 }
 else {
 
  //reservamos espacio para la matriz
  info=(struct Talumno*)malloc(sizeof(struct Talumno)*numlineas);
 
  //leemos los datos
  for (i=0; i<numlineas; i++) {
   fscanf (parchivo, "%s %s %s %f %f",(info+i)->nombre,(info+i)->apellido1, (info+i)->apellido2,&(info+i)->notas[0],&(info+i)->notas[1]);
   (info+i)->media=((info+i)->notas[0]+(info+i)->notas[1])/2;
  }
 }
 fclose(parchivo);
 return info;
}
int mediamasalta(struct Talumno *info, int tam)
{
 int res,i;
 res=0;
 for (i=0; i<tam; i++) {
  if ((info+i)->media > (info+res)->media) {
   res=i;
  }
 }
 return res;
}