Par ailleurs, pour éviter de dupliquer tout ce code à chaque fois, je une fois écrit une petite fonction de modèle pour faire ce travail:
template<typename InType> void AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString, InType & Result)
{
do
{
Os<<Prompt.c_str();
if(Is.fail())
{
Is.clear();
Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Is>>Result;
if(Is.fail())
Os<<FailString.c_str();
} while(Is.fail());
}
template<typename InType> InType AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString)
{
InType temp;
AcquireInput(Os,Is,Prompt,FailString,temp);
return temp;
}
La première surcharge peut être préférable si vous voulez éviter la copie, la deuxième peut être plus pratique pour les types intégrés. Exemples d'utilisation:
//1st overload
int AnInteger;
AcquireInput(cout,cin,"Please insert an integer: ","Invalid value.\n",AnInteger);
//2nd overload (more convenient, in this case)
int AnInteger=AcquireInput(cout,cin, "Please insert an integer: ","Invalid value.\n");
streamsize est l'entrée? Que diriez-vous de la taille est dynamique en fonction d'autres variables? – skydoor
'streamsize' est un type. 'cin.ignore()' prend deux arguments: le nombre maximum de caractères à ignorer (le type est 'streamsize'), et le délimiteur après lequel arrêter d'ignorer (le type est' char'). 'std :: numeric_limits :: max()' signifie "le plus grand nombre pouvant entrer dans une variable de type' streamsize'. Donc toute la ligne signifie "ignorer autant de caractères que nécessaire jusqu'à ce que vous ignoriez une nouvelle ligne, puis arrêtez. –
... en supposant que la mauvaise entrée est le coupable ... – Potatoswatter