Code:
#ifndef INPUT_20081018_H
#define INPUT_20081018_H
#include <boost/format.hpp>
#include <iostream>
#include <string>
#include <sstream>
namespace Stuff
{
namespace Input
{
template<typename StrT> void StreamOut(const StrT& Output) { std::wcout << Output; }
void StreamOut(const char* Output) { std::cout << Output; }
void StreamOut(const std::string& Output) { std::cout << Output; }
template<typename T> void StreamOut(const boost::basic_format<T>& Output) { StreamOut(Output.str()); }
template<typename StrT, typename T> bool StreamIn(StrT& Stream, T& Buffer)
{
std::wstring Answer;
std::getline(Stream, Answer);
std::wstringstream StrStream(Answer);
void* SuccessPtr = (StrStream >> Buffer);
return SuccessPtr != nullptr;
}
template<typename T> bool StreamIn(T& Buffer) { return StreamIn(std::wcin, Buffer); }
// Read function overloads
// Read function with no validator func
template<typename DataT, typename StrT1>
void ReadNoVal(DataT& Out, const StrT1& Question)
{
Read(Out, Question, L"Invalid input!\n", L"Invalid input!\n", [](const DataT&){ return true; });
}
template<typename DataT, typename StrT1, typename StrT2>
void ReadNoVal(DataT& Out, const StrT1& Question, const StrT2& ErrorType)
{
Read(Out, Question, ErrorType, L"Invalid input!\n", [](const DataT&){ return true; });
}
template<typename DataT, typename StrT1, typename StrT2, typename StrT3>
void ReadNoVal(DataT& Out, const StrT1& Question, const StrT2& ErrorType, const StrT3& ErrorValidation)
{
Read(Out, Question, ErrorType, ErrorType, [](const DataT&){ return true; });
}
// Read functions with validator function
template<typename DataT, typename StrT1, typename Validator>
void Read(DataT& Out, const StrT1& Question, Validator ValidatorFnc)
{
Read(Out, Question, L"Invalid input!\n", L"Invalid input!\n", ValidatorFnc);
}
template<typename DataT, typename StrT1, typename StrT2, typename Validator>
void Read(DataT& Out, const StrT1& Question, const StrT2& ErrorType, Validator ValidatorFnc)
{
Read(Out, Question, ErrorType, L"Invalid input!\n", ValidatorFnc);
}
template<typename DataT, typename StrT1, typename StrT2, typename StrT3, typename Validator>
void Read(DataT& Out, const StrT1& Question, const StrT2& ErrorType, const StrT3& ErrorValidation, Validator ValidatorFnc)
{
for (;;)
{
StreamOut(Question);
if (!StreamIn(Out))
{
StreamOut(ErrorType);
continue;
}
if (ValidatorFnc(Out))
break;
StreamOut(ErrorValidation);
}
}
}
}
#endif // INPUT_20081018_H
But the point is, you should use std::getline and std::string.