Я написал немного кода, который может читать строковые и символьные литералы.Как и при обычном чтении потока, если он получает неверные данные, он устанавливает плохой бит потока.Это должно работать для всех типов потоков, включая широкие потоки.Вставьте этот бит в новый заголовок:
#include <iostream>
#include <string>
#include <array>
#include <cstring>
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&sliteral)[N]) {
std::array<e, N-1> buffer; //get buffer
in >> buffer[0]; //skips whitespace
if (N>2)
in.read(&buffer[1], N-2); //read the rest
if (strncmp(&buffer[0], sliteral, N-1)) //if it failed
in.setstate(in.rdstate() | std::ios::failbit); //set the state
return in;
}
template<class e, class t>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& cliteral) {
e buffer; //get buffer
in >> buffer; //read data
if (buffer != cliteral) //if it failed
in.setstate(in.rdstate() | std::ios::failbit); //set the state
return in;
}
//redirect mutable char arrays to their normal function
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) {
return std::operator>>(in, carray);
}
И это сделает ввод символов очень простым:
std::istringstream input;
double val1, val2;
if (input >>'('>>val1>>','>>val2>>')') //less chars than scanf I think
{
// got them!
}
ДОКАЗАТЕЛЬСТВО КОНЦЕПЦИИ .Теперь вы можете cin
строковые и символьные литералы, и если ввод не является точным соответствием, он действует так же, как любой другой тип, который не был введен правильно.Обратите внимание, что это соответствует только пробелу в строковых литералах, которые не являются первым символом.Это всего лишь четыре функции, каждая из которых просто умопомрачительна.
EDIT
Разбор с потоками - плохая идея.Используйте регулярное выражение.