Блок задач

4. Один класс

Темы
Сложность 4

Задача «Проверка контрольной суммы»

Требуется написать программу для генерации и проверки контрольных сумм у файлов.

Входные данные

Файл-манифест – текстовый файл, в котором содержится информация о контрольных суммах для некоторого набора файлов. Структура:

<имя_файла_1>:<контрольная_сумма_для_файла_1>
<имя_файла_2>:<контрольная_сумма_для_файла_2>
<имя_файла_3>:<контрольная_сумма_для_файла_3>

Задание

Реализовать класс для подсчёта и проверки контрольной суммы одного файла и использовать его в программе. Сама программа должна иметь возможность работы в двух режимах:

Режим 1. Подсчет контрольной суммы для заданного набора файлов и генерация файла-манифеста.

На вход программы в качестве аргументов командной строки подается набор имён файлов. Для каждого из этих файлов программа должна осуществить подсчёт контрольной суммы и занести информацию об имени файла и соответствующей ему контрольной сумме в файл-манифест.

Режим 2. Проверка целостности файлов.

На вход программы в качестве аргумента командной строки подаётся файл-манифест. Для каждого из файлов, указанных в файле-манифесте, необходимо осуществить подсчёт контрольной суммы, сравнить с той, которая указана в манифесте, и выдать в консоль результат о совпадении (ОК) или несовпадении (FAILED) значений.


Режим работы программы задается ключом, переданным как аргумент командной строки. Для первого режима можно использовать ключ --calc, для второго — --check.

О понятии контрольной суммы и различных видах её подсчёта можно почитать в википедии. Можно использовать алгоритм CRC16 или любой другой на усмотрение студента.

Пример запуска

  1. Подсчет контрольной суммы для заданного набора файлов и генерация файла-манифеста. Имя файла-манифеста можно выбрать на усмотрение студента.
<название_бинарника> --calc <имя_файла_1> ... <имя_файла_N>

Вывод:

checksum for <имя_файла_1> calculated
...
checksum for <имя_файла_N> calculated
  1. Проверка целостности файлов.
<название_бинарника> --check <имя_файла_манифеста>

Вывод:

<имя_файла_1> : <OK/FAILED>
...
<имя_файла_N> : <OK/FAILED>