Scrivere su SD in determinata posizione

Buongiorno,
sto continuando a fare prove con la SD card e con la manipolazione del file su SD card.
Quello che vorrei fare è poter scrivere, al verificarsi di un evento, su un file .txt una stringa in una determinata posizione.
Mi spiego meglio:
il file txt contiene il seguente contenuto:

Ingressi: 0_0_0_0_0_0;
Uscite: 0_0_0_0_0_0;
Analogica: 0_0_0;
Gradi: 00_00;
Puntatore: 0;

Io vorrei che ogni volta che un ingresso cambia di stato, "arduino" vada ad aprire il file txt, leggere la riga "Ingressi" e stampare dopo lo spazio il nuovo stato dell'ingresso. La stringa 0_0_0_0_0_0 rappresentano 6 ingressi, quindi se cambia di stato l'ingresso 3, la stringa da andare a scrivere sarà 0_0_1_0_0_0, non creare una nuova riga ma andando a sostituire quella già esistente, cioè vorrei questo :

Ingressi: 0_0_1_0_0_0;
Uscite: 0_0_0_0_0_0;
Analogica: 0_0_0;
Gradi: 00_00;
Puntatore: 0;

e non questo:

Ingressi: 0_0_0_0_0_0;
Uscite: 0_0_0_0_0_0;
Analogica: 0_0_0;
Gradi: 00_00;
Puntatore: 0;
Ingressi: 0_0_1_0_0_0;

Ho provato a buttare giù del codice giusto per prova

#include <SPI.h>
#include <SD.h>
File myFile;

char c;
boolean startRead = false;


void setup() {
  Serial.begin(9600);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }

  myFile = SD.open("file.txt");
  if (myFile) {
    while (myFile.available()) {
      do {
        c = myFile.read();
        if (c == 'I') {
          startRead = true;
        }
        if (startRead == true && c == ' ') {
          myFile = SD.open("file.txt",  FILE_WRITE);
          myFile.println("stampaIngressi");
          startRead = false;
        }
      } while (c != -1);
    }
  }
  myFile.close();
}


void loop() {

}

ma la stringa "stampaIngressi" mi viene stampata a fine file e non dopo Ingressi: .

Qualcuno ha qualche suggerimento?

adamo:
Qualcuno ha qualche suggerimento?

SI, bisogna che ti studi bene i metodi che ti mette a disposizione la classe SD ...
... e vedrai che c'è TUTTO quello che stai cercando, incluso il posizionamento all'interno del file (seek()) :slight_smile:

Guglielmo

ok, grazie della info.

C'è anche la possibilità di stampare la stringa da un punto ad un altro punto specifico? Seek() mi dà il punto di inizio come faccio a trovare il punto di fine?
Ho modificato il codice in

include <SPI.h>
#include <SD.h>
File myFile;

char c;
boolean startRead = false;
int a = 0;

void setup() {
  Serial.begin(9600);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }

  myFile = SD.open("file.txt");
  if (myFile) {
    while (myFile.available()) {
      do {
        c = myFile.read();
        if (c == 'I') {
          startRead = true;
          a = 1;
        }
        if (startRead == true && c != ' ') {
          a = a + 1;
          }
          else{
          myFile = SD.open("file.txt",  FILE_WRITE);
          myFile.seek(a);
          myFile.println("01234567890");
          startRead = false;
        }
      } while (c != -1);
    }
  }
  myFile.close();
}


void loop() {

}

quello che mi viene stampato è Ingressi: 01234567890

A me servirebbe che il ";" della stringa iniziale resti. Quindi vorrei stampare da x a x+10. Attualmente la stringa che devo sostituire è lunga 10 e la nuova stringa è lunga 10, cioè uguali.

A ok devo eliminare "ln" del myFile.println("01234567890").

Mi era scappato.