Input con cin all'interno di un ciclo while

di
Anonimizzato6504
il
4 risposte

Input con cin all'interno di un ciclo while

Salve a tutti.
Sto sviluppando un programmino in C++ che deve manipolare dei file di testo.
Il codice ha la seguente struttura:
int main()
{
	// 
	// Dichiaro una stringa (come array di 20 char) per contenere il nome del file
	char filename[20] = "";
	
	cout << "Digitare il nome del file: ";

	// Riempo la stringa filename con il nome del file passato da tastiera
	cin >> filename;

	cout << endl;

	// Menù iniziale
	int option = 5; // Gli viene assegnato un valore a caso per inizializzarla
	
	while(option != 0)  // Finchè non si preme 0 lui ripropone il menu
	{
		cout << "---------------------------------------------------------------------------" << endl;
		cout << "Menu: " << endl;
		cout << endl;
		cout << "1- Creazione del file "<< filename << " (o apertura se gia' esistente) e inserimento" << endl;
		cout << "   di una stringa al suo interno;" << endl;
		cout << "2- Modifica di una stringa all'interno del file " << filename << ";" << endl;
		cout << "3- Cancellazione del file " << filename << ";" << endl;
		cout << "4- Scelta di un altro file;" << endl;

		cout << endl;

		cout << "Scegliere l'azione da compiere (0 per terminare): ";
		cin >> option;
		
		cout << endl;

		switch(option)
		{
			case 1:
				fileCreation(filename);
				break;
			
			case 2:
				//
				break;
			
			case 3:
				//
				break;
			
			case 4:
				cout << "Digitare il nuovo nome del file: ";
				cin >> filename;
				cout << endl;
				break;
			
			case 0: break;  // per consentire l'uscita dallo switch;
			
			default:
				cout << "Opzione non disponibile. Digitare una opzione corretta" << endl;
				cout << endl;
				break;

		} // fine del menu switch



	} // fine del while

	return 0;
}
In pratica il programma propone un menu all'interno di un ciclo while condizionato dal valore della variabile opzione. In base al suo valore un costrutto switch seleziona la voce del menu. Se digito 0 (zero) esco dal programma.
Ma veniamo al mio problema.
Quando lancio l'esecuzione del programma, alla prima iterazione del ciclo while entra correttamente nel costrutto switch, io eseguo l'opzione 1 (che lancia la funzione fileCreation), e una volta eseguita il ciclo dovrebbe ripetersi, am il problema è che esso mi mantiene in memoria il settaggio dell'opzione 1 e me la ripropone all'infinito, come se il metodo cin restasse con il buffer ancora impostato allo stesso valore, invece di fermarsi di nuovo al cin ed attendere un mio input.
Come posso fare?
Grazie

4 Risposte

  • Re: Input con cin all'interno di un ciclo while

    Questo è l'output del programma:
    Menu:
    
    1- Creazione del file prova.txt (o apertura se gia' esistente) e inserimento
       di una stringa al suo interno;
    2- Modifica di una stringa all'interno del file prova.txt;
    3- Cancellazione del file prova.txt;
    4- Scelta di un altro file;
    
    Scegliere l'azione da compiere (0 per terminare):
    Apertura file "prova.txt"...fatto
    Digitare il testo da inserire nel file prova.txt:
    *NOTA: Per andare a capo dopo l'invio digitare z e premere di nuovo invio
    
    ---------------------------------------------------------------------------
    Menu:
    
    1- Creazione del file prova.txt (o apertura se gia' esistente) e inserimento
       di una stringa al suo interno;
    2- Modifica di una stringa all'interno del file prova.txt;
    3- Cancellazione del file prova.txt;
    4- Scelta di un altro file;
    
    Scegliere l'azione da compiere (0 per terminare):
    Apertura file "prova.txt"...fatto
    Digitare il testo da inserire nel file prova.txt:
    *NOTA: Per andare a capo dopo l'invio digitare z e premere di nuovo invio
    
    ---------------------------------------------------------------------------
    Menu:
    
    1- Creazione del file prova.txt (o apertura se gia' esistente) e inserimento
       di una stringa al suo interno;
    2- Modifica di una stringa all'interno del file prova.txt;
    3- Cancellazione del file prova.txt;
    4- Scelta di un altro file;
    
    Scegliere l'azione da compiere (0 per terminare):
    Apertura file "prova.txt"...fatto
    Digitare il testo da inserire nel file prova.txt:
    *NOTA: Per andare a capo dopo l'invio digitare z e premere di nuovo invio
    
    [...]
    Come potete vedere il programma riseleziona da solo l'opzione 1 invece di aspettare il mio input.
    La parte
    Apertura file "prova.txt"...fatto
    Digitare il testo da inserire nel file prova.txt:
    *NOTA: Per andare a capo dopo l'invio digitare z e premere di nuovo invio
    è l'output della funzione fileCreation che crea il file prova.txt o lo apre se già esistente. Poi dovrebbe aspettare che io inserisca il testo da mettere nel file, invece ripete il ciclo.
  • Re: Input con cin all'interno di un ciclo while

    Devi svuotare il buffer i il flag.... segui questo "esempio"

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::option(),'\n');

    il primo è il flag, il secondo il buffer.....

    questo, in particolare, un esempio per svuotare il buffer di un numero inserito da tastiera non valido, come ad esempio un carattere....
    #include <cstdlib>
    #include <iostream>
    #include <limits>   // libreria utilizzata per conoscere tramite la funzione max()
                        // la dimensione del buffer di lettura e svuotarlo.
    
    using namespace std;
    
    int LeggiInputNumerico(int ,int);   // prototipo della funzione per leggere l'input numerico
                                        // (per la definizione vedi dopo il main)
    int main(int argc, char *argv[])
    {
        const int MIN = 0;          // limite inferiore dell'input numerico
        const int MAX = 5;          // limite superiore dell'input numerico
        int Numero;                 // variabile per memorizzare l'input numerico
        
        Numero = LeggiInputNumerico(MIN,MAX);        // lettura dell'input numerico tramite l'apposita funzione
        cout << "Hai inserito: " << Numero << endl;  // Stampa a video del numero letto
                   
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    int LeggiInputNumerico(int min, int max)         // Definizione della funzione
    {
         int Input;                 // variabile per memorizzare l'input
         bool Controllo = true;     // variabile che controlla l'uscita dal ciclo
         
         do
         {
              cout << "Inserire un numero maggiore di " << min << " e minore di " << max << ":" << endl;
              
              cin >> Input;                                              // si cerca di leggere l'input
              
              if (cin.good() == 0 || Input <= min || Input >= max)       // se l'input inserito da tastiera non
                                                                         // è un intero il flag cin.good() è 0. 
              { 
                   cout << "Errore!" << endl;                           // messaggio di errore
                   cin.clear();                                         // si resetta il flag
                   cin.ignore(numeric_limits<streamsize>::max(),'\n');  // si svuota il buffer
                   Controllo = true;                                    // si continua a rimanere nel ciclo
              }
              
              else Controllo = false;                                   // se l'inserimento è corretto si esce dal ciclo
    
         } while (Controllo);
         
         return Input;       // si ritorna il numero letto
    }
  • Re: Input con cin all'interno di un ciclo while

    asd ha scritto:


    devi svuotare il buffer i il flag.... segui questo "esempio"

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::option(),'\n');

    il primo è il flag, il secondo il buffer.....

    questo, in particolare, un esempio per svuotare il buffer di un numero inserito da tastiera non valido, come ad esempio un carattere....
    #include <cstdlib>
    #include <iostream>
    #include <limits>   // libreria utilizzata per conoscere tramite la funzione max()
                        // la dimensione del buffer di lettura e svuotarlo.
    
    using namespace std;
    
    int LeggiInputNumerico(int ,int);   // prototipo della funzione per leggere l'input numerico
                                        // (per la definizione vedi dopo il main)
    int main(int argc, char *argv[])
    {
        const int MIN = 0;          // limite inferiore dell'input numerico
        const int MAX = 5;          // limite superiore dell'input numerico
        int Numero;                 // variabile per memorizzare l'input numerico
        
        Numero = LeggiInputNumerico(MIN,MAX);        // lettura dell'input numerico tramite l'apposita funzione
        cout << "Hai inserito: " << Numero << endl;  // Stampa a video del numero letto
                   
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    int LeggiInputNumerico(int min, int max)         // Definizione della funzione
    {
         int Input;                 // variabile per memorizzare l'input
         bool Controllo = true;     // variabile che controlla l'uscita dal ciclo
         
         do
         {
              cout << "Inserire un numero maggiore di " << min << " e minore di " << max << ":" << endl;
              
              cin >> Input;                                              // si cerca di leggere l'input
              
              if (cin.good() == 0 || Input <= min || Input >= max)       // se l'input inserito da tastiera non
                                                                         // è un intero il flag cin.good() è 0. 
              { 
                   cout << "Errore!" << endl;                           // messaggio di errore
                   cin.clear();                                         // si resetta il flag
                   cin.ignore(numeric_limits<streamsize>::max(),'\n');  // si svuota il buffer
                   Controllo = true;                                    // si continua a rimanere nel ciclo
              }
              
              else Controllo = false;                                   // se l'inserimento è corretto si esce dal ciclo
    
         } while (Controllo);
         
         return Input;       // si ritorna il numero letto
    }
    Grazie mille asd!
    Ho provato ad inserire le due righe di codice che mi hai suggerito e funziona alla grande!
    Grazie anche perchè mi hai dato lo stimolo per apprifondire meglio i metodi a disposizione dell'oggetto cin, che mi sembra molto più interessante di quello che credevo.
  • Re: Input con cin all'interno di un ciclo while

    Figurati... se tiserve altro non devi far altro che postare qui nel forum de i programmatori



Devi accedere o registrarti per scrivere nel forum
4 risposte