String to char

Ciao a tutti. Sono di nuovo alle prese con sti maledetti puntatori.

Devo aprire dei file e l'struzione è questa:

load.open(&root, filenameload, O_READ); filenameload non accetta una stringa tipo String filenameload ="dati.js"; ma vuole essere dichiarata come char filenameload[] = "dati.js";

ora vorrei sostituire il nome del file che arriva da una stringa quindi devo convertire la stringa in char

ho googlato parecchio, ma ho trovato solo esempi che si avvicinano e sono arrivato fin qui

String Fname = "dati.js"; char thisChar[Fname.length()+1]; //non so se +1 ci va o meno in molti tutorial lo metteno per il fatto che il primo char è 0 Fname.toCharArray(thisChar, Fname.length()) ;

non riesco a prendere il tutto e metterlo in filenameload

e poi come devo dichiarare all'inizio dello sketch la variabile filenameload? char filenameload; va bene?

grazie ciao

non so se +1 ci va o meno in molti tutorial lo metteno per il fatto che il primo char è 0

no, la dimensione dell'array parte da 1.. il +1 si mette perchè bisogna tenere conto, oltre che della lunghezza della stringa, anche del carattere '\0' che indica la fine stringa. Ma credo che Fname.length() ne tenga già conto.

il codice diventa:

String Fname = "dati.js"; //crei(istanzi) e inizializzi l'oggetto Fname di tipo String
char thisChar[Fname.length()]; //crei un'array di char della giusta lunghezza
Fname.toCharArray(thisChar, Fname.length()) ; //copi il contenuto dell'oggetto String nell'array di char. E' una COPIA, quindi se modifichi thisChar, Fname rimane immutato
load.open(&root, thisChar, O_READ); //usi l'array di char :)

char filenameload; va bene?

no pèerchè è un carattere. E dato che probabilmente non conosci la dimensione della stringa a priori, meglio istanziarlo solo nel momento in cui ti serve, e per il resto continuare a lavorare sull'oggetto String

Sei un angelo... aspettavo proprio te che ti collegassi :) al forum Non mi arriva il file bho non ho errori

In pratica ti spiego cosa voglio fare: Desidero leggere i file della sd da remoto su una textarea della index.html e rispedirli ad arduino modificati, non ho un server quindi mi devo arrangiare con un miniserver statico dentro la sd, funziona se nello sketch c'e' un nome fisso, vorrei però scriverlo da web e arduino dovrebbe trovarselo in una stringa e sostituirlo qui >> load.open(&root, "dati.js", O_READ);

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
SdFile load;

..........................
apro il client ecc ecc
............................
.............................
        //apro il file prendo le righe una alla volta concatenando i caratteri e le spedisco al client
{
           String Fname = "dati.js";
           char thisChar[Fname.length()];
           Fname.toCharArray(thisChar, Fname.length()) ;
           
           char c = 0; 
           String inString = String();  
  
            load.open(&root, thisChar, O_READ);
         //load.open(&root, "dati.js", O_READ); // se metto direttamente il nome funzia il file arriva perfettamente
            while(c != -1) 
           {
              c = load.read();
                   if (c == '\n')
                   {
                     //Serial.print(inString); //debug
                      client.print(inString);                     
                      inString = ""; 
                   }  
                 inString += c;              
             }
  
    
           load.close();  
           cons_msg_load=0;
       }
       delay(1);
      client.flush();
      client.stop();
}

non ti voglio stressare più di tanto magari vedere sul serial monitor cosa succede .... con le stringhe non ho problemi ma con gli array come lo faccio

grazie ciao

ok ho messo sul serial la lettura dei caratteri uno alla volta ho messo fino a 8 per vedere se sciveva qualcosa oltre il 6 ma sembra che si fermi prima .. manca la "s"

Serial.println("------------char 0 " + String (thisChar[0])); //debug Serial.println("------------char 1 " + String (thisChar[1])); //debug Serial.println("------------char 2 " + String (thisChar[2])); //debug Serial.println("------------char 3 " + String (thisChar[3])); //debug Serial.println("------------char 4 " + String (thisChar[4])); //debug Serial.println("------------char 5 " + String (thisChar[5])); //debug Serial.println("------------char 6 " + String (thisChar[6])); //debug Serial.println("------------char 7 " + String (thisChar[7])); //debug Serial.println("------------char 8 " + String (thisChar[8])); //debug

l'out è questo a 9600

------------char 0 d ------------char 1 a ------------char 2 t ------------char 3 i ------------char 4 . ------------char 5 j ------------char 6 (un quadratino) ------------char 7 (una o con 2 puntini sopra ) ------------char 8 (un quadratino)

come puoi notare i cher fino al 5 sono giusti, il 6 CREDO che sia lo \0, ma non ne sono certo, dovresti provare con un IF.

 while(c != -1) 
           {
              c = load.read();
                   if (c == '\n')
                   {
                     //Serial.print(inString); //debug
                      client.print(inString);                     
                      inString = ""; 
                   }  
                 inString += c;              
             }

qu’ tu leggi la stringa fino allo \n (a capo) e poi invi…

prova invece a fare così, ovvero leggere tutto il file e poi inviare

inString = ""; 
while(c != -1) 
{
   c = load.read();                
   inString += c;              
}
client.print(inString);
Serial.println("------------char 0 " + String (thisChar[0])); //debug

è inutile, puoi fare:

Serial.println(thisChar); //debug

se ottieni solo dati.js allora ok, se ottieni anche caratteri strani allora manca lo \0 a fine stringa!

comunque se il file che vuoi aprire è sempre quello (thisChar è sempre “dati.js”), allora fai:
load.open(&root, "dati.js", O_READ) e salti tutto il casino con stringhe e array :slight_smile:

[risolto]

dopo un po' di prove

String Fname = "dati.js"; char thisChar[Fname.length()]; Fname.toCharArray(thisChar, Fname.length()+1) ;

Returning 200 ------------char 0 d ------------char 1 a ------------char 2 t ------------char 3 i ------------char 4 . ------------char 5 j ------------char 6 s ------------char 7 (quadratino) ------------char 8 (quadratino)

il file è arrivato :D :grin: :D :grin:

grazie ciao

se mando tutto il file non scoppia tutto ?? :), ovvero si inchioda .....sono piuttosto lunghini

se sono lunghi sì, ma se non erro, se il file non finisce con un "a capo", manca l'ultima riga

Serial.println(thisChar); //debug se ottieni solo dati.js allora ok, se ottieni anche caratteri strani allora manca lo \0 a fine stringa!

perfetto buono a sapersi grazie