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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
16.08.2010, 21:37     Последовательная запись массива в .gz архив #1
Имеется спосок товаров ввиде массива. Элементы массива перебираю в цикле 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
Подскажите кто работал с данной библиотекой, как сделать правильно или есть ли больее правильный способ?
Всем спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2010, 21:37     Последовательная запись массива в .gz архив
Посмотрите здесь:

Последовательная арифметика в файлах C++
C++ последовательная обработка символов
Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним и т.д. C++
C++ Запись массива в файл.
C++ запись массива в строку - считывание массива из строки.
C++ Запись массива в файл
запись массива в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.08.2010, 21:45     Последовательная запись массива в .gz архив #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);
ошибки указывают скорее всего на то, что вы не подключили саму библиотеку к проекту.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
17.08.2010, 12:43     Последовательная запись массива в .gz архив #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.)
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
23.08.2010, 17:29  [ТС]     Последовательная запись массива в .gz архив #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
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.08.2010, 17:35     Последовательная запись массива в .gz архив #5
Union, а в папке с исходниками нету файла make?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
23.08.2010, 17:37     Последовательная запись массива в .gz архив #6
Цитата Сообщение от Union Посмотреть сообщение
Как выполнить эту команду в VS2010?
Makefile.bor у меня находится здесь: C:/zlib/win32/Makefile.bor и в самой студии: D:/Microsoft Visual Studio/VC/include/win32/Makefile.bor
Бинарники утилиты make (в т.ч. под платформу Win32)
Makefile.bor - это скрипт, к-рый описывает как и чего компилить и с чем линковать.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.08.2010, 15:49  [ТС]     Последовательная запись массива в .gz архив #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 через него, но коммандная строка зависла
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
24.08.2010, 22:03     Последовательная запись массива в .gz архив #8
Makefile.bor в студию.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 00:55  [ТС]     Последовательная запись массива в .gz архив #9
Залил отдельно: http://avangard-komi.ru/Makefile.bor

Вообще Zlib я качал отсюда http://zlib.net/, там в архиве все файлы включая win32/Makefile.bor
если нужно, могу тоже поотдельности залить.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 01:17     Последовательная запись массива в .gz архив #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 файлы.

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

...нестандартное..хм
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7934 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.08.2010, 03:03     Последовательная запись массива в .gz архив #14
niXman, Нет всякие злибы и иже с ним конечно не стандартное) Но видимо с бустом тяжело разбираться) Я себе как-то ставил так и стоит до сих пор. Не пришлось еще пользоваться
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.08.2010, 03:07     Последовательная запись массива в .gz архив #15
кстати, boost.serialization тоже на рассмотрении по включению в стандарт. а то уже тошно смотреть, как коряво кодеры пишут/читают в/из фалов стандартные типы.

Добавлено через 3 минуты
Lavroff, одно дело, что не получается разобраться. для этого есть форумы. да, по бусту, до сих пор нет бумажных книжек, ни одной(boost.graph не в счет ), это дико удивляет. но ничего, все как-то изучают его и без книжек.
лично я, не представляю, как можно писать что-то серьезное без boost
у меня это первая либа, используемая во всех проектах. как на работе, так и дома.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:05  [ТС]     Последовательная запись массива в .gz архив #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#define ZLIB_WINAPI
#include <zlib.h>
 
int main()
{
   int i=0;
   gzFile zfp; // Указатель на файл
   zfp = gzopen("myfile.gz","wb9"); // Открываем файл, устанавлиаем степень сжатия 9
   for (i=0;i<20;i++){ // 20 повторяем
    gzwrite(zfp,"1234 ",5); // записываем в zfp строку "1234  " длиной 5 символов
   }
   gzclose(zfp); // Закрываем файл
   return 0;
}
Из первого архива взял файл static32/zlibstat.lib - винда 32 бита
Из архива, ссылкой выше взял zlib.h, zconf.h ну и + распаковал его полностью в Microsoft Visual Studio\VC\include
Папка с проектом выглядит вот так: http://s002.***********/i200/1008/87/650ed0ca8ceb.jpg

При компиляции:
1>------ Перестроение всех файлов начато: проект: zlibpr, Конфигурация: Debug Win32 ------
1>Построение начато 25.08.2010 16:00:44.
1>_PrepareForClean:
1> Файл "Debug\zlibpr.lastbuildstate" удаляется.
1>InitializeBuildStatus:
1> Обращение к "Debug\zlibpr.unsuccessfulbuild".
1>ClCompile:
1> zlibpr.cpp
1> stdafx.cpp
1> Создание кода...
1>zlibpr.obj : error LNK2019: ссылка на неразрешенный внешний символ _gzclose@4 в функции _main
1>zlibpr.obj : error LNK2019: ссылка на неразрешенный внешний символ _gzwrite@12 в функции _main
1>zlibpr.obj : error LNK2019: ссылка на неразрешенный внешний символ _gzopen@8 в функции _main
1>d:\мои документы\visual studio 2010\Projects\zlibpr\Debug\zlibpr.exe : fatal error LNK1120: 3 неразрешенных внешних элементов
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:01.79
========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========
Данные функции описаны здесь: http://zlib.net.ru/

В общем что-то не так сделал...


niXman, да у меня проблемы с подключением zlib'ы, с бустом думаю будет ещё запарнее
Для пшп в инете дофига русских сайтов-каталогов с подробным описанием функций и примерами. У си есть только этот форум + .com, на которых есть далеко не всё и невсегда всё понятно начинающему.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 16:14     Последовательная запись массива в .gz архив #17
Цитата Сообщение от Union Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#define ZLIB_WINAPI
#include <zlib.h>
 
int main()
{
   int i=0;
   gzFile zfp; // Указатель на файл
   zfp = gzopen("myfile.gz","wb9"); // Открываем файл, устанавлиаем степень сжатия 9
   for (i=0;i<20;i++){ // 20 повторяем
    gzwrite(zfp,"1234 ",5); // записываем в zfp строку "1234  " длиной 5 символов
   }
   gzclose(zfp); // Закрываем файл
   return 0;
}
Из первого архива взял файл static32/zlibstat.lib - винда 32 бита
Из архива, ссылкой выше взял zlib.h, zconf.h ну и + распаковал его полностью в Microsoft Visual Studio\VC\include
Папка с проектом выглядит вот так: http://s002.***********/i200/1008/87/650ed0ca8ceb.jpg

При компиляции:

Данные функции описаны здесь: http://zlib.net.ru/

В общем что-то не так сделал...
В проекте подлинкуй библиотеку:
Project->Options->Linker->Additional dependencies:
zlibstat.lib

либо в коде допиши
C++
1
#pragma comment( lib, "zlibstat" )
Второй вариант работает только для майкрософтовского компилятора (читай - только в вижуал студии).
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:25  [ТС]     Последовательная запись массива в .gz архив #18
Добавил: #pragma comment( lib, "zlibstat" )

1>libcmt.lib(crt0dat.obj) : error LNK2005: __initterm_e уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(crt0dat.obj) : error LNK2005: _exit уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(crt0dat.obj) : error LNK2005: __exit уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(crt0dat.obj) : error LNK2005: __cexit уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(crt0dat.obj) : error LNK2005: __amsg_exit уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_a уже определен в MSVCRTD.lib(cinitexe.obj)
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_z уже определен в MSVCRTD.lib(cinitexe.obj)
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_a уже определен в MSVCRTD.lib(cinitexe.obj)
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_z уже определен в MSVCRTD.lib(cinitexe.obj)
1>libcmt.lib(crt0.obj) : error LNK2005: _mainCRTStartup уже определен в MSVCRTD.lib(crtexe.obj)
1>libcmt.lib(errmode.obj) : error LNK2005: ___set_app_type уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(mlock.obj) : error LNK2005: __unlock уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(mlock.obj) : error LNK2005: __lock уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(winxfltr.obj) : error LNK2005: __XcptFilter уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>libcmt.lib(setlocal.obj) : error LNK2005: __configthreadlocale уже определен в MSVCRTD.lib(MSVCR100D.dll)
1>LINK : warning LNK4098: библиотека по умолчанию "MSVCRTD" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: библиотека по умолчанию "libcmt.lib" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
1>d:\мои документы\visual studio 2010\Projects\zlibpr\Debug\zlibpr.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>
1>СБОЙ построения.
вообще не пойму, яж не подключал libcmt.lib и MSVCRTD.lib, откуда они взялись?
Прописал вот это:
C++
1
2
#pragma comment(linker, "/NODEFAULTLIB:MSVCRTD.lib") 
#pragma comment(linker, "/NODEFAULTLIB:libcmt.lib")
Ошибок стало ещё больше
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 16:32     Последовательная запись массива в .gz архив #19
Цитата Сообщение от Union Посмотреть сообщение
Не пойму, яж такие не подключал, откуда они взялись?
По-умолчанию, в проекте есть уже подключённые стандартные библиотеки винды.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2010, 16:34     Последовательная запись массива в .gz архив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:34  [ТС]     Последовательная запись массива в .gz архив #20
Andrew_Lvov вот уже ищу в долбаном русском интерфейсе где что находится
Yandex
Объявления
25.08.2010, 16:34     Последовательная запись массива в .gz архив
Ответ Создать тему
Опции темы

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