Hej gruppe,
Jeg tænkte at jeg ville lave en lille template funktion til
at læse et tal fra en stream. Formålet er at checke om
man kunne læse og konvertere denne, samt at sikre at der ikke
står noget og hænger i stream'en efter brug. Funktionen
er mest tænkt til at læse fra keyboard.
Det blev til dette:
template <typename T>
bool Get(T &t, std::istream &is = std::cin, std::string *Rest = 0)
{
std::string s;
std::getline(is, s);
std::stringstream ss(s);
if(ss >> t)
{
if(ss.peek() == std::istream::traits_type::eof() ||
ss.peek() == 0)
return true;
if(Rest)
std::getline(ss, *Rest);
}
return false;
}
Delen efter if(ss >> t) skulle checke om der står noget i bufferen
efter man har konverteret; hvis brugeren bliver bedt om at læse
en int og skriver 123pop, vil konverteringen gå godt (ss >> t) er true,
men jeg vil gerne finde ud af at der er skrevet pop efter tallet og
læse dette over i Rest (hvis den ikke er 0).
Problemet er at jeg ikke mener at det burde være nødvendigt at bruge
ss.peek() == 0, men Borland C++ returnerer 0 ved peek, selvom der ikke
står noget i bufferen og std::istream::traits_type::eof() er -1.
Er det noget jeg må lære at leve med, eller er der en bedre måde
at checke på?
Er der andre problemer med funktionen?
Jeg burde måske bruge eq_int_type til at checke ss.peek() værdien,
men jeg kan ikke regne ud hvad den funktion gør.
På forhånd tak.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel