Воскресенье, 17 Ноября 2024, 17:33

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Реализация частотного анализатора.
ТехникДата: Суббота, 19 Февраля 2011, 15:41 | Сообщение # 1
Глава X-ray Games
Сейчас нет на сайте
Привет всем!Пишу упаковщик данных, принцип работы таков:проводится частотный анализ,после данные архивируются. С первым возник вопрос: реализую функцию Freq_analys, он открывает файл, считывает из него по одной лексеме(проще говоря слово) и проверяет сколько раз оно встретилось в тексте.Для хранения символов создаю массив чисел от 0 до 255.(int Freq[255];) Собственно его инициализирую нулями, а далее проблема. как стоит считывать информацию: двоичным числом или символом? Как это реализовать?
Я думаю, что так:

Исходник-вырезка, поэтому сильно не ругайте.
BOOMДата: Суббота, 19 Февраля 2011, 16:58 | Сообщение # 2
I am the creator of ADE
Сейчас нет на сайте
Что то мне напомнило метод Хаффмана, как то так (клик в вики, если интересно и не известно). Но, конечно, это не то, что делаешь, но всё ровно...
Quote (Техник)
двоичным числом или символом?

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


______________________________
Я вернулся, и это чудо.
______________________________
froexДата: Воскресенье, 20 Февраля 2011, 10:49 | Сообщение # 3
Руководитель Froexilize team
Сейчас нет на сайте
Техник,
Code

unsigned int freq[255];
char symbol;
FILE * file;
file = fopen("myfile","rb");
while( !feof(file) )
{
    fscanf( fi, "%c", &symbol );
    freq[symbol]++;
}
fclose(fi);

Добавлено (20.02.2011, 10:49)
---------------------------------------------

Quote (Техник)
как стоит считывать информацию: двоичным числом или символом?

Различие в идентификации конца файла. Текстовые файлы заканчиваются символом \0, при открытии файла как бинарного, происходит сравнение его размера и текущего положения курсора.


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


Сообщение отредактировал froex - Воскресенье, 20 Февраля 2011, 13:34
ТехникДата: Воскресенье, 20 Февраля 2011, 13:13 | Сообщение # 4
Глава X-ray Games
Сейчас нет на сайте
Quote (froex)
Различие в идентификации конца файла. Текстовые файлы заканчиваются символов \0, при открытии файла как бинарного, происходит сравнение его размера и текущего положения курсора.

При считывании файла каждый символ сравнивается с константой EOF(равна -1),если символ равен -1, то считывание завершается.
ТехникДата: Воскресенье, 20 Февраля 2011, 13:14 | Сообщение # 5
Глава X-ray Games
Сейчас нет на сайте
В принципе мне выгодно использовать метод Хаффана, так как надо упаковывать данные, а не сжимать их.
froexДата: Воскресенье, 20 Февраля 2011, 13:39 | Сообщение # 6
Руководитель Froexilize team
Сейчас нет на сайте
Quote (Техник)
При считывании файла каждый символ сравнивается с константой EOF(равна -1),если символ равен -1, то считывание завершается.

Ни один символ не имеет значения -1.

Ну и повторюсь:

Quote (froex)
Текстовые файлы заканчиваются символом \0

Добавлено (20.02.2011, 13:39)
---------------------------------------------
Вообще, текстовые файлы, можно сказать, без разницы, как открывать - как текстовый или как бинарный. А вот бинарный как текстовый не желательно, т.к. символ \0 может находится в любом месте файла.


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


Сообщение отредактировал froex - Воскресенье, 20 Февраля 2011, 13:37
BOOMДата: Воскресенье, 20 Февраля 2011, 16:07 | Сообщение # 7
I am the creator of ADE
Сейчас нет на сайте
froex, по моему, это значение возвращается, когда достигнут конец файла (точно не помню).
Техник, лучше запоминать размер, записывая его в виде тридцати двух разрядного числа в начале, просто оставь четыре байта для размера. Впрочем, так поступают многие разработчики.

Для справки, в C++ не так уж много способов, как перевести число в дамп и обратно. Могу подсказать довольно простой способ:
создаёшь союз с дампом на четыре байта и целым числом.

Code
00 union _lIntDamp{
01     char __damp[4];
02     int  __num; //или long.
03 };

потом в функции создаёшь объект _lIniDamp, инициализируешь его через new и пользуешься. Только одно, не забудь его удалить в конце.
Code
... прочтём ...
5A _lIniDamp *d = new _lIniDamp;
5B mf->Read(d->__damp,4); //откуда-то читаем
5C int s = d->__num; //вот наше число.
5D delete d;

... запишем ...
X0 _lIniDamp *d = new _lIniDamp;
X1 d->__num = s;
X2 mf->Write(d->__damp,4); //куда-то записываем...
X3 delete d;

И не забывай удалять! C++ не фильтрует память, созданную с помощью конструкторов, выделяющие память. Если не удалить вовремя, то ПО может вылететь и полететь как фанера над Парижем.


______________________________
Я вернулся, и это чудо.
______________________________
froexДата: Воскресенье, 20 Февраля 2011, 16:28 | Сообщение # 8
Руководитель Froexilize team
Сейчас нет на сайте
Quote (BOOM)
froex, по моему, это значение возвращается, когда достигнут конец файла (точно не помню).

Да, значение как раз возвращается из макроопределения либо из функции определения конца файла. Для корректной обработки конца файла, надо пользоваться именно так. Но никак не обрабатывать символы внутри файла.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг