Дэвелопер
Регистрация: 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
|