Указатель файла и смещение

Всякий раз, когда вызывается функция readLine, в начале следующей строки автоматически помещается указатель файла. Смещение указателя файла — это число, обозначающее местоположение этого указателя относительно начала файла. При открытии файла его указатель помещается в начало файла с нулевым смещением.

Несмотря на то что указатель файла устанавливается автоматически по мере чтения содержимого файла, его положением можно управлять, если в этом есть необходимось. Это делается с помощью функции seek. А смещение указателя файла определяется с помощью функции filePos.

Для того чтобы воспользоваться функциями seek и filePos. выполните следующее упражнение.

1. Скопируйте файл seek.txt из каталога appendix на прилагаемом к этой книге CD-ROM в удобный для вас каталог на жестком лиске вашего компьютера

Этот файл содержит ряд двузначных чисел, разделенных пробелом.

2. Введите в приемнике команд следующий фрагмент кода, используя соот­ветствующий путь к файлу seek.txt:

fs = openFile "c:\\3dsmax8\\scripts\\seek.txt"

seek fs 6

readChars fs 2

В качестве результата в приемнике команд появится значение 53, которое означает, что двумя символами, прочитанными из данного файла на позиции 6, оказались числа 5 и 3.

3. Введите в приемнике команд следующую строку кода: filePos fs

В качестве результата в приемнике команд появится значение 8. После чтения двух упомянутых выше символов указатель файла переместился на две позиции вперед и теперь его смещение равно 8.

4. Введите в приемнике команд следующую строку кода, чтобы закрыть файл:

close fs

Итак, для чтения из файла отдельных символов в приведенном выше упражнении была использована функция readChars. Если же воспользоваться функ­цией readLine, будет прочитана вся строка начиная с позиции 6. Для чтения единственного символа служит функция readchar.


Приложение

Для перемещения по файлу имеются еще две полезные функции: skipToNextLine и skipToString. В частности, функция skipToNextLine осуществляет переход к следующей строке, а функция skipToString — поиск конкретной строки символов и установку сразу же после нее указателя файла с соответствующим смещением. Функция skipToString оказывается полезной в том случае, если файл содержит дескрипторы — текстовые ограничители, которые вводятся в файл для того, чтобы упростить поиск в нем отдельных элементов.

Для того чтобы применить функцию skiptoString к размеченному дескрипторами файлу, выполните следующее упражнение.

1. Установите 3dsMax в исходное состояние.

2. Скопируйте файл skiptostring.txt из каталога appendix, на прилагаемом к этой книге CD-ROM, в удобный для вас каталог на жестком диске вашего компьютера.

3. Откройте файл skiptostring.txt в текстовом редакторе WindowsNotepad.

Он содержит следующее:

$$hsegs 10

$$height 50

$$radius

В трех первых строках находятся знаки денежной единицы, текстовое описание и число. Знаки денежной единицы служат в качестве дескрипторов, обеспечивающих правильное обнаружение текста в файле. Это очень короткий файл, но в более крупных файлах такие дескрипторы, как $$, помогают без труда находить многочисленные значения, текст и прочие элементы.

4. Закройте текстовый редактор WindowsNotepad.

5. Введите в окне редактора сценариев MAXScript Editor следующую строку кода, правильно указав в ней путь к файлу skiptostring.txt:

fs = openFile "c:\\3dsmax8\\scripts\\skiptostring.txt" Указанный файл откроется.

6. Введите следующий фрагмент кода для чтения и поиска текста в открытом файле:

skipToString fs "$$height"

h = readValue fs

seek fs 0

skipToString fs "$$hsegs"

hs = readValue fs

seek fs 0

skipToString fs "$$radius"

r = readValue fs

Функция skipToString обнаруживает дескриптор файла. Но она отнюдь не всегда начинает поиск с текущего смещения указателя файла. Поэтому сначала нужно установить указатель в начало файла с помощью функции seek, а затем начать поиск. Дескрипторы можно искать в любом порядке.


Приложение

7. Закройте файл и создайте цилиндр, используя считанные из него данные:

close fs

c = cylinder radius: r height: h heightsegs: hs

8. Выполните сценарий.

В этом сценарии считываются данные из файла и создается цилиндр с параметрами, указанными в файле. Несмотря на то что значение 20 радиуса находится в строке файла skiptostring.txt после текста $$radius, это значение читается в сценарии правильно.