Ответ 1
Я написал немного кода, который можно читать в строковых и символьных литералах. Как нормальный поток читает, если он получает недопустимые данные, он устанавливает битбит потока. Это должно работать для всех типов потоков, включая широкие потоки. Вставьте этот бит в новый заголовок:
#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
строковые и символьные литералы, и если вход не является точным совпадением, он действует так же, как и любой другой тип, который не смог правильно ввести. Обратите внимание, что это соответствует только пробелам в строковых литералах, которые не являются первым символом. Это всего лишь четыре функции, все из которых просты в мозге.
ИЗМЕНИТЬ
Анализ с потоками - плохая идея. Используйте регулярное выражение.