//+------------------------------------------------------------------+
//| 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);
} |