Русский

Справочник MQL4 Файловые операции FileSeek

FileSeek

Перемещает положение файлового указателя на указанное количество байт относительно указанного положения.

bool  FileSeek(
   int                  file_handle,     // handle файла
   long                 offset,          // в байтах
   ENUM_FILE_POSITION   origin           // позиция для отсчета
   );

Параметры

file_handle

[in]  Файловый описатель, возвращаемый функцией FileOpen().

offset

[in]  Смещение в байтах (может принимать и отрицательное значение).

origin

[in]  Точка отсчета для смещения. Может принимать одно из значений перечисления ENUM_FILE_POSITION.

Возвращаемое значение

В случае удачи функция возвращает true, в случае ошибки - false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если результатом выполнения функции FileSeek() является отрицательное смещение (выход за "левую границу" файла), то файловый указатель будет установлен на начало файла.

Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения.

Пример:

//+------------------------------------------------------------------+
//|                                                Demo_FileSeek.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="file.txt";    // имя файла
input string InpDirectoryName="Data";   // имя директории
input int    InpEncodingType=FILE_ANSI// ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- установим значение переменной для генерации случайных чисел
   _RandomSeed=GetTickCount();
//--- переменные для позиций начала строк
   ulong pos[];
   int   size;
//--- сбросим значение ошибки
   ResetLastError();
//--- откроем файл
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для чтения",InpFileName);
      //--- получим позицию начала для каждой строки в файле
      GetStringPositions(file_handle,pos);
      //--- определим сколько всего строк в файле
      size=ArraySize(pos);
      if(!size)
        {
         //--- если в файле нет строк, то завершаем работу
         PrintFormat("Файл %s пуст!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- выберем случайно номер строки
      int ind=MathRand()%size;
      //--- сдвинем позицию на начало этой строки
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- прочитаем и распечатаем строку с номером ind
         PrintFormat("Текст строки с номером %d: \"%s\"",ind,FileReadString(file_handle));
        }
      //--- закроем файл
      FileClose(file_handle);
      PrintFormat("Файл %s закрыт",InpFileName);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
  }
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- размер массива по умолчанию
   int def_size=127;
//--- выделим память для массива
   ArrayResize(arr,def_size);
//--- счетчик строк
   int i=0;
//--- если не конец файла, то есть хотя бы одна строка
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- в цикле перебираем строки
   while(1)
     {
      //--- читаем строку
      FileReadString(handle);
      //--- проверка на конец файла
      if(!FileIsEnding(handle))
        {
         //--- запомним позицию следующей строки
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- увеличим размер массива, если он переполнен
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// конец файла, выходим
     }
//--- установим истинный размер массива
   ArrayResize(arr,i);
  }