Member
Статус: Не в сети Регистрация: 02.06.2005 Откуда: Khabarovsk
Не могу понять, как считать файл в двоичном режиме со всеми спец символами (перевод каретки, возврат строки ...). Пытаюсь использовать для этого fread(*buf, nsize, n), но в buf оказывается какая-то фигня. Читаю от начала файла до (!feof). Подскажите, как реализовать? И вообще я не до конца понимаю нужно кодировать двоичные цепочки или шестнадцатиричные? Почему-то мне кажется что шеснадцетеричные.
Как я понял в RLE алгоритме последовательно идущие одинаковые байты заменяются на связку префикс + количество + повторяющейся байт. Что такое префикс?
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
spmn писал(а):
Как я понял в RLE алгоритме последовательно идущие одинаковые байты заменяются на связку префикс + количество + повторяющейся байт. Что такое префикс
Если мне не изменяет память (ой как давно я с этим работал) то пакуется это примерно так.
АББББССДЕЕФ***
берется управляющий символ, скажем звездочка *
при упаковка имеем
А*4Б*2СД*2ЕФ*3**
если встречается такой же символ как выбранный нами управляющий символ , то он просто повторяется дважды.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
spmn писал(а):
цепочек длинной <= 3 нецелесообразно?
Да, потому этот алгоритм чаще всего применяет в графике так как там часто идут повторяющиеся цвета.
spmn писал(а):
То есть, при распакове последнюю последовательность ** надо просто выбросить?
Нет ты не понял. Вот начинаеш ты разбирать уже упакованный текст.
Читаеш первый символ - управляющий?
Да - читаем следующий, опять управляющий? Значить это просто был символ иначе получили кол-во повторений и сразу читаем следующий символ - он и есть наше повторение.
Я немного ошибся тами с упаковкой должно быть так
А*4Б*2СД*2ЕФ*3* - тоесть управляющий символ если он повторяется то просто записывается после его кол-во повторений , но если исходник был таким
АББББССДЕЕФ*, то в реузльтате мы получим вот это
А*4Б*2СД*2ЕФ**
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
С какими? С чтением из файла? Ну так тут уж прочти документацию, особенно то место где описывается работа с файлами Чтобы работать не как с текстовым файлом, надо открывать так
fopen(szFilename,"wb")) - это на запись b означает , что файл будет бинарным.
Member
Статус: Не в сети Регистрация: 02.06.2005 Откуда: Khabarovsk
Нет, с fread() я разобрался, а вот например:
я объявляю переменную char buf[1], потом считываю в нее
fread(buf,sizeof(buf), 1, file). То есть считываю один символ. Файл открыт как "rb". Например из текстового файла букву "П", а к ней прилипает последовательность \bZ2XD‰ , то есть buf = "П\bZ2XD‰". Что это?
И еще. Я думаю что те же буквы представляются набором восьми бит. Например: a - 00110011, то есть сжимать мне надо именно битовые последовательности или сами буквы? Если битовые, то как их получить ???
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
spmn эта "последовательность" - обычный мусор. Дело в том, что объявления char [] отладчик тракутует как строки, и пытается показывать их до терменирующего нуля. Правильнее было объявить char buf;
Битовые последовательности получить можно с помощью маски. например (buf >> n) & 0x1 ты получишь бит номер n. n естественно от 0 (младший бит) до 7 (старший)
Но побитовое RLE сжатие скорее всего не оправдано. Сжимай побайтно.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
spmn писал(а):
Например: a - 00110011, то есть сжимать мне надо именно битовые последовательности или сами буквы? Если битовые, то как их получить ?
RLE не для битовый последовательностей. Для этого есть куча других алгоритмов. Да и если тебе надо что-то сжимать почему бы не взять уже готовые библиотеки?
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
spmn писал(а):
Не работает маска :oops
Что значит не работает? Ты как ее проверяеш то? Это же простейшая двоичная арифметика.
if ((buf & (1 << 1))==1) {
бит 2 равен 1
}
if ((buf & (1 << 2))==1) {
бит 3 равен 1
}
Добавлено спустя 1 минуту, 31 секунду: Также как и
(buf >> n) & 0x1
вместо n пишеш какой бит проверить
if ((buf >> 1) & 0x1) {
бит 2 равен 1
}
Member
Статус: Не в сети Регистрация: 02.06.2005 Откуда: Khabarovsk
Ray Adams писал(а):
(buf >> n) & 0x1
В этом участке и ругается.
Еще вопросик.
Я пытаюсь записать в файл число повторений. Пишу так:
short *i;
i = new short; // i - счетчик повторений.
i++;
fwrite(&i, sizeof(short), 1, out). А в файл попадает какая то фигня вместо цифр. Как с этим бороться? Может я что не правельно указываю ???
Member
Статус: Не в сети Регистрация: 02.06.2005 Откуда: Khabarovsk
Ray Adams
Ray Adams писал(а):
Может все таки сядеш наконец за документацию по C++?
Я бы сел, мне не влом ... только нет у меня ее. Ни одной книги по с++ нет А в help'e borlanda описание ф-ии fwrite() не совсем понятное. Вернее оно понятное, только не для моего случая. Там написанно, что туда надо передать указатель, в примере используется структура.
На форуме ixbt я видел, что записывали массив double и выглядело это так:
Код:
fwrite(&array[i], sizeof(double), 1, ou)
По всей видимости этот массив объявлен как не динамический. У меня также объявлен счетчик повторений сиволов:
Код:
short int i = 1; ... fwrite(&i, sizeof(short int), 1, ou); ...
В итоге в файл вместо цифры попадает что-то отдаленно напоминающее мягкий знак. Пробовал по-другому:
Код:
short int *i; i = new short int; *i=1; ... fwrite(i, sizeof(short int), 1, ou) ...
Результат тот же. Был еще вариант:
Код:
short int *i; i = new short int; *i=1; ... fwrite(&i, sizeof(short int), 1, ou) ...
Тогда в файл попадает какой-то символ, напоминающий букву А.
Может кто подскажет как мне оргонизовать ввод числа в файл средствами fwrite() ???
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
мдя.... Ладно давай по порядку. Если ты пишешь число как short int, long и т.д. то туда пишется не понятное человеческому глазу число, а то, как оно есть. Причем старший и младший байт поменяны местами (т.н. Little Endian).
Отсюда вывод.
short int i =1;
fwrite(&i, sizeof(short int),1,ou) работает нормально записав в файл шестнадцатиричную последовательность 0100.
Если ты хочешь увидеть число 1, то пиши так
fprintf(ou,"%i",i).
По поводу документации. А что, поисковые машины на слова "C++ руководство программиста" возвращают пусто?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения