WordCount
Утилита в духе wc: считает строки, слова, латинские буквы с цифрами и байты в файлах. Разбор аргументов командной строки и потоковое чтение без std::string и контейнеров.
Дальше мягкие дедлайны: deadline_1 до 18.10 (×0.85), deadline_2 до 25.10 (×0.65), deadline_3 до 01.11 (×0.5).
Войти, чтобы записаться на сдачуЗадание
Утилита в духе wc: для каждого файла из аргументов считает строки, слова, латинские буквы с цифрами и байты и печатает результат одной строкой. Первая лаба, где нужно самому разобрать аргументы командной строки и прочитать файл потоком, не загружая его в память целиком.
is-itmo-c-26, репозиторий labwork1-<ваш GitHub-логин>. Решение пишется в main.cpp, тесты лежат в tests/.Опции
| Короткая | Длинная | Что выводит |
|---|---|---|
-l | --lines | количество строк |
-w | --words | количество слов |
-a | --alnum | количество латинских букв и цифр |
-c | --bytes | размер файла в байтах |
Короткие опции можно склеивать (-lawc), опции и имена файлов идут в любом порядке, файлов может быть несколько:
./WordCount filename1
./WordCount filename1 filename2
./WordCount --words --lines filename1
./WordCount -l -c filename1
./WordCount -lawc filename1 filename2
./WordCount filename1 filename2 -lw --bytesФормат вывода
По одной строке на файл, в том порядке, в каком файлы переданы:
<lines> <words> <alnum> <bytes> <filename>- Колонки всегда в этом порядке, независимо от порядка опций, и выводятся только запрошенные.
- Без опций выводятся строки, слова и байты:
<lines> <words> <bytes> <filename>. - Разделитель ровно один пробел. Имя файла печатается так, как его передали в аргументах.
- Итоговую строку с суммой по всем файлам выводить не нужно.
Правила подсчёта
- Строка заканчивается символом
\n. Последний непустой кусок без завершающего\nтоже считается строкой. В пустом файле 0 строк. - Слово — непустая последовательность непробельных символов. Пробельные: пробел,
\t,\n,\r,\v,\f. --alnumсчитает толькоA-Z,a-zи0-9, все остальные байты не учитываются.
std::ifstream) кусками или по символу, а не целиком. Отдельный тест проверяет слово, которое попадает на границу буфера.Сборка и тесты
cmake -B build
cmake --build build
./build/WordCount -lawc main.cpp
ctest -V --test-dir buildТесты лежат в tests/testdata/<номер>_<название>/: args.txt с аргументами, input.txt и expected.txt с ожидаемым выводом. Если тест упал, проще всего запустить утилиту руками на его input.txt и сравнить с expected.txt.
Про файлы, начинающиеся с «-»
-- в аргументах означает «дальше только имена файлов».Теормин
- Стандартные типы данных
- Представление чисел в памяти
- Литералы
- Указатели
- Массивы
- Арифметика указателей
- Строки
- Указатели на функцию
Мягкие дедлайны
| Ветка | Срок | Коэффициент |
|---|---|---|
deadline_0 | 11.10, 23:59 | 1.0 |
deadline_1 | 18.10, 23:59 | 0.85 |
deadline_2 | 25.10, 23:59 | 0.65 |
deadline_3 | 01.11, 00:00 | 0.5 |
Максимум 12 баллов.
Требования
- Только стандартная библиотека C++.
- Запрещены
std::string,std::string_view, контейнеры стандартной библиотеки (std::vector,std::mapи другие) иstd::regex. Аргументы разбираются какchar*. - Формат вывода является частью условия: никаких лишних пробелов, символов и сообщений.
- Тесты в
tests/менять нельзя. - CI собирает решение
clang++-21обычным и с санитайзерами (-fsanitize=address,undefined), поэтому выход за границы массива или чтение неинициализированной памяти роняют тест. - Стиль проверяет clang-tidy: функции, классы и структуры в
CamelCase, переменные вlower_case, константы вkCamelCase.
Как сдавать
- Создайте ветку
deadline_0отmainв своём репозитории. - Решайте в этой ветке, коммитьте небольшими логичными порциями.
- Откройте Pull Request из
deadline_0вmain. - Дождитесь отчёта CI в комментарии к PR: там результаты тестов на обеих сборках и проверки стиля.
- Если сдаёте после первого дедлайна, ветка называется по дедлайну (
deadline_1,deadline_2,deadline_3), и балл умножается на его коэффициент.

Комментарии0
Пока никто ничего не написал.
Войдите, чтобы оставить комментарий