IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> архивация
Client
сообщение 27.03.2011 14:01
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Привет!
решил сделать программку для архивации и... сейчас есть 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 бита а не байт целиком?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.03.2011 14:18
Сообщение #2


Гость






Следи за руками:
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 15:27
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


спасибо.

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

или лучше выбрать какой-нибудь другой способ записи данных?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.03.2011 20:01
Сообщение #4


Гость






Ты какой алгоритм архивации реализовать задумал?
 К началу страницы 
+ Ответить 
Client
сообщение 28.03.2011 7:41
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


метод Хаффмана
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.03.2011 13:54
Сообщение #6


Гость






В адаптивном алгоритме Хаффмана, например, чтение из входного потока осуществляется вообще побитно, и, в зависимости от прочитанного значения, производится то лил иное действие. То есть, если тебе надо прочесть 3 бита - то ты и прочтешь именно 3. Не надо никаких границ...
 К началу страницы 
+ Ответить 
Client
сообщение 1.04.2011 15:38
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


побитно? т.е. сначала считал байт и разбил его или прям побитно? по-моему меньше байта нельзя прочитать

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

Этот момент я не пойму как разобрать

Сообщение отредактировано: Client - 1.04.2011 15:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 1.04.2011 16:21
Сообщение #8


Гость






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

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

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

Нет, будет 100101.
 К началу страницы 
+ Ответить 
Client
сообщение 1.04.2011 16:52
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Нет, будет 100101
хм, а как получил?
я взял 4-й бит и добавил к трем предыдущим и получилось 101+1 = 1011.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-TarasBer-
сообщение 1.04.2011 20:16
Сообщение #10


Гость






А, ты про это.

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

(я просто подумал, что ты взял начало следующего байта, и взял то, что начинается с 4 бита, короче, проехали)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 13:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"