Lettura Riga Formattata

Buona sera, avrei una domanda da porvi, devo leggere una riga formattata una file per caricarla in una variabile, arrivando da C ho subito pensato ad una fscanf, ma sembra che non sia la strada giusta in quanto in fase di verifica mi restituisce il seguente errore:

SvegliaSketch:32: error: cannot convert 'SDLib::File' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'
** fscanf(sveglie,"%d", &prova);**
** ^**
cannot convert 'SDLib::File' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'

Il codice che ho usato per la prova è il seguente

  SD.begin(SDCS);
  sveglie = SD.open("Sveglie.txt");
  int prova = 0;
  fscanf(sveglie,"%d", &prova);

Se come immagino il problema è l'uso della scanf, per ottenere lo stesso risultato quale funzione dovrei usare?

Cordiali saluti e grazie in anticipo

di solito non aiuto studenti
ma faccio accezione, oggi
cannot convert .... to file *
mi sa tanto che devi passare il puntatore al file, non il file stesso
anche l'apertura del file mi sembra un po' strana....

Hai ragione, nel codice mi sono dimenticato di riportare una linea:

File sveglie;

void setup() {
  // put your setup code here, to run once:
  CaricaSveglie();

}

void CaricaSveglie() {
  SD.begin(SDCS);
  sveglie = SD.open("Sveglie.txt");
  int prova = 0;
  fscanf(sveglie,"%d", &prova);
}

che ho inserito prima di void setup come variabile globale.

Ho seguito questo esempio per aprire un file https://www.arduino.cc/en/Tutorial/ReadWrite

Se provo ad inserire il puntatore *

File *sveglie;

void setup() {
  // put your setup code here, to run once:
  CaricaSveglie();

}

void CaricaSveglie() {
  SD.begin(SDCS);
  sveglie = SD.open("Sveglie.txt");
  int prova = 0;
  fscanf(sveglie,"%d", &prova);
}

l'errore cambia in:

SvegliaSketch:27: error: cannot convert 'SDLib::File' to 'SDLib::File*' in assignment
** sveglie = SD.open("Sveglie.txt");**
** ^**
SvegliaSketch:28: error: request for member 'available' in 'sveglie', which is of pointer type 'SDLib::File*' (maybe you meant to use '->' ?)
** while(sveglie.available())**
** ^**
SvegliaSketch:32: error: cannot convert 'SDLib::File*' to 'FILE* {aka __file*}' for argument '1' to 'int fscanf(FILE*, const char*, ...)'
** fscanf(sveglie,"%d", &prova);**
** ^**
cannot convert 'SDLib::File' to 'SDLib::File*' in assignment

accipicchia
io manco sapevo che in arduino (inteso come sistema) era presente la fscanf()
ma sembra che si riferisca ad un oggetto 'FILE' differente come "tipo" dall'oggetto 'File' della SD
ammetto che non ci capisco più niente

Ho pensato la stessa cosa perchè in C un file si dichiara tutto maiuscolo: "FILE *fp;"
Ma se provo a dichiarare un file così:

FILE *sveglie;

void setup() {
  // put your setup code here, to run once:
  CaricaSveglie();

}

void CaricaSveglie() {
  SD.begin(SDCS);
  sveglie = SD.open("Sveglie.txt");
  int prova = 0;
  fscanf(sveglie,"%d", &prova);
}

ottengo errori sulla libreria SD:

SvegliaSketch:27: error: cannot convert 'SDLib::File' to 'FILE* {aka __file*}' in assignment
** sveglie = SD.open("Sveglie.txt");**
** ^**
SvegliaSketch:28: error: request for member 'available' in 'sveglie', which is of pointer type 'FILE* {aka __file*}' (maybe you meant to use '->' ?)
** while(sveglie.available())**
** ^**
cannot convert 'SDLib::File' to 'FILE* {aka __file*}' in assignment

Alla luce di ciò presumo che io non debba usare la fscanf, ma non ho idea di cos'altro usare per ottenere un risultato simile

Standardoil:
... io manco sapevo che in arduino (inteso come sistema) era presente la fscanf() ...

Infatti io non trovo alcun riferiemnto né alcuna implementazione ... dove sarebbe definita ? ? ? :o

Guglielmo

Non lo so, sono confuso
però da un errore di tipo dati errato
quindi da qualche parte deve esserci il suo prototipo.........

L'IDE la riconosce (gli da un colore diverso: arancione), ho pensato fosse implementata in qualche libreria di base

The_Fidax:
Se come immagino il problema è l'uso della scanf, per ottenere lo stesso risultato quale funzione dovrei usare?

Ho proprio idea che NON ci sia un equivalente ...
... devi studiarti le funzioni di AVR libc ed in particolare quanto è in <string.h> ... con un po' di lavoro riesci a costruirti un tuo "parser" ::slight_smile:

Guglielmo

scanf() e derivati sono inclusi in stdio.h.

Però, come avete notato, fscanf() vuole come primo argomento un FILE *, che in Arduino non si usa (si usa invece SD::File, come visto). Quindi, quel che devi fare è leggere una riga intera con i metodi della classe file e quindi usare sscanf() su di essa.

trovata
stdio.h cartella hardware tools avr avr include
riga 895

extern int fscanf_P(FILE *__stream, const char *__fmt, ...);

ma poi... temo che se ci fosse veramente sarebbe pre-compilata, o presente solo come assembly o robe simili

SukkoPera:
scanf() e derivati sono inclusi in stdio.h. ....

Grazie Sukko, me l'ero persa ... ed è comunque inutilzzabile ... ::slight_smile:

Bella la tua soluzione :wink:

Guglielmo

io dire grande castroneria di 22 e 23....
cast(r)are un SD::File a FILE?
uscire fumo da scheda?

Grazie mille! Compilare compila! Adesso devo iniziare i test pratici.
Davvero ancora grazie!

Vi riporto il codice usato per completezza:

File sveglie;

void setup() {
  // put your setup code here, to run once:
  CaricaSveglie();

}

void loop() {
  // put your main code here, to run repeatedly:

}

void CaricaSveglie() {
  SD.begin(SDCS);
  sveglie = SD.open("Sveglie.txt");
  char str[20];
  sveglie.read(str,10);
  int prova = 0;
  sscanf(str,"%d", &prova);
}

Se devi leggere solo un intero, puoi usare anche atoi() o strtol(), sono sicuramente più leggere.

E ricordati di chiudere il file.