Шаг 51 - Инструкция Put

Записывает содержимое переменной в файл на диске.

Put [#]номерФайла, [номерЗаписи], имяПеременной

Параметры
номерФайла
Обязательный. Любой допустимый номер файла.
номерЗаписи
Необязательный. Номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись.
имяПеременной
Обязательный. Имя переменной, содержащей данные, которые следует записать в файл.

Замечания
Данные, записанные с помощью инструкции Put, обычно считываются из файла с помощью инструкции Get.
Первой записи (или байту) файла соответствует номер 1, второй 2 и т.п. Если аргумент номерЗаписи опущен, записывается запись (или байт), на которую указатель был установлен после выполнения последней инструкции Get или Put переведен с помощью функции Seek. Наличие запятых-разделителей является обязательным, например:

Put #4,,FileBuffer

Для файлов, открытых в режиме Random, применимы следующие правила:
Даже если длина данных, подлежащих записи, меньше длины записи, указанной в предложении Len инструкции Open, инструкция Put начинает запись каждой следующей записи с начала этой записи. Пространство между концом одной записи и началом следующей записи заполняется текущим содержимым буфера файла. Поскольку объем данных, используемых для заполнения, не может быть определен с достаточной степенью уверенности, рекомендуется, чтобы длина записи совпадала с длиной читаемых данных. Если длина данных, подлежащих записи, больше длины записи, указанной в предложении Len инструкции Open, возникает ошибка.
При записи строки переменной длины инструкция Put сначала записывает 2-байтовый дескриптор, содержащий длину строки, а затем содержимое этой переменной. Таким образом, длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактическую длину этой строки.
При записи переменной Variant числового типа инструкция Put сначала записывает 2 байта, указывающие подтип (VarType) типа Variant, а затем содержимое этой переменной. Например, при чтении переменной Variant подтипа VarType 3, инструкция Put записывает 6 байт: 2 байта, указывающие тип переменной Variant как VarType 3 (Long), и 4 байта, содержащие значение типа Long. Длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактическое число байт, необходимое для размещения этой переменной.
С помощью инструкции Put можно записать массив типа Variant на диск, однако, нельзя записать скаляр типа Variant, содержащий массив. Кроме того, инструкцию Put нельзя использовать для записи объектов на диск.
При записи переменной Variant подтипа VarType 8 (String) инструкция Put сначала записывает 2 байта, указывающие VarType, потом 2 байта, указывающие длину строки, а затем содержимое строки. Длина записи, указанная в предложении Len инструкции Open, должна крайней мере на 4 байта превышать фактическую длину этой строки.
При записи динамического массива инструкция Put сначала записывает дескриптор, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения массива данных и дескриптора массива. Например, для размещения описанного ниже массива требуется 118 байт:

Dim MyArray(1 To 5,1 To 10) As Integer

118 байт распределяются следующим образом: 18 байт для дескриптора (2 + 8 * 2), и 100 байт для данных (5 * 10 * 2).
При записи массива фиксированной длины инструкция Put записывает только данные. Дескриптор не записывается.
При записи переменной любого другого типа (кроме строки переменной длины и переменной типа Variant), инструкция Put записывает только данные. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна длине записываемых данных.
Инструкция Put записывает элементы определяемых пользователем типов так, будто это отдельные переменные, за исключением того, что пространство между элементами не заполняется текущим содержимым буфера файла. На диске динамический массив типа, определенного пользователем (записанный с помощью инструкции Put) предваряется дескриптором, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения отдельных элементов, в том числе, массивов и их дескрипторов.
Для файлов, открытых в режиме Binary, применимы все перечисленные выше правила, за исключением следующих:
Предложение Len инструкции Open игнорируется. Инструкция Put записывает все переменные на диск непрерывно, т.е. без заполнения пространства между записями текущим содержимым буфера файла.
При записи любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Put записывает только данные. Дескриптор не записывается.
При записи строк переменной длины, не являющихся элементами типов, определяемых пользователем, 2-байтовый дескриптор не записывается. Число записываемых байт равняется числу символов, содержащихся в строке. Например, следующие инструкции запишут 10 байт в файл, которому соответствует номер 1:

VarString$ = String$(10," ")
Put #1,,VarString$

Пример
В данном примере инструкция PutRecord

Type Record				' Тип, определенный пользователем.
	ID As Integer
	Name As String * 20
End Type

Dim MyRecord As Record, RecordNumber	' Объявляет переменную.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
For RecordNumber = 1 To 5		' Выполняет цикл 5 раз.
	MyRecord.ID = RecordNumber	' Определяет номер.
	MyRecord.Name = "My Name" & RecordNumber	' Создает строку.
	Put #1, RecordNumber, MyRecord	' Записывает запись в файл.
Next RecordNumber
Close #1				' Закрывает файл.

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.