2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Кодирование, С, EOF
Сообщение15.05.2015, 22:08 
Добрый день, уважаемые участники форума!
У меня возникает техническая проблема при реализации алгоритма Хаффмана на С

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

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:14 
Код, код, код.

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:20 
Deleted.

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:23 
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 
А зачем во второй функции параметр out?

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:41 
у второй функции параметр out, потому что она недоделана

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:42 
Функции чтения символа (getc, fgetc etc.) возвращают значение типа int в диапазоне -1...255.
Если это -1, то конец файла, иначе можно это значение преобразовывать в char (с диапазоном -128...127), включая символ с кодом 0xff, который станет char(-1).

(Оффтоп)

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


(Оффтоп)

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:43 
А, кстати, разве вместо
Используется синтаксис C
fprintf(out, "%c", c);
не должно быть
Используется синтаксис C
fprintf(out, "%c", &c);
?

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

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 22:49 
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 
arseniiv, нет это для scanf нужен адрес

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

-- 15.05.2015, 23:15 --

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

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:15 
shukshin, вы зря не привели ещё код открытия файлов. Может, вы out открываете для чтения? (Мало ли, все мы иногда копипастим.)

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:25 
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 
shukshin в сообщении #1015772 писал(а):
а я могу в файл с помощью той функции вывести еще что-то запретное?
Что вы имеете в виду под запретным?

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:27 
venco
что мешает чтению из этого файла?

 
 
 
 Re: Кодирование, С, EOF
Сообщение15.05.2015, 23:32 
Добавьте модификатор "b" в вызове fopen(). Иначе у вас библиотека кучу ненужных преобразований сделает.

 
 
 [ Сообщений: 18 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group