Newsgroup: it.comp.lang.c++
Titolo: non trovo EOF

Ciao a tutti, sto scrivendo un programma che genera il codice fiscale 
partendo dai dati di una persona. L'ho diviso in diverse parti, e adesso sto 
implementando la funzione che in base al comune di nascita estrae da un file 
di testo il codice corrispondente. Funziona correttamente, il problema nasce 
quando inserisco un comune che non è presente in elenco: invece di uscire 
dal ciclo, il programma continua a leggere caratteri dal file dopo l'ultimo 
comune (caratteri non stampabili, ma non so quali). La condizione del ciclo 
e' questa:
for(int j=0;!trovato && !feof(fp);j++)
quando trovo la corrispondenza tra il paese inserito e uno di quelli nel 
file setto il boolean trovato a true, e infatti esco dal ciclo. Se non trovo 
corrispondenza continua a ciclare. Qui di seguito posto tutto il codice, non 
inserisco anche quello del file perchè sono ben 8264 righe, comunque è un 
file di testo csv. Grazie a chiunque possa aiutarmi.
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
#define dimensione 500
using namespace std;
void tuttoMaiuscole(char paese[]);
main()
{
 FILE *fp;
 FILE *fp2;
 char comune[50];
 char comune2[50];
 char paese[50];
 char codice[17];
 char lettera;
 bool trovato=false;
 int corrispondenza=0;
 cout<<"\n\ninserisci paese: ";
 gets(paese);
 tuttoMaiuscole(paese);
 fp=fopen("codiciComuniItaliani.txt","r");
 //copio carattere per carattere stringa paese da file a stringa appoggio
 do //se non trovo paese lo richiedo
 {
 for(int j=0;!trovato && !feof(fp);j++)
 {
  int i=0;
  for(i=0;lettera!=10;i++)
  {
   lettera=fgetc(fp); //cout<<"\n\nlettera: "<<lettera;
   comune[i]=lettera;
  }
   i-=1; //torno indietro di una posizione per eliminare carattere di a capo
   comune[i]='\0';
   //faccio avanzare puntatore fino all'inizio della stringa successiva
    for(int i=0;!isalpha(lettera) && !feof(fp);i++)
    {
     lettera=fgetc(fp);
     if(lettera!=EOF)
      fseek(fp,1,1);
    }
    fseek(fp,-2,1);
  //copio stringa comune in un'altra stringa, senza ; e codice
   for(int i=0;lettera!=';';i++)
   {
    lettera=comune[i];
    comune2[i]=lettera;
   }
   i-=5;
   comune2[i]='\0';
   //se la lunghezza delle due stringhe e' identica inizio confronto
   if(strlen(comune2)==strlen(paese))
   {
    /*confronto con strcmp tutti i caratteri: se valore di ritorno e' 0
   allora le due stringhe sono identiche, dato che anche la lunghezza e' 
identica*/
    corrispondenza=strcmp(paese,comune2);
    if(corrispondenza==0) trovato=true;
   }
 }//chiusura for
 if(!trovato) cout<<"\n\nnessun comune corrisponde a quello inserito";
 }while(!trovato); //se non trovo paese lo richiedo
 fclose(fp);
 //una volta trovata la corrispondenza con un comune, devo estrarre dalla 
prima stringa
 //il codice relativo. Ho bisogno di sapere in quale posizione si trova il ;
 int i=0; //indice per contatore posizione ;
 int j=0; //indice per stringa codice fiscale
 lettera='c'; //devo risettare lettera, perche' ora contiene ;
  for(i=0;lettera!=';';i++)
   lettera=comune[i];
   int posizionePuntoVirgola=i-1; //il valore di 'i-1' mi da la posizione 
del ;
  for(int 
posizioneCodicePaese=posizionePuntoVirgola+1;lettera!='\0';posizioneCodicePaese++)
  {
   lettera=comune[posizioneCodicePaese];
   codice[j]=lettera;
   j++;
  }
 codice[j]='\0';
 cout<<"\n\nil codice del paese e': \n\n";
 puts(codice);
 cout<<"\n\n";
 system("pause");
} //chiusura main
void tuttoMaiuscole(char paese[])
{
 char letteraMaiuscola;
 for(int i=0;i<strlen(paese);i++)
 {
  letteraMaiuscola=paese[i];
  paese[i]=toupper(letteraMaiuscola);
 }
 for(int i=0;i<strlen(paese);i++)
 {
  letteraMaiuscola=paese[i];
  paese[i]=toupper(letteraMaiuscola);
 }
}

   for(i=0;lettera!=10;i++)
Secondo me è qui che si alluppa. Se lettera=EOF non esce più...
Ti fare un ciclo sulle righe del file, con fgets. Dopodiché scansioni la 
riga direttamente in memoria. E' più semplice e più facile da controllare.
E.

 #include<conio.h>
1. in C++ non e' necessario usare costanti #definite. Usa pure una const
opportuna
2. importare tutto il namespace std in quel modo e' *male*
3. usa i nomi stile C++ degli header. Quelli ereditati da C perdono il
.h e acquistano una c iniziale.
4. conio.h non e' standard. droppalo
5. perche' incaponirsi con le stringhe stile C quando C++ offre stringhe
che funzionano meglio e sono piu' comode da usare
6. il system("pause") e' un'aberrazione
7. non puoi veramente pensare di avere una funzione come la tua main che
fa venti cose diverse ed e' cosi' lunga. Devi fattorizzarci del codice.
-- 
-riko

 E. 

 ha scritto nel messaggio 
news:T61xl.478$mj5...@tornado.fastwebnet.it...
