Я ищу хороший пример того, как перегрузить оператор ввода потока (operator>>) для анализа некоторых данных с помощью простого форматирования текста. Я прочитал это руководство, но хотел бы сделать что-то более продвинутое. В моем случае у меня есть фиксированные строки, которые я хотел бы проверить (и игнорировать). Предположим, что формат 2D-точки из ссылки больше похож на
Point{0.3 =>
0.4 }
где предполагаемый эффект состоит в том, чтобы разобрать числа 0,3 и 0,4. (Да, это ужасно глупый синтаксис, но он включает в себя несколько нужных мне идей). В основном я просто хочу посмотреть, как правильно проверять наличие фиксированных строк, игнорировать пробелы и т. д.
Обновление: К сожалению, комментарий, который я оставил ниже, не имеет форматирования (я впервые пользуюсь этим сайтом). Я обнаружил, что пробелы можно пропустить с помощью чего-то вроде
std::cin >> std::ws;
И для того, чтобы съесть струны, у меня есть
static bool match_string(std::istream &is, const char *str){
size_t nstr = strlen(str);
while(nstr){
if(is.peek() == *str){
is.ignore(1);
++str;
--nstr;
}else{
is.setstate(is.rdstate() | std::ios_base::failbit);
return false;
}
}
return true;
}
Теперь было бы неплохо иметь возможность получить позицию (номер строки) ошибки синтаксического анализа.
Обновление 2: нумерация строк и синтаксический анализ комментариев теперь работают, используя всего 1 символ упреждения. Окончательный результат можно увидеть здесь в AArray.cpp, в функции parse() . Проект представляет собой (де)сериализуемый класс C++ PHP-подобного массива.