[C++]fflush e VS2015

di il
8 risposte

[C++]fflush e VS2015

Come ide utilizzo visual studio 2015 e devo realizzare la classe autore e la classe libro. il problema attualmente è sulla classe autore: non riesco a leggere nome e cognome.
per leggerli ho overloaddato l'operatore >> in questo modo:
istream& operator>> ( istream& input, Autore& a )
{
	cout << "Inserisci il nome dell'autore: ";
	fflush(NULL);
	getline ( input, a.nome );

	cout << "Inserisci il cognome dell'autore: ";
	fflush(NULL);
	getline ( input, a.cognome );

	return input;
}
nel main, prima di leggere l'autore, chiedo all'utente quale operazione vuole fare tramite un menu:
int menu(bool flag)
{
	int scelta;

	do
	{
		cout << "Premi:" << endl;
		cout << "1. Inserisci i dati dei libri." << endl;
		cout << "2. Stampa i dati dei libri." << endl;
		cout << "3. Sconta un libro a scelta." << endl;
		cout << "4. Confronta i titoli dei libri." << endl;
		cout << "5. Esci dal programma." << endl;
		cin >> scelta;
		fflush(stdin);

		if ((scelta < 1 || scelta > 5) || (scelta != 1 && flag == false))
			cout << "Premi un tasto da 1 a 5 ed esegui prima lo step 1." << endl;
	} while ((scelta < 1 || scelta > 5) || (scelta != 1 && flag == false));

	return scelta;
}
il problema è che il nome dell'autore non viene letto e mi chiede solo il cognome. pensando fosse un problema di buffer, ho messo fflush(stdin) dopo l'input del menu, ma non è cambiato nulla, allora l'ho messo dopo le getline nell'operator>>, ma anche così continua a non venire letto. ho provato anche a mettere fflush(null), come si vede dal sorgente, ma anche così non cambia nulla, e stampando il valore di ritorno di fflush direi che funziona correttamente, poichè restituisce 0 sempre.
con dev c++ invece questo problema non lo ho: l'autore viene letto correttamente.
esiste qualche metodo per far funzionare questo benedetto fflush anche su visual studio 2015?

8 Risposte

  • Re: [C++]fflush e VS2015

    Ho provato e funziona ... forse il problema è da qualche altra parte del codice che non hai mostrato.

    Cosa c'è nel main?
  • Re: [C++]fflush e VS2015

    Questo è il main:
    #include "libro.h"
    
    int menu(bool);
    
    int main()
    {
    	int scelta;
    	bool flag = false;
    	Libro a, b;
    	double sconto;
    
    	do
    	{
    		scelta = menu(flag);
    
    		switch (scelta)
    		{
    		case 1:
    			flag = true;
    			cin >> a;
    			cin >> b;
    			break;
    		case 2:
    			cout << a;
    			cout << b;
    			break;
    		case 3:
    			do
    			{
    				cout << "Premi 1 per scontare il libro a, 2 per scontare b: ";
    				cin >> scelta;
    
    				if (scelta < 1 || scelta > 2)
    					cout << "Premi 1 o 2!" << endl;
    			} while (scelta < 1 || scelta > 2);
    
    			do
    			{
    				cout << "Inserisci la percentuale di sconto da applicare al libro: ";
    				cin >> sconto;
    
    				if (sconto < 0)
    					cout << "Non puoi inserire sconti negativi!" << endl;
    			} while (sconto < 0);
    
    			if (scelta == 1)
    				sconta(a, sconto);
    			else
    				sconta(b, sconto);
    		case 4:
    			if (a == b)
    				cout << "I libri hanno lo stesso titolo." << endl;
    			else
    				cout << "I libri non hanno lo stesso titolo." << endl;
    			break;
    		}
    	} while (scelta != 5);
    }
    
    int menu(bool flag)
    {
    	int scelta;
    
    	do
    	{
    		cout << "Premi:" << endl;
    		cout << "1. Inserisci i dati dei libri." << endl;
    		cout << "2. Stampa i dati dei libri." << endl;
    		cout << "3. Sconta un libro a scelta." << endl;
    		cout << "4. Confronta i titoli dei libri." << endl;
    		cout << "5. Esci dal programma." << endl;
    		cin >> scelta;
    		fflush(stdin);
    
    		if ((scelta < 1 || scelta > 5) || (scelta != 1 && flag == false))
    			cout << "Premi un tasto da 1 a 5 ed esegui prima lo step 1." << endl;
    	} while ((scelta < 1 || scelta > 5) || (scelta != 1 && flag == false));
    
    	return scelta;
    }
    che versione di visual studio usi?
  • Re: [C++]fflush e VS2015

    Ok ma così non riesco a fare delle prove ... manca il file include ...

    Uso la versione 2010 ma non ci dovrebbero essere problemi del genere ...
  • Re: [C++]fflush e VS2015

    Allora credo sia solo un problema della versione 2015.
    qua c'è tutto il progetto (header, cpp):

    autore.h:
    #pragma once
    
    #include <iostream>
    
    using namespace std;
    
    class Autore
    {
    private:
    	string nome; // nome dell'autore del libro
    	string cognome; // cognome dell'autore del libro
    
    public:
    	Autore ( ); // costruttore di default
    	Autore ( string&, string& ); // costruttore con parametri (nome e cognome)
    	~Autore ( ); // distruttore
    
    	// get
    	string& getNome ( void );
    	string& getCognome ( void );
    
    	friend ostream& operator<< ( ostream&, const Autore& );
    	friend istream& operator>> ( istream&, Autore& );
    };
    autore.cpp:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    #include "autore.h"
    
    Autore::Autore ( )
    {
    	nome = "";
    	cognome = "";
    }
    
    Autore::Autore ( string& nome, string& cognome )
    {
    	this->nome = nome;
    	this->cognome = cognome;
    }
    
    Autore::~Autore ( )
    {
    	cout << "Oggetto Autore rimosso dalla RAM." << endl;
    }
    
    string& Autore::getNome ( void )
    {
    	return nome;
    }
    
    string& Autore::getCognome ( void )
    {
    	return cognome;
    }
    
    ostream& operator<< ( ostream& output, const Autore& a )
    {
    	output << a.nome.at(0) << ". " << a.cognome << ", ";
    	return output;
    }
    
    istream& operator>> ( istream& input, Autore& a )
    {
    	cout << "Inserisci il nome dell'autore: ";
    	fflush(stdin);
    	getline ( input, a.nome );
    
    	cout << "Inserisci il cognome dell'autore: ";
    	fflush(stdin);
    	getline ( input, a.cognome );
    
    	return input;
    }
    
    libro.h:
    #pragma once
    #include "autore.h"
    
    class Libro
    {
    private:
    	Autore autori[5];
    	string titolo, editore;
    	double prezzo;
    
    public:
    	Libro();
    	Libro ( Autore*, string, string, double );
    	~Libro ( );
    
    	bool operator== ( const Libro& );
    	Libro& operator= (const Libro&);
    	friend istream& operator>> ( istream&, Libro& );
    	friend ostream& operator<< ( ostream&, Libro& );
    	friend Libro& sconta ( Libro&, const double );
    };
    libro.cpp:
    #include <string>
    
    #include "libro.h"
    
    Libro::Libro()
    {
    	titolo = "";
    	editore = "";
    	prezzo = 0;
    }
    
    Libro::Libro ( Autore* autori, string titolo, string editore, double prezzo )
    {
    	for ( int i = 0; i < 5; i++ )
    		this->autori[i] = autori[i];
    
    	this->titolo = titolo;
    	this->editore = editore;
    	this->prezzo = prezzo;
    }
    
    Libro::~Libro ( )
    {
    	cout << "Oggetto Libro rimosso dalla RAM." << endl;
    }
    
    Libro& Libro::operator= (const Libro& a)
    {
    	for (int i = 0; i < 5; i++)
    		this->autori[i] = a.autori[i];
    
    	titolo = a.titolo;
    	editore = a.editore;
    	prezzo = a.prezzo;
    	return *this;
    }
    
    bool Libro::operator== (const Libro& a)
    {
    	if (this->titolo == a.titolo)
    		return true;
    	else
    		return false;
    }
    
    ostream& operator<< (ostream& output, Libro& a)
    {
    	for (int i = 0; i < 5; i++)
    	{
    		if (a.autori[i].getNome() != "" && a.autori[i].getCognome() != "")
    			output << a.autori[i];
    	}
    
    	output << " \"" << a.titolo << "\", ";
    	output << "ed. " << a.editore << ", ";
    	output << "€ " << a.prezzo << endl;
    
    	return output;
    }
    
    istream& operator>> (istream& input, Libro& a)
    {
    	for (int i = 0; i < 5; i++)
    	{
    		fflush(stdin);
    		input >> a.autori[i];
    	}
    
    	cout << "Inserisci il titolo del libro: ";
    	fflush(stdin);
    	getline(input, a.titolo);
    
    	cout << "Inserisci l'editore del libro:";
    	fflush(stdin);
    	getline(input, a.editore);
    
    	cout << "Inserisci il prezzo del libro:";
    	fflush(stdin);
    	input >> a.prezzo;
    
    	return input;
    }
    
    Libro& sconta(Libro& a, const double sconto)
    {
    	a.prezzo -= (a.prezzo * sconto / 100);
    	return a;
    }
  • Re: [C++]fflush e VS2015

    L'input funziona
  • Re: [C++]fflush e VS2015

    Allora è un problema legato alla mia versione. non credo siano altri problemi del sorgente poiché lo stesso funziona perfettamente con dev-c++.
    qualcuno ha una soluzione?
  • Re: [C++]fflush e VS2015

    Veramente ancora non ho capito il malfunzionamento ... comunque sono convinto che non sia un problema di VS ... ed è impossibile azzardare una soluzione.

    Puoi creare un eseguibile (in modalità Release) e postarlo?
  • Re: [C++]fflush e VS2015

    Penso di aver trovato la soluzione: girovagando ho scoperto che l'fflush non è uno standard del C (o meglio, l'fflush andrebbe usato per pulire solo lo stream di output; pulire lo stream di input può portare risultati imprevedibili, come in questo caso) e ho "scoperto" una possibile soluzione, ovvero l'utilizzo della cin.ignore (MAX_INT, '\n' ), che da quanto ho capito/intuito, ignora tutti gli '\n' presenti nel buffer di input (che sono quelli che causano la mancata lettura di un input).

    l'overloading di input è questo (ho cambiato classe, ora sto facendo la classe portachiavi e ho avuto lo stesso problema nella lettura di nome e cognome della persona alla quale è assegnata la chiave):
    istream& operator>> (istream& input, Cliente& a)
    {
    	cout << "Inserisci il nome del cliente al quale e' intestata la chiave: ";
    	input.ignore(INT_MAX, '\n');
    	getline(input, a.nome);
    
    	cout << "Inserisci il cognome del cliente al quale e' intestata la chiave: ";
    	getline(input, a.cognome);
    
    	return input;
    }
    tutto questo non mi genera alcun problema.
    chiedo però a voi: che differenza c'è tra fflush(stdin) e cin.ignore?
Devi accedere o registrarti per scrivere nel forum
8 risposte