Помощь - Поиск - Пользователи - Календарь
Полная версия: архивация
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Client
Привет!
решил сделать программку для архивации и... сейчас есть 2 проблемки:
1) начал считывать файл через blockread и получаю ошибку I/O 998. ошибка доступа, но почему? файл создался и в корне диска и в папке с проектом.
procedure TForm1.Button2Click(Sender: TObject);
var
f : file;
buf : array [0..255] of Char;
begin
AssignFile(f, 'D:\asd.bin');
Reset(f);
BlockRead(f, buf, 250); <-- тут вылазит ошибка sad.gif
Memo1.Text := buf;
CloseFile(f);
end;


2)пока до этого не дошел, но.. какой у меня будет выигрыш? Допустим, есть текстовый файл, я его прочитал, составил таблицу частот символов, построил дерево, а потом что? у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком?
volvo
Следи за руками:
var
buf : array [0..255] of Char; // Хранилище на 250 байт
// ...
Reset(f); // Открыли файл. Дефолтный размер одного блока = 128 байт
BlockRead(f, buf, 250); // читаем 250 блоков = 32К. Что ты ожидаешь увидеть, кроме ошибки?


Цитата
у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком?
Значит записывай эти 3 бита в буферный байт, потом следующие 3 бита, и так, пока не наберется 8 бит. Набралось - сбрасываешь буфер в файл, и продолжаешь... shl/shr + and/or в помощь...
Client
спасибо.

а как тогда мне различать где символ начинается/заканчивается. Ведь один символ может занимать 3 бита, второй - 4, как тогда сделать "границу" между ними?

или лучше выбрать какой-нибудь другой способ записи данных?
volvo
Ты какой алгоритм архивации реализовать задумал?
Client
метод Хаффмана
volvo
В адаптивном алгоритме Хаффмана, например, чтение из входного потока осуществляется вообще побитно, и, в зависимости от прочитанного значения, производится то лил иное действие. То есть, если тебе надо прочесть 3 бита - то ты и прочтешь именно 3. Не надо никаких границ...
Client
побитно? т.е. сначала считал байт и разбил его или прям побитно? по-моему меньше байта нельзя прочитать

хм, ну так в теории вроде понятно, что я записал в файл я и прочитаю. но все равно я не понял
например, есть (101)(10)(0101)(011)(1011)(1001)(1011) в скобках "короткий символ".
Вот читаю 1 байт, прохожу по битам, смотрю 101, да он совпадает, в таблице есть такая цепочка бит, можно читать дальше. Но, если взять еще 1 бит, будет 1011. Такая кодировка символа тоже есть в таблице. И дальше больше.

Этот момент я не пойму как разобрать
Гость
> по-моему меньше байта нельзя прочитать

Используй абстракции. Напиши класс, читающий побитово. Внутри он читает блоками по 4096 байт, но при наружу он выдаёт очередной бит и увеличивает внутренний счётчик.

> Но, если взять еще 1 бит, будет 1011

Нет, будет 100101.
Client
Цитата
Нет, будет 100101
хм, а как получил?
я взял 4-й бит и добавил к трем предыдущим и получилось 101+1 = 1011.
-TarasBer-
А, ты про это.

Не, суть шифра хаффмана такова, что никакой код не может быть началом другого кода (это называется префиксный код).

(я просто подумал, что ты взял начало следующего байта, и взял то, что начинается с 4 бита, короче, проехали)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.