El concepto de "posiciones" se debe al hecho de que la clase File trata los archivos de texto como si fuera de una sola línea.
Cómo sabe cuando termina una línea? Cuando se encuentra con el conjunto de caracteres \r y \n. No son cuatro sino dos; como los editores de texto lo interpretan como un cambio de línea (no como una simple 'r' seguido por una 'n'); en código se representan de esa manera.
El trozo de texto que acabas de postear, así lo ve la clase File:
"Total laps:\r\n000\r\n\r\nTotal time:\r\n00:00:00:000\r\n\r\nBest lap:\r\n00:00:000\r\n\r\nAverage:\r\n00:00:000\r\n\r\nLap 1:\r\n00:00:000\r\n\r\nLap 2:\r\n00:00:000\r\n"
Se muy desordenado, pero así es como el programa lo maneja. Recuerda que cada conjunto "\r\n" marca el inicio de una nueva línea.
Verdad que ahora sí es más fácil entender ese concepto de "posición"? Cada caracter que ves en esa larga línea (excepto los '' y comillas dobles) tiene una posición. Esta se da como "índice cero" (parte desde cero).
En la posición 0 tenemos una 'T', y así sucesivamente.
Ahora sabiendo lo anterior; podré decir con certeza que las posiciones que necesitamos para sobrescribir los datos requeridos, son las siguientes:
#define TOT_LAP_POS 13
#define TOT_TIME_POS 33
#define BEST_LAP_POS 60
#define AVERAGE_POS 83
Se declaran como variables globales (fuera de cualquier función).
Se utilizan de la siguiente manera:
Necesitas cambiar las vueltas totales?
archivo.seek(TOT_LAP_POS);
archivo.print(lasVueltas);
// Debes respetar que se impriman tres digitos; de lo contrario,
// podría ocurrir un "corrimiento de porciones", lo cual puede acabar en un texto desastroso.
Necesitas cambiar el tiempo de la mejor vuelta?
archivo.seek(BEST_LAP_POS);
archivo.print(tiempo);
// Recuerda respetar el formato hh:mm:ss:msmsms ("msmsms" = tres dígitos para los milisegundos);
// de lo contrario, "corrimiento de porciones" y texto desastroso.
Necesitas volver a seguir registrando vueltas?
archivo.seek(archivo.size() - 1);
// El "puntero" del archivo busca el final de este; de lo contrario, sobrescribe cuando no debería;
// y de nuevo, texto desastroso.
orenes:
Sería así para poder leerlo desde una lcd 16x2, creo que es posible pasarlo al lcd, ¿no?
Pero por supuesto que sí. Solo lo que me deja en duda es: qué se debe leer del archivo? Sólo los números o cada par de líneas?
Si la respuesta es la primera, creo que bastará con las constantes que te había definido antes. Si la respuesta es la segunda, habrá que definir más constantes.
Para enviar datos a una LCD, preferiblemente leo la línea y la guardo en un "búfer"; luego ese "búfer" se imprime al LCD. Ejemplo:
// Lee el tiempo de la mejor vuelta, y lo imprime en una LCD
archivo.seek(BEST_LAP_POS);
char buffer[17]; // El LCD es de 16 caracteres de largo; por lo tanto, 16 + un espacio para el terminador.
buffer[archivo.readBytesUntil('\r', buffer, sizeof(buffer) - 1)] = 0;
// Aquí ocurre la lectura y su almacenamiento temporal. Lee hasta el fin de la línea, o a los 16 caracteres.
// Asumiendo que ya ajustaste el cursor en x,0
lcd.print(buffer);
orenes:
Es posible también que si estoy leyendo en la parte de arriba del todo si le doy a subir, muestre la última vuelta y viceversa, ¿no?.
Mmmm no entendí la pregunta, pero espero habértela respondido de todas formas.