Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 16:37     Последовательная запись массива в .gz архив #21
Цитата Сообщение от Union Посмотреть сообщение
Добавил: #pragma comment( lib, "zlibstat" )


вообще не пойму, яж не подключал libcmt.lib и MSVCRTD.lib, откуда они взялись?
Прописал вот это:
C++
1
2
#pragma comment(linker, "/NODEFAULTLIB:MSVCRTD.lib") 
#pragma comment(linker, "/NODEFAULTLIB:libcmt.lib")
Ошибок стало ещё больше
Вот эти прагма коммент таки уберите.
НоуДефолтЛиб добавляете согласно инструкции:
http://msdn.microsoft.com/en-us/libr...4a(VS.80).aspx
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:42  [ТС]     Последовательная запись массива в .gz архив #22
Тоже самое, появляются другие ошибки:
1>------ Построение начато: проект: zlibpr, Конфигурация: Debug Win32 ------
1>Построение начато 25.08.2010 16:40:24.
1>InitializeBuildStatus:
1> Обращение к "Debug\zlibpr.unsuccessfulbuild".
1>ClCompile:
1> Для всех выходных данных обновления не требуется.
1>ManifestResourceCompile:
1> Для всех выходных данных обновления не требуется.
1>zlibpr.obj : error LNK2019: ссылка на неразрешенный внешний символ __RTC_CheckEsp в функции _main
1>zlibpr.obj : error LNK2001: неразрешенный внешний символ "__RTC_Shutdown"
1>zlibpr.obj : error LNK2001: неразрешенный внешний символ "__RTC_InitBase"
1>LINK : error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _free в функции _gz_init
1>zlibstat.lib(gzlib.obj) : error LNK2001: неразрешенный внешний символ "_free"
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "_free"
1>zlibstat.lib(zutil.obj) : error LNK2001: неразрешенный внешний символ "_free"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _malloc в функции _gz_init
1>zlibstat.lib(gzlib.obj) : error LNK2001: неразрешенный внешний символ "_malloc"
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "_malloc"
1>zlibstat.lib(zutil.obj) : error LNK2001: неразрешенный внешний символ "_malloc"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _strerror в функции _gz_comp
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "_strerror"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ __errno в функции _gz_comp
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "__errno"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _write в функции _gz_comp
1>OLDNAMES.lib(write.obj) : error LNK2001: неразрешенный внешний символ "_write"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _memset в функции _gz_zero
1>zlibstat.lib(deflate.obj) : error LNK2001: неразрешенный внешний символ "_memset"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _memcpy в функции _gzwrite@12
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "_memcpy"
1>zlibstat.lib(deflate.obj) : error LNK2001: неразрешенный внешний символ "_memcpy"
1>zlibstat.lib(inflate.obj) : error LNK2001: неразрешенный внешний символ "_memcpy"
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ __vsnprintf в функции _gzprintf
1>zlibstat.lib(gzwrite.obj) : error LNK2019: ссылка на неразрешенный внешний символ _close в функции _gzclose_w@4
1>zlibstat.lib(gzread.obj) : error LNK2001: неразрешенный внешний символ "_close"
1>OLDNAMES.lib(close.obj) : error LNK2001: неразрешенный внешний символ "_close"
1>zlibstat.lib(gzlib.obj) : error LNK2019: ссылка на неразрешенный внешний символ _lseek в функции _gzoffset64@4
1>OLDNAMES.lib(lseek.obj) : error LNK2001: неразрешенный внешний символ "_lseek"
1>zlibstat.lib(gzlib.obj) : error LNK2019: ссылка на неразрешенный внешний символ _open в функции _gz_open
1>OLDNAMES.lib(open.obj) : error LNK2001: неразрешенный внешний символ "_open"
1>zlibstat.lib(gzlib.obj) : error LNK2019: ссылка на неразрешенный внешний символ _sprintf в функции _gzdopen@8
1>zlibstat.lib(gzread.obj) : error LNK2019: ссылка на неразрешенный внешний символ _read в функции _gz_load
1>OLDNAMES.lib(read.obj) : error LNK2001: неразрешенный внешний символ "_read"
1>zlibstat.lib(gzread.obj) : error LNK2019: ссылка на неразрешенный внешний символ _memchr в функции _gzgets@12
1>OLDNAMES.lib(write.obj) : error LNK2001: неразрешенный внешний символ "__write"
1>OLDNAMES.lib(close.obj) : error LNK2001: неразрешенный внешний символ "__close"
1>OLDNAMES.lib(lseek.obj) : error LNK2001: неразрешенный внешний символ "__lseek"
1>OLDNAMES.lib(open.obj) : error LNK2001: неразрешенный внешний символ "__open"
1>OLDNAMES.lib(read.obj) : error LNK2001: неразрешенный внешний символ "__read"
1>d:\мои документы\visual studio 2010\Projects\zlibpr\Debug\zlibpr.exe : fatal error LNK1120: 23 неразрешенных внешних элементов
1>
1>СБОЙ построения.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 16:44     Последовательная запись массива в .gz архив #23
Попробуйте NODEFAULTLIB только с одной из тех двух библиотек, потом с другой.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 16:49  [ТС]     Последовательная запись массива в .gz архив #24
Всё, заработало
NODEFAULTLIB MSVCRTD.lib помогло! Andrew_Lvov спасибо Вам огромное!
Я думаю это первый рабочий пример записи в gz на этом форуме
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 16:49     Последовательная запись массива в .gz архив #25
А, блин, да. Попробуй обычную zlib, а не static. То есть из другой директории, перекинь .lib и .dll.
И не забудь в свойствах проекта или в коде исправить линкование zlib.lib вместо zlibstat.lib.

UPD: Ну тогда оставьте выше совет как альтернативный вариант
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
25.08.2010, 17:00  [ТС]     Последовательная запись массива в .gz архив #26
А NODEFAULTLIB:MSVCRTD.lib может впоследствии повлиять на какие-то функции? Выгладит как-то неправильно менять параметры одной библиотеки для другой

а то в моей программе появились такие:
1>pinger.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__atof в функции _main
1>pinger.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__system в функции _main
1>pinger.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp___time64 в функции _time
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
25.08.2010, 17:06     Последовательная запись массива в .gz архив #27
Цитата Сообщение от Union Посмотреть сообщение
А NODEFAULTLIB:MSVCRTD.lib может впоследствии повлиять на какие-то функции?

а то в моей программе появились такие:
Попробуйте zlib.lib+zlib.dll вместо zlibstat.lib.
Там ещё закос может быть из-за того, что либа скомпилирована под мультипоточность, а другие - однопоточные.
Поэтому, в свойствах проекта поищите также настройку компиляции (либо линковки) однопоточную/многопоточную (/MT), поиграйтесь с этим параметром. Неплохо после таких изменений делать полный rebuild.
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
26.06.2011, 22:44     Последовательная запись массива в .gz архив #28
Я нашел функции compress и decompress
А как осуществить decode и encode?

(decode и encode - это сжатие и добавление заголовков, -> получается полноценный архив, а не просто сжатая строка)
gzwrite не подходит, т.к. пишет сразу на винчестер, а мне нужно сохдать в памяти, чтобы потом по сети передать на локальный сервер
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.06.2011, 22:50     Последовательная запись массива в .gz архив #29
Цитата Сообщение от Kadet89 Посмотреть сообщение
не подходит, т.к. пишет сразу на винчестер, а мне нужно сохдать в памяти, чтобы потом по сети передать
а чем не подходит вариант сохранения на винчестер, передачи по сети и удаления с винчестера?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 00:18     Последовательная запись массива в .gz архив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
27.06.2011, 00:18     Последовательная запись массива в .gz архив #30
Это совсем неправильно, получится носилование винчестер зазря..., а он и так перегружен, держет большую базу с постоянной высокой нагрузкой... принципиально не люблю костыли

Добавлено через 40 минут
Попробовал вручную заголовок воткнуть, но ничего не вышло
Там информация о размере непонятно куда вписывается... в общем нужно точно знать структуру.
Не подскажете как можно всётаки сделать gzwrite именно в переменную, а не в файл? Или наверняка есть правильный метод, библиотека то на весь мир известна, мне кажется я просто что-то упустил

Добавлено через 37 минут
Вот как то так

C++
1
2
3
4
char src[390]="compressed compressed";
gzFile zfp = gzopen(buf,"wb");
gzwrite(zfp,src,390);
gzclose (zfp);
Помогите допилить, чтобы работало
Yandex
Объявления
27.06.2011, 00:18     Последовательная запись массива в .gz архив
Ответ Создать тему
Опции темы

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