Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
FILE *fp;
fp = fopen ("testo.txt","r");
do{
fgets(s, L, fp);
for(j=0;j<=strlen(s);j++){
sscanf(s, "%c", &c); //scanfa carattere per carattere
if(c==k){ //compara il carattere corrente c con la variabile k
counter++;}
}
}
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
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++
FILE *fp;
char ChInput='c';
char ChFile;
fp=fopen("file.txt","r");
while((ChFile=fgetc(fp))!=EOF)
{
if(ChFile==ChInput)
{
Counter++;
}
}
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
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++
FILE *fp;
fp = fopen ("testo.txt","r");
do
{
fgets(s, L, fp);
for(j=0;j<=strlen(s);j++) //scorro l'array
if(s[j] == k) // confronto il carattere nella posizione j con la varibile k
counter++; // se uguale incremento counter
}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