Указатель файла и смещение
Всякий раз, когда вызывается функция 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, это значение читается в сценарии правильно.