Newsgroup: it.comp.programmare.win32
Titolo: sscanf

Risalve a tutti.
Premetto che sto un po' rompendo in questo ng, ma è per la tesi, quindi
forse potete capirmi, ho un po' il pepe al culo e le cose non funzionano
ancora. Se mi aiutate vi invito alla festa di laurea.
Allora, credo di aver capito che i porblemi che ho attingendo dal file di
testo sono sull'utilizzo di sscanf
Se dichiaro
  double ISTVal[4];
è più corretto:
   sscanf(validLine.GetBuffer(0),"%lf %lf %lf %lf
",&ISTVal[0],&ISTVal[1],&ISTVal[2],&ISTVal[3]);
Oppure
   sscanf(validLine.GetBuffer(0),"%lf %lf %lf %lf
",ISTVal[0],ISTVal[1],ISTVal[2],ISTVal[3]);
Oppure
   sscanf(validLine.GetBuffer(0),"%lf %lf %lf %lf ",ISTVal);
Mi sapreste dire quale e perchè eventualmente gli altri son sbagliati?
Grazie a tutti anticipatamente
PS ValidLine è una funzione che ho scritto, non preoccupatevi
Ciao

 Ciao
Ciao

 Ovviamente è sbagliato anche questo.
ti riporto l'esempio tratto da MSDN:
/* SSCANF.C: This program uses sscanf to read data items
·  from a string named tokenstring, then displays them.
 */
#include <stdio.h>
void main( void )
{
char  tokenstring[] = "15 12 14...";
char  s[81];
char  c;
int   i;
float fp;
/* Input various data from tokenstring: */
sscanf( tokenstring, "%s", s );
sscanf( tokenstring, "%c", &c );
sscanf( tokenstring, "%d", &i );
sscanf( tokenstring, "%f", &fp );
ora, s è un array e se guardi l'array lo tratta diversamente...Come si
spiega?Ciao e grazie ancora

 spiega?
Dovrebbe dipendere dalla specificazione del formato; il formato %s implica
che come argomento si passi l'indirizzo di un array di caratteri.
Ti riporto un pezzo di MSDN per quanto riguarda la scanf:
Remarks
The scanf function reads data from the standard input stream stdin and
writes the data into the location given by argument. Each argument must be a
pointer to a variable of a type that corresponds to a type specifier in
format. If copying takes place between strings that overlap, the behavior is
undefined.
Per ogni specificazione di formato occorre specificare un argomento,
con %s devi specificare un puntatore ad un array di caratteri, con %lf devi
specificare un puntatore a double.
Visto che puoi accedere a MSDN, prova a verificare la sintassi della "scanf"
e il paragrafo "Format Specification Fields - scanf functions and wscanf
Functions".
Ciao
Porlock.

 validLine.GetBuffer(0) ?
Allora la funzione è questa:
CString CBayesian::GetValidLine(FILE *stream)
{
 CString linea;
 do
 {
  linea.GetBufferSetLength(256);
  fgets(linea.GetBuffer(0),255,stream);
  if(linea.Find("//",0)!=0)
  {
   //questa linea non inizia con un commento
   // bene la ritorniamo
   return linea;
  }
 } while(!linea.IsEmpty());
}
che però mi ritorna un warning in compilazione:
warning C4715: 'CBayesian::GetValidLine' : not all control paths return a
value
La dll che creo serve in ambiente Eyesweb, un software opensource per la
multimedialità.
All'inizio, nel metodo init della mia classe, faccio:
 ReadFromFile(m_config);
che dovrebbe passargli il path del file, ed in effetti parrebbe farlo.
Poi dopo aver letto il file e messo i valori nei vari array, tra cui ISTVal,
faccio un controllino:
for (i=0;i<=3;i++)
 {
 Message("Ist val: %d\n",ISTVal[i]);
 }
I valori che mi spara fuori sono:
(Remote)  Ist val: 1889785610
(Remote)  Ist val: 1340029796
(Remote)  Ist val: 584115552
(Remote)  Ist val: -377957122
Assolutamente a caso:
il file di testo inizia con:
// Config File for first intention
// valori Istantanei e medi Pitch, KV, Leg, NPS
53.33 111.868 0.843 4.298
Il readfromfile l'avevo provato da solo creando un progettino exe, e leggeva
correttamente.
Qui invece pare non andare.
Ho dato la colpa al fatto che ISTVal fosse double, e quindi in sscanf ho
sostituito %lf con %d. Niente, mi ritorna 53 come primo vaore, che è la
parte intera di 53.33. Allora ho fatto diventare ISTVal float. Niente.
Non capisco dove stia l'inghippo!
Grazie della pazienza, ciao.

 (Remote)  Ist val: -377957122
questi valori che mi sparava fuori non sono quelli contenuti nell'array, che
invece eran giusti!!!
Una cosa carina:
usando una variabile check, un double che somma i valori, scrivendo
check==1
è sbagliato,
check==1.0 è giusto!
va a capire sto compilatore VC++
Grazie ancora della disponibilità, ciao


Scusa un momento, ma se è una struttura di double perché non usi %lf come
hai fatto nella sscanf ?
for (i=0;i<=3;i++)
{
Message("Ist val: %lf\n",ISTVal[i]);
}
vedrai che ti fa vedere i valori giusti.
Ciao
Porlock