Показать сообщение отдельно
Старый 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)