Русский

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

Справка MQL4 одним файлом:

FileTell

Возвращает текущее положение файлового указателя соответствующего открытого файла.

ulong  FileTell(
   int  file_handle      // handle файла
   );

Параметры

file_handle

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

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

Текущая позиция файлового описателя в байтах от начала файла.

Примечание

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

Пример:

//+------------------------------------------------------------------+
//|                                                Demo_FileTell.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;
      //--- сдвинем позицию на начало этой строки
      FileSeek(file_handle,pos[ind],SEEK_SET);
      //--- прочитаем и распечатаем строку с номером 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);
  }