Семинар 1 (02.09.2016)
Введение
Рассмотрим следующую задачу. Деканат каждый день присылает отчёт по прошедшим занятиям в текстовом файле, имеющим следующий формат:
каждая строка содержит следующую информацию:
<предмет>:<номер группы>:<фамилия>:<оценка>:<присутствие>
Например, файл Report_2015_09_04.txt:
OOP_seminar:12345:Ivanov:Good:attend
OOP_seminar:12345:Petrov:None:absent
OOP_seminar:54321:Smith:Exсellent:attend
Уже к середине семестра таких файлов накапливается достаточно много и анализировать их "вручную" становится затруднительно. Допустим, некоторый студент хочет извлечь информацию только о себе. Как он может это сделать?
Задача
Необходимо написать программу, которая делает следующее:
-
Фильтрует строки текста, оставляя только те, которые содержат заданный шаблон.
-
Выбирает и оставляет из каждой строки поле с заданным порядковым номером.
При этом:
-
Шаблон задается первым аргументом командной строки.
-
Порядковый номер задается вторым аргументом.
-
Разделитель полей в рамках программы фиксированный -
:
-
Если задан третий аргумент, то чтение строк осуществляется из файла, заданного третьим аргументом (иначе - чтение с консоли).
-
Необязательный четвертый аргумент - выходный файл (если не задан - вывод на консоль).
Требования к реализации
-
Должны быть реализованы отдельные функции
filter
для фильтрации строк иextractField
для выбора поля -
Функции должны располагаться в отдельном файле (раздельная компиляция)
-
Функции должны быть протестированы при помощи юнит-тестов. Можно использовать библиотеку googletest
-
Код проекта должен быть залит в репозиторий
Дополнительная информация
Сигнатура функций filter
и extractField
может быть следующей:
void filter(std::string pattern, std::istream & in, std::ostream & out);
void extractField(int field, std::string sep, std::istream & in, std::ostream & out);
Для реализации промежуточного буфера при работе с потоками можно использовать класс std::stringstream.
Ссылки
При выполнении задания может оказаться полезным почитать материал первого семинара прошлого года
Документация по языку C++