Go Down

Topic: Lettura Riga Formattata (Read 243 times) previous topic - next topic

The_Fidax

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
Code: [Select]

  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

Standardoil

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....
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

The_Fidax

Hai ragione, nel codice mi sono dimenticato di riportare una linea:
Code: [Select]
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 *
Code: [Select]
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

 

Standardoil

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
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

The_Fidax

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

Code: [Select]
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

gpb01

... 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
Search is Your friend ... or I am Your enemy !

Standardoil

Non lo so, sono confuso
però da un errore di tipo dati errato
quindi da qualche parte deve esserci il suo prototipo.........
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

The_Fidax

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

gpb01

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" ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

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.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Standardoil

trovata
stdio.h cartella hardware tools avr avr include
riga 895
Code: [Select]

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
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

gpb01

#11
Mar 18, 2019, 10:23 pm Last Edit: Mar 18, 2019, 10:23 pm by gpb01
scanf() e derivati sono inclusi in stdio.h. ....
Grazie Sukko, me l'ero persa ... ed è comunque inutilzzabile ... ::)

Bella la tua soluzione ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Standardoil

io dire grande castroneria di 22 e 23....
cast(r)are un SD::File a FILE?
uscire fumo da scheda?
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

The_Fidax

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

Vi riporto il codice usato per completezza:
Code: [Select]
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);
}

SukkoPera

#14
Mar 19, 2019, 12:20 am Last Edit: Mar 19, 2019, 12:21 am by SukkoPera
Se devi leggere solo un intero, puoi usare anche atoi() o strtol(), sono sicuramente più leggere.

E ricordati di chiudere il file.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up