2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Кодирование, С, EOF
Сообщение15.05.2015, 22:08 


20/10/12
235
Добрый день, уважаемые участники форума!
У меня возникает техническая проблема при реализации алгоритма Хаффмана на С

Итак, я использую обычный алгоритм Хаффмана для всех значений char 0..255.

Строю дерево, кодирую, пакую это все дело в файл и тут проблема ... в результате упаковки
(дерева или исходного сообщения) может возникнуть комбинация 11111111 в одном из байтов сообщения, которая трактуется, как EOF.
Файл это портит :-(
я по байтам пишу в файл сообщение: может запаковывать как-то по-другому?

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:14 
Заслуженный участник


27/04/09
28128
Код, код, код.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:20 
Заслуженный участник


20/08/14
11177
Россия, Москва
Deleted.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:23 


20/10/12
235
arseniiv
реализация не очень, сразу предупреждаю,
представьте, что на каком-то этапе у меня получилась обычная строчка с 1 и 0
(да, да "101010101010011", нулями в нужном количестве все дополнено)
в битовую я ее превращаю так:
Код:
void PackBitString(char *message, FILE *out)
{
   int i, j;
   char c;

   for(i = 0; i < (int)strlen(message); i += 8)
   {
        for(c = 0, j = 0; j < 8; ++j)
      {
         c *= 2;
         c += message[i + j] - '0';
      }
      fprintf(out, "%c", c);
   }
}


Считать обратно в строчку пытаюсь так:
Код:
void HuffmanDecode(FILE *in, FILE *out)
{
   int size = 8;
   char c, *s = (char *)malloc(size);

   while(!feof(in))
   {
      sPrintCharBits((char)fgetc(in), s);
      size += 8;
      s = (char *)realloc(s, size);
   }   
        s = (char *)realloc(s, size + 1);
   s[size] = 0;

   printf("\nGet: %s\n", s);
}

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:34 
Заслуженный участник


27/04/09
28128
А зачем во второй функции параметр out?

И неужели так нужно хранить по двоичной цифре на char?

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:41 


20/10/12
235
у второй функции параметр out, потому что она недоделана

по двоичной цифре на char так себе экономия, но так уж получилось, смысл-то не меняется (даже если я сменю реализацию) - я вписываю в файл последовательность бит.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:42 
Заслуженный участник


04/05/09
4582
Функции чтения символа (getc, fgetc etc.) возвращают значение типа int в диапазоне -1...255.
Если это -1, то конец файла, иначе можно это значение преобразовывать в char (с диапазоном -128...127), включая символ с кодом 0xff, который станет char(-1).

(Оффтоп)

На самом деле тип char может быть и беззнаковый, но это неважно.


(Оффтоп)

А код действительно ужасный.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:43 
Заслуженный участник


27/04/09
28128
А, кстати, разве вместо
Используется синтаксис C
fprintf(out, "%c", c);
не должно быть
Используется синтаксис C
fprintf(out, "%c", &c);
?

-- Сб май 16, 2015 00:44:07 --

Но вообще так и не понял, как можно записью какого угодно символа в файл сделать в нём EOF.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:49 
Заслуженный участник


04/05/09
4582
arseniiv в сообщении #1015762 писал(а):
А, кстати, разве вместо
Используется синтаксис C
fprintf(out, "%c", c);
не должно быть
Используется синтаксис C
fprintf(out, "%c", &c);
?
Нет, адреса нужны только при чтении.

arseniiv в сообщении #1015762 писал(а):
Но вообще так и не понял, как можно записью какого угодно символа в файл сделать в нём EOF.
Проблема с EOF обычно при чтении, т.к. новички, не думая, сразу присваивают результат вызова fgetc() переменной типа char, и тут то различие между EOF и '\xff' сразу теряется.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:51 


20/10/12
235
arseniiv, нет это для scanf нужен адрес

как можно записью какого угодно символа в файл сделать в нём EOF? Ну я смог :-)

-- 15.05.2015, 23:15 --

arseniiv
venco,
а я могу в файл с помощью той функции вывести еще что-то запретное?

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:15 
Заслуженный участник


27/04/09
28128
shukshin, вы зря не привели ещё код открытия файлов. Может, вы out открываете для чтения? (Мало ли, все мы иногда копипастим.)

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:25 


20/10/12
235
arseniiv
Код:
int main(void)
{
   FILE *in = fopen("in.txt", "r"), *out = fopen("out.txt", "w");

   HuffmanEncode(in, out);
    fclose(in);

   in = fopen("out.txt", "r");
   out = fopen("decoded.txt", "w");

    HuffmanDecode(in, out);

    fclose(in);
   fclose(out);

   _CrtDumpMemoryLeaks();
   return 0;
}


вот "битовая" строка на которой это не работает

код: [ скачать ] [ спрятать ]
  1. 00000000000000000000100111111111101100101101110000010111011110110111100101101010010110110010110101100 
  2. 101110011101100100010010100011010001101011011101101000010011010010001011110001001000100101111100100100000001 
  3. 100000100101101000100101010001100000011011111110110110001101100111001100011101100000111011111100010000011110 
  4. 000011001100111100001100011011011110010000111001101101011000011100001110101110101110001100100010101111000111 
  5. 001110001011010111000001010000001010000111001111000011101100111101100000101010010101010001010001001111101011 
  6. 100001010111111001011100110110110100101100001111100111010001010111110110011100000010010111110001011000001000 
  7. 111111000111100110000101011011001111011001001001010111000110000100000001100000000010000101110000010001110111 
  8. 100000001111001011111001000101000100111100111101001011000111000100111001011101011001011100111000010011111110 
  9. 011111001110111000100010111110101111011011111000111010100000110010101001100110101100110010110011000100100101 
  10. 001000001011100111110110110000011010010110110110100110101001110101000001101010111101010100110101101001111110 
  11. 011111110000101000010100111101001111110101000011111111101110001110111011111111000100001110111101111011111111 
  12. 000101011010100110001011100101001111011101000000111110111110001010100001010100111001101000100001100111001111 
  13. 000111010011101010101011101011001110100000011100000110101111001110000100011100100111100100000000110010001110 
  14. 010000001101110011101110000100001000110001111011011101111011101001111011001111010111010010010011110001010001 
  15. 001010000110100111100011101001101001111000011111000000101001110100110111000000000001010011001001110000111100 
  16. 110011111010001111100001001110111000100000001110101011010101000111010001101010110010100011110011101001111101 
  17. 010000111110001101000110011111001000111101101101001000011001001011000110000000111101010100111001100010001001 
  18. 101101011101011001100000000001101000101000110101000010010011011010001001000111000111000011110100110100101001 
  19. 111010000011100110000110100000100100111011010011111010011001101011100001011101011010101111001100100101011011 
  20. 100110000001010011111001101100011101001001001100111000101000100000010110111111011111111100011101101111101101 
  21. 001111110111010000010111111101000100101101110110111000110010011101110110011001011000110000110100100110110011 
  22. 011001001010011000110010011011110010110000000100011011110010111011001110100110010100010110001110110001001101 
  23. 111011100111001011100010001011101001001001000001100010111011110100101111101100011101110000111000101111011100 
  24. 100001011000100111000100000110001010110000100000000010110000101000010100101101001010111001001001101010101100 
  25. 110000000000000000000000000010110111010011001001100100010000110100101110010011101100000110010011101100000001 
  26. 100100110010001000011010010111001001110110000011001001110110000000110010011001000100001101001011100100111011 
  27. 000001100100111011000000011001001100100010000110100101110010011101100000110010011101100000001100100110010001 
  28. 000011010010111001001110110000011001001110110000000111100110100000100110000100110000100110001110011110111010 
  29. 011101111100011100111101110100111011111001100100110010001000011010010111001001110110000011001001110110000000 
  30. 110010011001000100001101001011100100111011000001100100111011000000011001001100100010000110100101110010011101 
  31. 100000110010011101100000111001111000111011101001111101110011110000111110000011101111111101111101110000011111 
  32. 1110100000111100000 


может я чего-то не знаю об открытии файлов?
строка как строка, должна обрабатываться.
вообще зря я эту здоровую строку приплел сюда, чтение вообще не работает.

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:26 
Заслуженный участник


04/05/09
4582
shukshin в сообщении #1015772 писал(а):
а я могу в файл с помощью той функции вывести еще что-то запретное?
Что вы имеете в виду под запретным?

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:27 


20/10/12
235
venco
что мешает чтению из этого файла?

 Профиль  
                  
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:32 
Заслуженный участник


04/05/09
4582
Добавьте модификатор "b" в вызове fopen(). Иначе у вас библиотека кучу ненужных преобразований сделает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group