abrir sd y asignar variable a cada dato

Seria interesante que pusieras una muestra de lo que contiene el fichero de texto.

En C trabajando con ficheros puedes sacar letras, números enteros o con decimales con una única lectura. En Arduino has de ir carácter a carácter para todo.

Lo principal es saber que quieres leer, si por ejemplo el fichero gps.txt contiene información sobre unas coordenadas, imagino que cada linea sera una lectura realizada, y que la siguiente linea sera otra, y la siguiente otra, etc.
Entonces, si es el caso ya que como no lo sé lo estoy dando por supuesto, sabemos que cada linea contiene el mismo tipo de datos que el resto y es independiente al resto de lineas, pongamos por ejemplo que la linea es: (sin comillas)

"315 152 1 253"

Cada número separado con un espacio o con cualquier otro carácter ASCII no numérico.

Tienes que hacer una funcion, que lea carácter a carácter, si tuvieras...

" 315 152 1 253"

varios espacios al principio o entre medio de los números tendrás que hacer que la funcion que lee caracteres se salte los que no sirven, y en que encuentre un numero que lo guarde y los vaya concatenando, no como cadena si no ya como entero, en una variable.

De este modo podrías hacer que cada vez que se llamara a la funcion esta te sacara un número... pero claro, tendrás que hacer algo para que la funcion sepa donde se quedo para saber en que posicion ha de comenzar después...

Te dejo un trozo de código de la funcion:

/*
 *  FUNCIÓN QUE, A PARTIR DE UNA CADENA, DEVUELVE EL PRIMER NUMERO ENTERO POSITIVO QUE ENCUENTRE.
 *
 *  Para ello se ha de recibir como parámetros un vector de caracteres y la posición en la que empezar
 *  a buscar el numero, esa posición, que es por referencia, será modificada por la posición en la que
 *  se dejo de leer una vez obtenido el numero.
 *
 */
unsigned short getFirstIntTheString( char *str, byte *i )
{
   unsigned short num = 0;

   // Se avanza hasta encontrar el primer número:
   while( (str[*i] < '0' || str[*i] > '9')  &&  str[*i] != '\0' )
      (*i)++;


   // Se concatenan todos los números seguidos que se encuentren:
   while( str[*i] >= '0' && str[*i] <= '9'  &&  str[*i] != '\0' )
   {
      num *= 10;
      num += (str[*i] - 48);
      (*i)++;
   }
   delay(5);

  // Se devuelve el numero obtenido.
   return num;
}

Eso solo te devuelve el primer numero que encuentre en el vector de caracteres a partir de la posicion de inicio que le indiques.
Antes has de haber metido todos los caracteres de una sola linea en un vector.

Cuando tengas esa linea llamas a la funcion tantas veces como números tengas, y te devolverá los números, que tendrás que guardar cada uno en una variable y hacer con ellos lo que quieras.. para después repetir toda la operación con la siguiente linea.

Saludos!