Структура файла. Запись частоты встречаемости символов в файле

Страницы работы

Содержание работы

Структура файла.

Файлы записываются в архив друг за другом. Структура одного куска такова: file_name|ByteFullFileLen|BitTreeKodeLen|tree_code|BitHufmenKodeLen|hufmen_code,

где

 file_name                              - имя файла

ByteFullFileLen                     - длина в байтах всего последующего куска

BitTreeKodeLen                    - длина кода дерева Хаффмана в битах

tree_code                                - код дерева

BitHufmenKodeLen              - длина закодированного файла в битах

hufmen_code                         - сам код файла

|                                   - разделяющий символ ’|’

Структуры.

Code, включающая в себя

            int KodeLen                           - длина кода в битах

            unsigned long SymbKode      - код символа

            unsigned char symbol                        - сам символ ( далее везде используется именно беззнаковый char, но я буду опускать это).

            Данная структура используется для хранения кодировок. Заводится массив code HufmenCode [256], куда и складывается кодировка.

Tree, включающая в себя

            unsigned long fr                     - частота встречаемости символа

            unsigned char symb               - символ

            tree *next                               - следующий в списке элемент

            tree *left                                 - левое поддерево

            tree *right                               - правое поддерево

            Структура предназначена для хранения дерева Хаффмана. Из данной структуры сначала составляется список, который затем преобразуется в дерево.

Границы работы программы.

Для записи частоты  встречаемости символов в файле используется unsigned long, поэтому программа гарантируемо сжимает файлы до 8 Гб, где unsigned long переполняется, что приводит к неправильному построению кода. Еще одним ограничением является то, что код символов хранится также в unsigned long. Поэтому может содержать последовательность кода длиной 32. Но для появления кода длиной в 33 ячейки необходимо специфическое распределение частот символов. Они должны образовывать последовательность 1 1 2 4 8 25 26 … 231 232. Но тогда длина файла будет больше 8 Гб, следовательно, и здесь 8 Гб является границей.

Работа программы.

Программа может выполнять следующие операции:

-h                                                                               вывести информацию о программе

-a         arc.hfm           file_1 file_2 …                      добавить в архив файлы или если архив ранее не                               
                                 cуществовал – создать его.


-x         arc.hfm           file_1 file_2 …                      разархивировать файлы, не удаляя их из arc.hfm

-x         arc.hfm                                                           извлечь все файлы, не удаляя архив

-d         arc.hfm           file_1 file_2 …                      удалить файлы из архива

-l         arc.hfm                                                           распечатать имена всех файлов,

хранящихся в архиве


Добавление файлов в архив:

Если arc.hfm существует - открываем его, если нет – создаем пустой.  Для каждого файла из file_1 file_2 … file_n выполняем:

проверяем, существует ли такой файл,

если нет, выводим сообщение и берем следующий файл, иначе идем далее,

 убираем из названия путь к файлу,

 проходим по архиву - проверяем, есть ли в архиве файл с таким названием,

 если нет, то кодируем и записываем в конец архива,

если уже содержит, выводим сообщение и идем дальше.

Разархивация файлов:

Если нужно извлечь все файлы, то просто идем по файлу пока не достигнем конца и производим разархивацию. Если нужно извлечь определенные файлы, то идем по архиву – находим файл. Если не нашли – сообщаем об этом. Иначе, добавляем к названию директорию, где лежит архив, и производим разархивацию. И так для каждого файла. Перед непосредственно разархивацией проверяем, не существует ли уже этот файл, если да, то спрашиваем нужно ли его переписать.

Удаление файлов:

Сначала, чтобы зря не переписывать архив, для каждого файла проходим по архиву – ищем его. Не нашли - сообщаем. Если есть что удалять, то составляем список из файлов для удаления и отправляем его в функцию. Идем по архиву – ищем файлы. Если файл не нужно удалять - переписываем его  в новый созданный архив. Если файл подлежит удалению, то просто сдвигаемся до следующего. Когда дошли до конца файла – удаляем старый, проверяем новый. Если тот пуст, то удаляем и его.

Похожие материалы

Информация о работе