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

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

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

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

16.08.2010, 21:37. Просмотров 3489. Ответов 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
Подскажите кто работал с данной библиотекой, как сделать правильно или есть ли больее правильный способ?
Всем спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2010, 21:37     Последовательная запись массива в .gz архив
Посмотрите здесь:
Последовательная обработка символов C++
C++ последовательная обработка символов
Последовательная арифметика в файлах C++
C++ Удаление из одного массива элементов второго массива и запись результата в третий
C++ Запись элементов массива структурного типа.Из старого массива- в новый
C++ запись массива в строку - считывание массива из строки.
C++ Системное программирование. Последовательная обработка файлов с использованием отображения в память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
23.08.2010, 17:35     Последовательная запись массива в .gz архив #5
Union, а в папке с исходниками нету файла make?
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
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
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
24.08.2010, 22:03     Последовательная запись массива в .gz архив #8
Makefile.bor в студию.
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
Эксперт С++
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++
3134 / 1446 / 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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.08.2010, 02:52     Последовательная запись массива в .gz архив #12
niXman, Скорее люди не любят пользоваться Boost постольку поскольку это не стандартная библиотека и без нее во многих вопросах вполне можно обойтись
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.08.2010, 03:00     Последовательная запись массива в .gz архив #13
Цитата Сообщение от Lavroff Посмотреть сообщение
постольку поскольку это не стандартная библиотека
а всякие злибы, и оберткини на ним, и корявые самописные велосипеды, это стандартное?
и еще: в с++0х, почти все, перешло из boost. но самым верхом торжества будет момент, когда наконец-то в стандарт войдет asio.

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

Добавлено через 3 минуты
Lavroff, одно дело, что не получается разобраться. для этого есть форумы. да, по бусту, до сих пор нет бумажных книжек, ни одной(boost.graph не в счет ), это дико удивляет. но ничего, все как-то изучают его и без книжек.
лично я, не представляю, как можно писать что-то серьезное без boost
у меня это первая либа, используемая во всех проектах. как на работе, так и дома.
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
Эксперт С++
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
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
Эксперт С++
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
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:34  [ТС]     Последовательная запись массива в .gz архив #20
Andrew_Lvov вот уже ищу в долбаном русском интерфейсе где что находится
Yandex
Объявления
25.08.2010, 16:34     Последовательная запись массива в .gz архив
Ответ Создать тему
Опции темы

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