Привет! решил сделать программку для архивации и... сейчас есть 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); <-- тут вылазит ошибка Memo1.Text := buf; CloseFile(f); end;
2)пока до этого не дошел, но.. какой у меня будет выигрыш? Допустим, есть текстовый файл, я его прочитал, составил таблицу частот символов, построил дерево, а потом что? у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком?
volvo
27.03.2011 18:18
Следи за руками:
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
27.03.2011 19:27
спасибо.
а как тогда мне различать где символ начинается/заканчивается. Ведь один символ может занимать 3 бита, второй - 4, как тогда сделать "границу" между ними?
или лучше выбрать какой-нибудь другой способ записи данных?
volvo
28.03.2011 0:01
Ты какой алгоритм архивации реализовать задумал?
Client
28.03.2011 11:41
метод Хаффмана
volvo
28.03.2011 17:54
В адаптивном алгоритме Хаффмана, например, чтение из входного потока осуществляется вообще побитно, и, в зависимости от прочитанного значения, производится то лил иное действие. То есть, если тебе надо прочесть 3 бита - то ты и прочтешь именно 3. Не надо никаких границ...
Client
1.04.2011 19:38
побитно? т.е. сначала считал байт и разбил его или прям побитно? по-моему меньше байта нельзя прочитать
хм, ну так в теории вроде понятно, что я записал в файл я и прочитаю. но все равно я не понял например, есть (101)(10)(0101)(011)(1011)(1001)(1011) в скобках "короткий символ". Вот читаю 1 байт, прохожу по битам, смотрю 101, да он совпадает, в таблице есть такая цепочка бит, можно читать дальше. Но, если взять еще 1 бит, будет 1011. Такая кодировка символа тоже есть в таблице. И дальше больше.
Этот момент я не пойму как разобрать
Гость
1.04.2011 20:21
> по-моему меньше байта нельзя прочитать
Используй абстракции. Напиши класс, читающий побитово. Внутри он читает блоками по 4096 байт, но при наружу он выдаёт очередной бит и увеличивает внутренний счётчик.
> Но, если взять еще 1 бит, будет 1011
Нет, будет 100101.
Client
1.04.2011 20:52
Цитата
Нет, будет 100101
хм, а как получил? я взял 4-й бит и добавил к трем предыдущим и получилось 101+1 = 1011.
-TarasBer-
2.04.2011 0:16
А, ты про это.
Не, суть шифра хаффмана такова, что никакой код не может быть началом другого кода (это называется префиксный код).
(я просто подумал, что ты взял начало следующего байта, и взял то, что начинается с 4 бита, короче, проехали)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.