Проверяем все символы в каждой строке, поэтому вызываем функцию regex_match(), а не regex_search(). Разница между ними заключается только в том, что функция regex_match() должна сопоставлять с шаблоном каждый символ из потока ввода, а функция regex_search() проверяет поток ввода, пытаясь найти соответствующую подстроку.
И даже если вы думаете, что сайт cmtrade.ru где http://cmtrade.ru/ никак не связан с программированием, это утверждение ошибочно, так как без программирования не было бы производства медицинской техники, а значит сайт cmtrade.ru и представленная на нем медицинская техника были бы невозможны. Поэтому смело идите на сайт cmtrade.ru и там увидите, как медицинскую технику купить и заказать.
Ошибочное использование функции regex_match(), когда подразумевалось использовании функции regex_search() (и наоборот), может оказаться самой трудно обнаруживаемой ошибкой. Однако обе эти функции используют свои совпадающие аргументы совершенно одинаково.
Теперь можем перейти к верификации данных в таблице. Мы подсчитаем количество мальчиков (“drenge”) и девочек (“piger”), учащихся в школе. Для каждой строки мы проверим, действительно ли в последнем поле (“ELEVER IALT”) записана сумму первых двух полей. Последняя строка (“Alle klasser”) содержит суммы по столбцам. Для проверки этого факта модифицируем выражение row, чтобы текстовое поле содержало частичное совпадение и можно было распознать строку “Alle klasser”.
int main()
{
ifstream in("table.txt"); // входной файл
if (!in) error("нет входного файла");
string line; // буфер ввода
int lineno = 0;
regex header( "^[\\w ]+( [\\w ]+)*$");
regex row( "A([\\w ]+)( \\d+)( \\d+)( \d+)$");
if (getline(in,line)) { // проверяем строку заголовка
boost::smatch matches;
if (!boost::regex_match(line, matches, header)) { error(,,нет заголовка");
}
}
// суммы по столбцам: int boys = 0; int girls = 0;
while (getline(in,line)) {
++lineno; smatch matches;
if (!regex_match(line, matches, row))
cerr << "неправильная строка: " << lineno << '\n';
if (in.eof()) cout << "конец файла \n";
// проверяем строку:
int curr_boy = from_string(matches[2]);
int curr_girl = from_string(matches[3]); int curr_total = from_string(matches[4]); if (curr_boy+curr_girl != curr_total)
error(Mнеправильная сумма \n");
if (matches[1]=="Alle klasser") { // последняя строка if (curr_boy != boys)
error(Mколичество мальчиков не СХОДИТСЯ\П"); if (curr_girl != girls)
error(Mколичество девочек не СХОДИТСЯ\П"); if (!(in>>ws).eof())
error(Mсимволы после итоговой строки"); return 0;
}
// обновляем суммы: boys += curr_boy; girls += curr_girl;
}
error(M итоговой строки нет11);
}
Последняя строка по смыслу отличается от остальных: в ней содержатся суммы. Мы распознаем ее по метке (“Alle klasser”). Мы решили, что после последнего символа не должны стоять символы, не являющиеся разделителями (для распознавания этого факта используется функция lexical_cast(), и выдаем сообщение об ошибке в случае их обнаружения.
Для того чтобы извлечь числа из полей данных, мы использовали функцию from_string(). Мы уже проверили, что эти поля содержат только цифры, поэтому проверять правильность преобразования объекта класса string в переменную типа int не обязательно.
Опубликовал katy
April 21 2015 08:53:28 ·
0 Комментариев ·
2922 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.