чтение сжатого файла Gzread с использованием struct c ++

0

Как читать данные в сжатом формате структуры в c++?

вот структура данных..

struct test
{
    unsigned int test3;
    unsigned char test1[4096];
    unsigned int test2;
} foo;

Как мы читаем структуру, записанную в файл с помощью gzread?

Вот что я пробовал.

gzread(Handle,&foo.test3, sizeof(&foo.test3)); //64
gzread(Handle,&foo.test1, sizeof(&foo.test1)); //4096
gzread(Handle,&foo.test2,sizeof(&foo.test2)); //4

Однако данные, которые я получаю, ошибочны. Какая ошибка я делаю?

Пример того, как читать файл, сохраненный в формате struct, поможет мне это сделать.

  • 1
    Размер указателя будет размером указателя, а не тем, на который он указывает.
  • 0
    и это будет 64, 4096 и 4 в моем случае. что-то еще я делаю не так?
Показать ещё 1 комментарий
Теги:
data-structures
gz

1 ответ

1
Лучший ответ

Когда вы делаете &foo.test1 вы получаете указатель, и когда вы используете sizeof на этом указателе, вы получаете размер указателя, а не то, на что он указывает. Это будет, в зависимости от платформы, либо 4 (для 32-разрядных платформ), либо 8 (для 64-разрядных платформ).

Чтобы код работал, вы должны отказаться от использования & операнда для операций sizeof:

gzread(Handle, &foo.test3, sizeof(foo.test3));
gzread(Handle, &foo.test1, sizeof(foo.test1));
gzread(Handle, &foo.test2, sizeof(foo.test2));

Однако это может быть и не так! Что, если файл был написан с другим заказом? Или, если полная структура была написана за один раз, возможное дополнение и все? Вам нужно прочитать его точно так, как было написано.

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

  • 0
    или 2 байта (16-битные платформы) или ...
  • 0
    Полная структура была написана за один раз!
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню