Oppure

Loading
20/08/11 12:39
Adone
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:

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 20/08/11 12:41
aaa
20/08/11 13:26
comina8
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:

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 21/08/11 21:07
aaa
20/08/11 13:30
ScorpionIT
.
Ultima modifica effettuata da ScorpionIT 20/08/11 22:39
aaa
20/08/11 22:39
ScorpionITA
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.

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);


aaa
21/08/11 20:45
Alex
scanfare....fgetta...xDxD troppo forte!! :rotfl::rotfl::rotfl:
aaa