purebasic.info

PureBasic forum
Текущее время: Чт июн 21, 2018 5:31 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Возможности стандартного packer'a
СообщениеДобавлено: Сб янв 14, 2012 6:55 pm 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте! Со Старым Новым годом!:)

Подскажите, можно ли стандартным упаковщиком (сначала упаковав) распаковать текстовый файл в память, для последующего чтения его с помощью ReadFile(...). Возможно есть какие-нибудь альтернативы?

Суть проблемы: имеется тектовый файл со строками, большого объёма. При упаковке, его размер уменьшается чуть ли не в 5 раз. Было бы неплохо распаковать его в память, и читать строки оттуда:)


Последний раз редактировалось zmicer Сб янв 14, 2012 7:31 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 14, 2012 7:11 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11181
Благодарил (а): 4 раз.
Поблагодарили: 414 раз.
zmicer писал(а):
Подскажите, можно ли стандартным упаковщиком (сначала упаковав) распаковать текстовый файл в память
Можно.

zmicer писал(а):
для последующего чтения его с помощью ReadFile(...)
Если данные находятся в памяти, то зачем их сохранять на диск, для последующего открытия функцией ReadFile()?

zmicer писал(а):
Было бы неплохо распаковать его в память, и читать строки оттуда
Данные нужно упаковать с помощью PackMemory(), а при запуске программы, распаковывать функцией UnpackMemory().

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 14, 2012 7:29 pm 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Извиняюсь, я неправильно задал вопрос!
В том всё и дело, что данные хранятся в большом файле на диске (обычный текстовый файл). Вот я и думаю, что было бы неплохо, если его упаковать стандартным упаковщиком (JCalG1 алгоритм), а потом пусть даже не частями (это невозможно), а целиком распаковать в память и читать оттуда обычными функциями ReadFile(...), ReadString(...).

p.s.: Заинтересовал пример, там где сразу загружают изображения из архива, а потом их в спрайты и на экран:)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 14, 2012 9:33 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11181
Благодарил (а): 4 раз.
Поблагодарили: 414 раз.
zmicer писал(а):
целиком распаковать в память и читать оттуда обычными функциями ReadFile(...), ReadString(...)
Эти функции работают не с памятью, а с файлом. Для работы с памятью есть специальные функции. http://purebasic.ru/manual.php?id=781&lng=rus

zmicer писал(а):
Заинтересовал пример, там где сразу загружают изображения из архива
Что мешает сделать тоже самое с текстом?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 9:00 am 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, да не дело в памяти. Вы опять меня не поняли.

Может я не правильно выражаюсь. Дело не в упаковке в память, в буквальном смысле. Я имею ввиду вот что:

1. CreatePack("data.pak") ; создаём архив
2. AddPackFile("big.txt") ; добавляем туда большой текстовый файл, с повторяющимися строками (который ооочччень хорошо можно сжать), собственно в нём полезная информация.
3. ClosePack()

Всё вышеперечисленное проделываем только один раз (при создании файла данных). Далее, я бы хотел сделать вот что. При каждом обычном запуске моего приложения:

1. OpenPack("data.pak")
2. ReadFile(0, NextPackFile()) ; <- понятно, что такой вызов абсолютно невозможен, по различию аргументов у функций. Мне очень нужно сделать что-то аналогичное.
3. ClosePack()

Т.е. мне нужно разархивировать файл, и получить его хэндл именно как файла, для последующей работы со всеми функциями из http://purebasic.ru/manual.php?id=374&lng=rus


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 9:32 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6310
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
zmicer писал(а):
Т.е. мне нужно разархивировать файл, и получить его хэндл именно как файла, для последующей работы со всеми функциями из http://purebasic.ru/manual.php?id=374&lng=rus

Создалось впечатление, что вы что то путаете.
Все файловые команды направлены на то, что бы прочитать из файла информацию в переменную и сохранить из переменной в файл. Надеюсь с этим вы согласны?
При запуске вашей программы вы распаковываете data.pak в память и записываете эту информацию в строковую переменную. Так? Зачем вам нужны ReadFile и прочее, если у вас уже всё прочитано?
Работайте с этой информацией как обычно со строкой - поиск, вырезание, замена и т.п.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 10:06 am 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy, спасибо за ответ.
Да, это понятно, что функция NextPackFile() возвращает указатель на начальный байт разархивированного файла. Но проблема в том, что мне придётся работать вручную со строками, т.е. сканировать наличие нулевого символа, перехода каретки и т.д. Причем, я точно не знаю, как себя поведет эта "моя ручная работа" на разных системах с разной разрядностью. А нативные функции pb'ка - ганрантируют мне это.

Вот взять хотя бы одну эту ReadString(...) - как всё замечательно реализовано (из справки): Читает string из файла #File пока не встретится символ 'конец строки' ('End Of Line') (поддерживаются форматы файлов Unix и DOS). Если для параметра 'Flags' не заданы никакие флаги, строка читается как UTF8 если программа скомпилирована в режиме уникода, иначе она читается как ASCII.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 10:23 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
zmicer
Ты сам себя запутываешь, тебе дали правильный совет
kvitaliy писал(а):
вы распаковываете data.pak в память и записываете эту информацию в строковую переменную....Работайте с этой информацией как обычно со строкой - поиск, вырезание, замена и т.п.
при этом работа с памятью, будет происходить быстрее, чем чтение с диска.

zmicer писал(а):
на разных системах с разной разрядностью
я создаю файл в винде х64, а читаю и работаю с этим файлом в лине х32, и ни чего, всё работает.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 11:04 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6310
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
zmicer писал(а):
Читает string из файла #File пока не встретится символ 'конец строки' ('End Of Line') (поддерживаются форматы файлов Unix и DOS).

Можно так же в начале программы один раз разбить содержимое памяти по этому разделителю' ('End Of Line') на строки и записать их в связанный список, если вам так принципиально работать с текстом построчно. В результате вы получите высокую скорость обработки и мгновенный доступ к любой строке.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 11:17 am 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо за ответы!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 1:09 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Вот здесь asdf8 задал вопрос как быстро разбить загруженный в память текстовый файл на строки. Его вариант ~ в 200 раз медленнее, чем построчное чтение с диска (ReadString())
Код:
1
2
3
4
NumStr = CountString(text$, #CRLF$)   ; Это его вариант
   For i = 1 To NumStr
      str$ = StringField(text$, i, #CRLF$)
   Next


Я попробовал заменить это асм вставкой, все равно ReadString() быстрее (может руки кривые)
Так что вопрос остается открытым

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 3:00 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
pablov писал(а):
все равно ReadString() быстрее
в том примере быстрей, но здесь человеку нужно распаковать из файла, затем сохранить на диск распакованные данные(на это тоже время тратится), а уже потом считывать с диска. При таком раскладе может оказаться ReadString() и медленней, да и к тому же, зачем лишний раз насиловать диск - это первое, и второе если человеку принципиально читать текст отдельными строками, то и упаковывать нужно каждую строку отдельно AddPackMemory(MemoryAddress, Length [, CompressionLevel])

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 3:15 pm 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
lakomet писал(а):
pablov писал(а):
все равно ReadString() быстрее
в том примере быстрей, но здесь человеку нужно распаковать из файла, затем сохранить на диск распакованные данные(на это тоже время тратится), а уже потом считывать с диска. При таком раскладе может оказаться ReadString() и медленней, да и к тому же, зачем лишний раз насиловать диск - это первое, и второе если человеку принципиально читать текст отдельными строками, то и упаковывать нужно каждую строку отдельно AddPackMemory(MemoryAddress, Length [, CompressionLevel])


Да нет, мне не нужно сохранять из архива что-то. Мне нужно сделать такое же (см. внизу), только с текстовым файлом.

OpenPack("mycompressedfiles.pak")
CatchSprite(0,NextPackFile()) ; InitSprite must be called before in your program...
CatchSprite(1,NextPackFile()) ; ...first file will be loaded as Sprite 0, second as Sprite 1
CatchSound(0,NextPackFile()) ; InitSound must be called before in your program...
CatchSound(1,NextPackFile()) ; ...first file will be loaded as Sound 0, second as Sound 1
ClosePack()

Но почему-то для изображений и для звука catch сделали сразу из памяти, а для текстовых файлов - нет. Вообщем нужно делать руками, по-другому не получится.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 3:31 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11181
Благодарил (а): 4 раз.
Поблагодарили: 414 раз.
zmicer писал(а):
Но почему-то для изображений и для звука catch сделали сразу из памяти, а для текстовых файлов - нет.
Все есть.
Код:
1
Text.s=PeekS(NextPackFile())


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 16, 2012 3:37 pm 
Не в сети
доцент

Зарегистрирован: Ср июл 06, 2011 9:28 pm
Сообщений: 28
Откуда: Беларусь, Минск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Я понимаю, что вы хотите мне сказать:) Но это не совсем то, что мне нужно. Спасибо!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB