The problem you've described is here:
while (cin.fail())
{
cout << "Re-enter a valid value! ";
}
It looks like you don't fully understand what's happening here yet, so I will break this down for you.
The code translates to something like this:
"While cin.fail() is true, output "Re-enter a valid value! " to the console"
Which it will do continuously because there is no way to break out of the loop.
I don't think cin.fail() is what you want to use here, it looks like you want an algorithm to tell you if the date is valid or not and, if it's not valid, to repeat the query to the user so they can enter good data. Conceptually this is good practice, you're on the right track, but you need to learn a bit more.
I would suggest reading some tutorials on input/output and also looking into input validation.
This is an excellent resource for learning C++ http://www.cplusplus.com/doc/tutorial/
And here is some info on input validation http://www.cplusplus.com/forum/beginner/121194/