Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
#1

Последовательная запись массива в .gz архив - C++

16.08.2010, 21:37. Просмотров 3579. Ответов 29
Метки нет (Все метки)

Имеется спосок товаров ввиде массива. Элементы массива перебираю в цикле for и далее необходимо сразу записывать в gzip архив. Нашел вродебы подходящую функцию в библиотеке zlib, к сожалению в инете и здесь на форуме примеров вообще нет, есть только простое описание:
int gzwrite (gzFile file, const voidp buf, unsigned len);
Записывает переданное количество байт несжатых данных в компресованный файл.
Функция gzwrite возвращает реальное количество байт несжатых данных, которое было записано в файл. (0 в случае ошибки).
При этом про установку степени сжатия также ничего не нашел..

Вот мой код записи массива в архив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "zlib.h"
int main()
{
  gzFile zfp;
  int len;
  zfp = gzopen("myfile.gz","wb");
 
  // Загружаем и обрабатываем массив из базы
 
  for (std::map<int, std::string>::iterator It = Tov.begin(); It != Tov.end(); ++It) { // Перебираем массив
      l = strlen((const char*)It->second); // Вычисляем длину элемента
      gzwrite(zfp,It->second,len); // Записываем в архив "myfile.gz"
      //gzwrite(zfp,"aaa ",4);
  }
}
Проблемы:
1. Не получается посчитать длину элемента, вроде как требует преобразование string в char
2. При компиляции выводит ошибки:
1>test.obj : error LNK2019: ссылка на неразрешенный внешний символ _gzwrite в функции _main
1>test.obj : error LNK2019: ссылка на неразрешенный внешний символ _gzopen в функции _main
Подскажите кто работал с данной библиотекой, как сделать правильно или есть ли больее правильный способ?
Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2010, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Последовательная запись массива в .gz архив (C++):

последовательная обработка символов - C++
В тексте первый символ каждого слова - цифра, указывающая длину этого слова. Проверить правильность указания длины слов. На экран вывести...

Последовательная арифметика в файлах - C++
Помогите пожалуйста ещё с одной задачкой на файлы: Дан файл вещественных чисел. Заменить в файле каждый элемент, кроме начального и...

Последовательная обработка символов - C++
Дана строка символов. Признак конца - символ '\n' ( перевод строки). Проверить, есть ли одинаковые соседние символы

Удаление из одного массива элементов второго массива и запись результата в третий - C++
Есть массив masA (длина lenA), есть массив masB (длина lenB). Необходимо из массива masA удалить элементы, входящие в массив masB и...

Запись элементов массива структурного типа.Из старого массива- в новый - C++
Здравствуйте.Возможно, в названии темы не совсем понятно &quot;чего я хочу&quot;, поэтому напишу задание: &quot;1.Сформировать динамический массив...

запись массива в строку - считывание массива из строки. - C++
Под unix на си(не с++). Посоветуйте, как можно реализовать(меня интересуют функции, которые можно использовать для этого)): Есть...

29
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.08.2010, 21:45 #2
чтобы из std::string получить указатель на char следует пользоваться функцией c_str(). чтобы вычислить длину std::string, надо пользоваться функцией size();
C++
1
2
3
std::string str = "abc";
size_t len = str.size();
gzwrite(zfp, str.c_str(), len);
ошибки указывают скорее всего на то, что вы не подключили саму библиотеку к проекту.
1
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.08.2010, 12:43 #3
При этом про установку степени сжатия также ничего не нашел.
http://www.gzip.org/zlib/manual.html

Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h". (See the description of deflateInit2 for more information about the strategy parameter.)
1
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
23.08.2010, 17:29  [ТС] #4
Помогите собрать эту библиотеку. Я нашел:
Необходимо выполнить: make -f win32/Makefile.bor. После этого соберется библиотека zlib.lib, которую необходимо закинуть в папку с проектом
Как выполнить эту команду в VS2010?
Makefile.bor у меня находится здесь: C:/zlib/win32/Makefile.bor и в самой студии: D:/Microsoft Visual Studio/VC/include/win32/Makefile.bor
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
23.08.2010, 17:35 #5
Union, а в папке с исходниками нету файла make?
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
23.08.2010, 17:37 #6
Цитата Сообщение от Union Посмотреть сообщение
Как выполнить эту команду в VS2010?
Makefile.bor у меня находится здесь: C:/zlib/win32/Makefile.bor и в самой студии: D:/Microsoft Visual Studio/VC/include/win32/Makefile.bor
Бинарники утилиты make (в т.ч. под платформу Win32)
Makefile.bor - это скрипт, к-рый описывает как и чего компилить и с чем линковать.
0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.08.2010, 15:49  [ТС] #7
Установил make в директорию C:\GnuWin32
zlib находится в директории C:\zlib
Прописываю строки попорядку:
1. cd C:\zlib\
2. C:\GnuWin32\bin\make.exe -f win32/Makefile.bor
Он мне выдаёт:
del zlib.lib
Не удается найти C:\zlib\zlib.lib
tlib zlib.lib +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.
obj+gzread.obj
process_begin: CreateProcess(NULL, tlib zlib.lib +adler32.obj+compress.obj+crc32
.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj, ...) failed.
make (e=2): ═х єфрхЄё* эрщЄш єърчрээ√щ Їрщы.
make: *** [zlib.lib] ╬°шсър 2
Что я делаю не так? zlib.lib нигде не появился...

В папке zlib ещё есть файл make_vms.com. Попробовал выполнить make через него, но коммандная строка зависла
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
24.08.2010, 22:03 #8
Makefile.bor в студию.
0
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 00:55  [ТС] #9
Залил отдельно: http://avangard-komi.ru/Makefile.bor

Вообще Zlib я качал отсюда http://zlib.net/, там в архиве все файлы включая win32/Makefile.bor
если нужно, могу тоже поотдельности залить.
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
25.08.2010, 01:17 #10
Знач так.
1. Страница либы:
http://www.winimage.com/zLibDll/index.html
2. Там находим ссылку для скачивания для Win32 платформы:
http://www.winimage.com/zLibDll/zlib125dll.zip - прямая ссылка.
3. Внимаем комментарию о определении в файле макроса перед инклудом:
Make sure to define ZLIB_WINAPI before including zlib.h. Read contrib\vstudio\readme.txt file whithin zlib123.zip for more information
C++
1
2
#define ZLIB_WINAPI
#include <zlib.h>
4. Используем либо статик версию библиотеки - ок. 600 кб. Или обычную, для неё нужна так же DLLка из соотв. директории.
Не забываем, что разрядность ОС должна совпадать с разрядностью библиотеки - 32 бита или 64.
По самой первой ссылке находим так же архив с хедером (zlib.h):
http://sourceforge.net/projects/libp...ar.gz/download
Он должен быть той же версии, что и скомпилированные lib/dll файлы.

Будут вопросы - пиши. Всё получиться - пиши тоже
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.08.2010, 02:22 #11
кто-то вменяемый, объясните мне глупцу, вы что специально код усложняете?!
вся задача решается 10ью строками кода(или около того), при использовании boost::iostreams::ofstream в паре с boost::iostreams::zlib_compressor для компрессии(декомпрессии) потока данных, и boost::serialization для сериализации(десериализации) в стандартные плюсовые типы.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.08.2010, 02:52 #12
niXman, Скорее люди не любят пользоваться Boost постольку поскольку это не стандартная библиотека и без нее во многих вопросах вполне можно обойтись
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.08.2010, 03:00 #13
Цитата Сообщение от Lavroff Посмотреть сообщение
постольку поскольку это не стандартная библиотека
а всякие злибы, и оберткини на ним, и корявые самописные велосипеды, это стандартное?
и еще: в с++0х, почти все, перешло из boost. но самым верхом торжества будет момент, когда наконец-то в стандарт войдет asio.

...нестандартное..хм
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.08.2010, 03:03 #14
niXman, Нет всякие злибы и иже с ним конечно не стандартное) Но видимо с бустом тяжело разбираться) Я себе как-то ставил так и стоит до сих пор. Не пришлось еще пользоваться
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.08.2010, 03:07 #15
кстати, boost.serialization тоже на рассмотрении по включению в стандарт. а то уже тошно смотреть, как коряво кодеры пишут/читают в/из фалов стандартные типы.

Добавлено через 3 минуты
Lavroff, одно дело, что не получается разобраться. для этого есть форумы. да, по бусту, до сих пор нет бумажных книжек, ни одной(boost.graph не в счет ), это дико удивляет. но ничего, все как-то изучают его и без книжек.
лично я, не представляю, как можно писать что-то серьезное без boost
у меня это первая либа, используемая во всех проектах. как на работе, так и дома.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2010, 03:07
Привет! Вот еще темы с ответами:

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

Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним и т.д. - C++
Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним...

Последовательная запись чисел - C#
У меня такой вопрос: как записать в файл шестнадцатеричные числа, чтобы запись была не символов, а чисел. То есть при открытии в блокноте...

Последовательная запись и хранение 4-х байт информации - Программируемая логика
Имеется логическая схема, у которой на выходе 8 бит (т.е. просто 8 ножек, которые принимают то или иное логическое значение). Нужна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
25.08.2010, 03:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru