Creare un file String con altri String

Salve a tutti e grazie della possibilità che si da agli appassionati di Arduino nello scambiare idee, consigli e soluzioni varie di problematiche.
Detto questo vengo subito al punto.
Ho un problema in quanto ancora alle prime armi di Arduino…
Ho la necessità di scrivere/leggere tramite la libreria tinyfat.h su una SD delle stringhe in cui ci sono dei valori di 48 numeri ma che devo formare tramite altre stringhe di un’unica unità.
Cerco di essere più chiaro, il mio risultato che devo scrivere su un file pippo.txt deve essere formato ad esempio come 123332222111111133333322222333333333111111111122 (sono48numeri)
Ma questo numero verrà formato da 1 2 3 3 3 2 2 2 2… E così via.
E questo vale per la scrittura, per la lettura invece farò al contrario.

C’è qualche cervellone che mi può aiutare?
Non vorrei appesantire troppo il programma dato che poi il mio Arduino Mega mi si interfaccia con un touch screen e non vorrei vedere le cose rallentate.

Grazie mille in anticipo per l’aiuto.

Benvenuto. :) Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link generici utili: http://forum.arduino.cc/index.php?topic=126861.0

Porta pazienza, ma io sinceramente non ho capito. Hai una serie di numeri singoli (in un file?) e li devi mettere tutti insieme appiccicati per formare una unica stringa (senza spazi) da mettere poi in un file pippo.txt ?

Grazie mille per il benvenuto e per la replica... in pratica io ho un file pippo.txt dove voglio leggere o scrivere numeri uno attaccato all'altro, ogni numero per me indica un'azione da fare quindi, quando lo vado a leggere lo devo scomporre in 48 variabili, quando lo vado a scrivere devo prendere le 48 variabili e formare un numero formato da 48 cifre e scriverlo nel file pippo.txt

Esempio da una stringa da 48 cifre a 48 stringhe a singola unità : - apro il file pippo.txt - leggo il file pippo.txt - estraggo il numero di 48 cifre (esempio: 112311222333332232111221333322211111333322222222) - scrivo i 48 numeri in 48 variabili (esempio: pippo[0]=1; pippo[1]=1; pippo[2]=2; pippo[3]=3; pippo[4]=1; pippo[5]=1; ecc. ecc.) - chiudo il file pippo.txt

Esempio da 48 stringhe a singola unità ad una stringa da 48 cifre: - cancello il file pippo.txt (almeno così sono sicuro di avere un file nuovo con i nuovi dati) - creo in nuovo file pippo.txt - apro il file pippo.txt - creo la nuova stringa prendendo i singoli dati (mi ritrovo 112311222333332232111221333322211111333322222222 come prima) - scrivo la nuova stringa su pippo.txt - chiudo il file pippo.txt

Sperando di essere stato un po' più chiaro aspetto vostre notizie. Grazie mille, grazie, grazie, grazie.

Hai letto la documentazione di TinyFat ? Hai visto quali comandi (pochi) mette a disposizione? Il lettura hai - readLn(buf,size) che cerca comunque righe di testo terminate da CR+LF - readBinary() che legge un intero settore da 512 byte e i dati sono in file.buffer[] A te serve quest'ultimo perchè i tuoi numeri non sono su righe diverse.

Il problema maggiore è scrivere in quanto sembra ci sia solo writeLn(buf) che aggiunge SEMPRE CR+LF alla fine Perciò non puoi mettere tutti i caratteri uniti. Cioè puoi mettere nel file uniti i numeri dentro a buf, se buf 100 caratteri 100 caratteri uniti ma alla fine di questi ci sarà CR+LF (andata a capo). Se scriverai ancore nel file (senza cancellarlo) sarà una seconda riga a capo.

Infatti la openFile() ha 3 modalità di apertura, ma binary solo in lettura (mentre in text mode c'e' read e c'e' write)

Se non è un problema avere il CR+LF alla fine dei 48 numeri puoi farlo senza problemi. Leggerei una riga di testo in un buf[49] elementi char 0-48. Ogni singolo numero lo vedi con buf[indice] indice 0-47 (elemento 48=fine stringa '\0')

Quando lo scrivi nel file usi una sola brutale myFile.writeLn(buf);

Ogni elemento del vettore letto buf[indice] è un carattere, perciò '1' e non 1 ovvero numero 49

Grazie nid69ita della tua risposta,

diciamo che leggere e scrivere sualla SD l’ho abbastanza capito dato che sono riuscito anche a convertire variabili FLOAT in CHAR per poi scriverle e leggere dal file pippo.txt

Quello che mi resta un po’ più difficile è la parte della trasformazione delle 48 variabili in una unica stringa sola…
avere caratteri in fondo alla stringa dopo i 48 numeri non è un problema, l’importante è andare a ripescare i 48 numeri e scinderli singolarmente.

Se ci fosse la maniera di farmi un piccolo esempio a riguardo male non mi farebbe :slight_smile: :slight_smile: :slight_smile:

Mi scuso anticipatamente per il mio linguaggio scarno in questo campo ma sono veramente alle prime armi con questo linguaggio… però mi sta veramente appassionando Arduino e per questo non demordo…
Grazie ancora.

Qual che non ho capito, i numeri sono 1 carattere giusto ?
Perciò è molto semplice. Leggi dal file con

myFile.readLn(buf,48);

Dove buf è un vettore di char di dimensione adeguata (fai 50).
A questo punto

for(int i=0;i<48;i++)
{ Serial.print (buf[i]);    // singolo numero 
  if(buf[i]=='3') {  // se comando '3' allora faccio....
}

In buf hai tutti i numeri ma ad un vettore puoi accedere a ogni singolo elemento. Ricorda solo che l’elemento è un numero inteso come carattere, ‘1’ non è il valore 1 ma è 49 ovvero in tabella ascii vedrai ‘0’=>48 ‘1’=>49 etc.

  • scrivo i 48 numeri in 48 variabili (esempio: pippo[0]=1; pippo[1]=1; pippo[2]=2; pippo[3]=3; pippo[4]=1; pippo[5]=1; ecc. ecc.)

mi sembra che voglia anche memorizzarli in un array, non leggerli e usarli una sola volta.
Un array di string è pesante, andrebbero convertiti in byte
Posso sapere questi valori 1-2-3 cosa fanno nel tuo scketh, magari ti si può dare un’idea o una soluzione più semplice.

ciao

Dalla descrizione sono solo 48 cifre, perciò un vettore di 48 caratteri, non mi sembra grosso. Inoltre una stringa non è altro che un array/vettore di caratteri e se ogni cifra è solo da 1 a 9 come numero occuperesti comunque un byte. Se la descrizione che ha dato è esaustiva.