PDA

View Full Version : [C] Conta caratteri, parole e linee


pol88884
25-10-2011, 19:02
Ciao a tutti. Non mi esce questo programma che va in loop infinito nel while, questo programma conta i caratteri, le parole e le linee di un file di testo, uso come programma "DEV-C++ 4.9.9.2" non capisco il motivo che non esce è strano perchè modificando "c=fgetc(nPtr);" in "c=getchar();" funziona benissimo, mentre con "c=fgetc(nPtr);" va in loop.
Secondo voi quale potrebbe essere il problema? Grazie a tutti!

Qui il codice:

#include <stdio.h>
#include <stdlib.h>

typedef enum{FALSO,VERO}BOOLEAN;
/*prototipo di funzione*/
BOOLEAN test(int c);

int main()
{
int c;/*carattere*/
int d;/*locazione penultimo carattere*/
int nParole=0;/*contatore parole*/
int nLinee=0;/*contatore linee*/
int nCaratteri=0;/*contatore caratteri*/
BOOLEAN is=0,fineParola=VERO;/**/
FILE *nPtr;/*creo un puntatore a un file*/

/*apri il file, se non puo' essere aperto esci dal programma*/
if((nPtr=fopen("testo.txt","r+"))==NULL){
printf("Il file non puo' essere aperto.");
}
else{



c=fgetc(nPtr);/*prende un carattere dal file e lo salva in c*/

++nCaratteri;/*incrementa il numero di caratteri*/
/*se il carattere e' un EOF esci*/
while(c!=EOF){
fineParola=VERO; /*inizializzo fine parola a TRUE*/
/*leggi i caratteri di una linea e individua le parole*/
while(c!='\n'){
/*verifica se il carattere letto e' un separatore*/
is=test(c);
/*se il carattere e' un separatore e l'ultima parola non e' terminata incrementa il numero di parole*/
if(is&&!fineParola){
nParole++;
fineParola=VERO;
}
/*altrimenti se il carattere letto non e' un separatore assegna a fineParola FALSO*/
else if(!is){
fineParola=FALSO;
}
/*salva il penultimo carattere in d*/
d=c;
c=fgetc(nPtr);/*legge un carattere dal file e lo salva in c*/
++nCaratteri;/*incrementa nCaratteri*/
} /*fine del comendo while*/

++nLinee;/*incrementa nLinee*/
is=test(d);/*controlla che il penultimo carattere sia un separatore*/
/*se non e' un separatore incrementa nParole*/
if(!is){
nParole++;
}
/*se la parola e' terminata ed e' un separatore incrementa nParole*/
else if(is&&!fineParola){
nParole++;
}
c=fgetc(nPtr);
}/*fine del comando while*/
/*stampa il numero di parole, di caratteri e di linee*/
printf("Le parole sono=%d\n",nParole);
printf("I caratteri sono=%d\n",nCaratteri);
printf("Le linee sono=%d\n",nLinee);

fclose(nPtr);/*il file viene chiuso*/
}
system("PAUSE");
return 0;
}

/*restituisci TRUE se c'è un separatore altrimenti false*/
BOOLEAN test(int c)
{
BOOLEAN ris;
ris=(c==' ')||(c=='\t')||(c=='.')||(c==';')||(c==',');

return ris;/*ritorna VERO o FALSO*/

}/*fine della funzione test*/

pol88884
25-10-2011, 22:16
Che strano ho provato ad eseguirlo e adesso funziona :confused: non capisco perchè tutto a un tratto funzoni... boh se qualcuno ha una spiegazione... sarei felice di capirci di più...grazie lo stesso

demos88
26-10-2011, 16:17
Che strano ho provato ad eseguirlo e adesso funziona :confused: non capisco perchè tutto a un tratto funzoni... boh se qualcuno ha una spiegazione... sarei felice di capirci di più...grazie lo stesso
Non so... so solo che dev c++ ho provato ad usarlo alle superiori (6 anni fa) e non funzionava un gran che e le compilazioni davano esiti discutibili... :rolleyes:
e mi sono messo a usare il borland :D

Quando ti capitano ste cose, prova anche con altri compilatori.

pol88884
26-10-2011, 18:30
Grazie mille! ;) Seguirò il tuo consiglio.

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.