forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   Запись данных в поток в конкретную позицию (http://forum.boolean.name/showthread.php?t=11957)

Жека 19.02.2010 11:03

Запись данных в поток в конкретную позицию
 
Приветствую!

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

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

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

Пример:
Код:

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


SBJoker 19.02.2010 11:37

Ответ: Запись данных в поток в конкретную позицию
 
Отличная работа КЭП!

Черный крыс 01.07.2010 04:56

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot