Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

Ответ
 
Опции темы
Старый 19.02.2010, 11:03   #1
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Запись данных в поток в конкретную позицию

Приветствую!

Это заметка о том, как можно вставить данные в поток в нужную позицию.

Цель заметки: обратить внимание и обсудить.

Суть: при записи в поток в указанную позицию запись осуществляется поверх уже существующих данных, и данные "затираются".

Пример:
Local output:TStream = WriteStream("data.txt")
WriteByte(output, height)
WriteByte(output, space)

'тут понадобилось записать в начало файла целое(int) число 
SeekStream(output, 0)
WriteInt(output, letCount)

CloseFile(output)
Я изначально почему-то подумал, что данные "вставятся" в указанную позицию, потеснив остальные. В таком случае размер файла должен был быть 6 байтов.
Однако данные затёрлись, остались только ИНТовые 4 байта.

Решение: в нужные позиции последовательно записывать значения по умолчанию, например нули, а потом поверх "нулей" писать правильные значения.

Пример:
Local output:TStream = WriteStream("data.txt")
WriteInt(output, 0) 'зарезервировали 4 байта для letCount
WriteByte(output, height)
WriteByte(output, space)

'тут понадобилось записать в начало файла целое(int) число 
SeekStream(output, 0)
WriteInt(output, letCount)

CloseFile(output)

Применение: мне потребовалось записать в начало файла количество символов в шрифте. Оно должно считаться автоматически. Описание шрифта в текстовом файле. Символы записаны блоками, а не в одну строку. При этом всё записать за 1 проход по файлу.
Успешно сделано.

П.С. файл с описанием шрифта, по которому формируется бинарник:
10
3
6
----------------
digits
0123456789
6,4,6,6,6,6,6,6,6,6
3
----------------
eng_big
ABCDEFGHIJKLMNOPQRSTUVWXYZ
7,6,7,7,6,  6,7,7,4,5,  6,6,8,7,8,  6,8,6,6,6,  7,7,8,6,6, 6
2
----------------
eng_small
abcdefghijklmnopqrstuvwxyz
7,6,7,7,6,  6,7,7,4,5,  6,6,8,7,8,  6,8,6,6,6,  7,7,8,6,6, 6
2
----------------
rus_big
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ
7,6,6,5,8,6,10,6,7,7,6,7,8,7,8,7,6,7,6,6,8,6,7,6,8,9,8,8,6,7,8,7,6
1
----------------
rus_small
абвгдежзийклмнопрстуфхцчшщъыьэюяё
5,5,5,4,7,   5,8,5,5,   5,5,6,6,5,   5,5,5,5,6,   5,8,5,6,5,   8,9,7,7,5,   5,7,5 , 5
2
----------------
signs
`!@#$%^&*()-=,."';:[]{}/\<>_+?
3,2,9,6,6,10,6,7,6,3,4,4,5,3,3,4,3,3,2,3,3,6,6,5,5,6,6,6,6,5
2
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
Nex (14.03.2010), Randomize (23.02.2010)
Старый 19.02.2010, 11:37   #2
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Запись данных в поток в конкретную позицию

Отличная работа КЭП!
__________________
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
Harter (02.03.2010), Randomize (23.02.2010), Жека (19.02.2010)
Старый 01.07.2010, 04:56   #3
Черный крыс
 
Сообщений: n/a
Ответ: Запись данных в поток в конкретную позицию

вообще то это геморой.
для таких целей существует отражение.
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:57.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com