Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Domanda Semplice: Perchè sscanf() resta fermo?
Forum - C/C++ - Domanda Semplice: Perchè sscanf() resta fermo?

Avatar
Adone (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/08/2011

Segnala al moderatore
Postato alle 14:39
Sabato, 20/08/2011
Buongiorno a tutti,
e complimenti per la community.
Vengo subito al dunque con una domanda che per molti di voi sarà sicuramente semplice, credo :)
In pratica stavo scrivendo un codice semplicissimo il cui scopo era conteggiare quante volte una determinata lettera (per esempio la "c") è presente in un file di testo. Il cuore dell'algoritmo sarebbe questo:

Codice sorgente - presumibilmente C/C++

  1. FILE *fp;
  2. fp = fopen ("testo.txt","r");
  3.  
  4. do{
  5.         fgets(s, L, fp);
  6.         for(j=0;j<=strlen(s);j++){
  7.                 sscanf(s, "%c", &c); //scanfa carattere per carattere
  8.                 if(c==k){ //compara il carattere corrente c con la variabile k
  9.                                 counter++;}
  10.                         }
  11.         }
  12. while(feof(fp)==0);



In pratica lo sscanf scanfa cararattere per carattere ogni riga del file di testo precedentemente fgettata, e controlla ogni carattere con k che è una variabile dichiarata in precedenza che contiene la lettera che si vuole contare. Ad esempio se k='c' allora ad ogni c trovata nel file testo.txt verrà incrementato counter. Tuttavia c'è un problema, il codice mi conta sempre un numero sbagliato, allora ho provato a far printare ogni parte del codice per vedere cosa succede e ho scoperto che lo sscanf resta fermo!!! Nel senso che quando fgets fgetta di volta in volta una riga del testo.txt sscanf invece di scanfare carattere per carattere tutta la riga finchè j<=strlen(s) cioè finchè la riga non termina in pratica, continua a scanfare la PRIMA LETTERA della riga tante volte finchè j<=strlen(s) O_o! Cioè continua a girare sulla prima lettera! Quindi se per esempio io sto cercando la lettera c e ho ho un file di testo fatto così:

ciao
pippo
ciao ciao


lo scanf solo alla prima riga mi conterà ben 4 c! Perchè strlen(s) della prima riga è = a 4, e lo scanf essendo fermo sulla prima lettera continuerà a contare la c e ad incrementare il contatore. Come mai?!!!!! Come faccio a falro andare avanti? :-|

Vi ringrazio in anticipo




Ultima modifica effettuata da Adone il 20/08/2011 alle 14:41
PM
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Up
3
Down
V
Segnala al moderatore
Postato alle 15:26
Sabato, 20/08/2011
sscanf non "scorre" la stringa...
Legge un carattere in essa che sarà sempre lo stesso...
In pratica legge dalla stringa il formato specificato:

CCCCCCCCCCCCC (stringa con N caratteri)
%c%s (formato)
Leggerà il primo carattere e lo metterà nella variabile formattata da %c e il resto nella variabile formattata da %s.

In questo caso non serve a molto la sscanf...

Un metodo più semplice e più efficace è quello di fare un while:

Codice sorgente - presumibilmente C/C++

  1. FILE *fp;
  2. char ChInput='c';
  3. char ChFile;
  4.  
  5. fp=fopen("file.txt","r");
  6.  
  7. while((ChFile=fgetc(fp))!=EOF)
  8. {
  9.    if(ChFile==ChInput)
  10.      {
  11.            Counter++;
  12.      }
  13. }
  14.  
  15. fclose(fp);



ChFile=fgetc(fp) //scorre il file e legge carattere per carattere...
while(ChFile!=EOF) //finché non sei arrivato alla fine del file continui a leggere

Ultima modifica effettuata da comina8 il 21/08/2011 alle 23:07
Ho capito! Ti ringrazio per la risposta! Ma in pratica fgetc è come fgets solo che invece che fgettare una stringa, fgetta carattere per carattere? Ma (curiosità) come mai fget avanza, e invece scanf resta fermo?! - Adone - 30/08/11 19:41
PM
Avatar
ScorpionITA (Member)
Newbie


Messaggi: 15
Iscritto: 28/10/2007

Up
1
Down
V
Segnala al moderatore
Postato alle 0:39
Domenica, 21/08/2011
con fget leggi uan riga dal file e salvi il tutto su un array di caratteri usando sscanf in quel modo leggi sempre il carattere nella prima posizione dell'array

una soluzione può essere leggere un carattere per volta come ti è stato suggerito o di scorrere l'array di caratteri con un for senza usare sscanf

ad es.

Codice sorgente - presumibilmente C/C++

  1. FILE *fp;
  2.   fp = fopen ("testo.txt","r");
  3.      
  4.   do
  5.   {
  6.     fgets(s, L, fp);
  7.     for(j=0;j<=strlen(s);j++) //scorro l'array
  8.       if(s[j] == k) // confronto il carattere nella posizione j con la varibile k
  9.         counter++; // se uguale incremento counter
  10.   }while(feof(fp)==0);




Ciao! Grazie :P avevo pensato a questa soluzione però non mi era chiara la storia di scanf :S grazie comunque :P - Adone - 30/08/11 19:41
PM
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Up
-1
Down
V
Segnala al moderatore
Postato alle 22:45
Domenica, 21/08/2011
scanfare....fgetta...xDxD troppo forte!! :rotfl::rotfl::rotfl:

Non credo sia di molto aiuto... - comina8 - 21/08/11 23:06
si si lo so=) ma la risposta l'avevi già data=) - Alex - 22/08/11 22:37
ma lol! :D - Adone - 30/08/11 19:42


Alex=)
PM
Avatar
ScorpionIT (Normal User)
Newbie


Messaggi: 1
Iscritto: 28/10/2007

Up
-3
Down
V
Segnala al moderatore
Postato alle 15:30
Sabato, 20/08/2011
.

Ultima modifica effettuata da ScorpionIT il 21/08/2011 alle 0:39
PM