Показать сообщение отдельно
Старый 03.09.2005, 18:56   #7
alcosholik
 
Сообщений: n/a
SeekFile (указатель_на_файл, смещение)

Параметры
указатель_на_файл = переменная, определенная командой ReadFile, WriteFile или OpenFile. Возвращаемое значение – смещение от начала файла (0 = начало файла)

Описание
Эта команда позволяет изменить позицию в файле. Команда делает возможным прямой доступ к любым данным внутри файлов и может быть использована с файлами, открытыми командой ReadFile, WriteFile или OpenFile. Заметьте, что смещение – это количество байтов от начала файла. Важно принимать во внимание размер элементов данных в вашем файле.

К примеру, переменные типа integer имеют длину 4 байта, т.е. первое integer-число в файле имеет позицию со смещением 0, второе – со смещением 4. Если вы перезаписываете пользовательские типы данных, вы должны узнать, сколько байтов занимает каждый из них, чтобы можно было перемещаться по файлу корректно. Поиск за пределами конца файла не выдаст ошибку, но данные не будут считаны или записаны в файл, могут появиться неизвестные побочные эффекты.

Используя FilePos и SeekFile, можно определить и изменить позицию внутри файла, который открыт для чтения или записи. Это позволяет прочитать и изменить файл без необходимости создания его копии или работы через весь файл последовательно. Может пригодиться, если вы создали файл с базой данных и хотите найти и изменить только несколько записей в нем. Также возможно создать файл, который содержит указатели на место, где начинается каждая запись в файле с данными.

Чтобы подсчитать смещение, вам нужно знать длину каждого элемента данных:
смещение = искомый_элемент * размер_элемента – размер_элемента

Для примера, файл с integer-числами, длина которых по 4 байта, подсчитывается так:
7-е число имеет позицию со смещением 7 * 4 – 4, т.е. 24

Примечание: нужно проявлять большую осторожность при изменении файлов, которые содержат строки (тип string), так как у них нет фиксированной длины.

Пример
; Правка фрагмента файла, используя OpenFile, SeekFile и FilePos

; Открыть/создать файл для записи 
fileout = WriteFile("mydata.dat") 

; Записать информацию в файл 
WriteInt( fileout, 100 ) 
WriteInt( fileout, 200 ) 
WriteInt( fileout, 300 ) 
WriteInt( fileout, 400 ) 
WriteInt( fileout, 500 ) 

; Закрыть файл 
CloseFile( fileout ) 

DisplayFile( "Файл без изменений", mydata.dat" ) 

Print "Считывание данных в случайном порядке" 
; Открыть файл, чтобы считать из него только 4-й и 2-й элементы

file = OpenFile("mydata.dat") 

; Считать и вывести на экран 4-е integer-число, т.е. 4*4-4 = 12 байт от начала файла
SeekFile( file, 12 ); Сместиться к нужной позиции 
Number = ReadInt( file ) 
Print Number 

; Считать и вывести на экран 2-е integer-число, т.е. 2*4-4 = 4 байта от начала файла
SeekFile( file, 4 ); Сместиться к нужной позиции 
Number = ReadInt( file ) 
Print Number 

CloseFile( file ) 

Waitkey() 
End; Конец программы 

; **** Определения функций **** 

; Прочитать файл и вывести его содержимое на экран 
Function DisplayFile( Tittle$, Filename$ ) 
Print tittle$ 
file = ReadFile( Filename$ ) 
While Not Eof( file ) 
Number = ReadInt( file ) 
Print Number 
Wend 
CloseFile( file ) 
Print 
End Function
 
Ответить с цитированием