pol88884
25-10-2011, 18: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*/
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*/