Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Demo_FileTell - скрипт для MetaTrader 5
- Просмотров:
- 2667
- Рейтинг:
- Опубликован:
- 2013.04.03 16:25
- Обновлен:
- 2016.11.22 07:33
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Скрипт открывает текстовый файл, проводит анализ позиций начала строк внутри этого файла и отображает текст строки со случайным номером. Для получения массива позиций начала каждой строки внутри файла написана функция GetStringPositions(). Функция проводит поиск начала строк с учетом типа кодировки файлов, которую можно указать во входном параметре "InpEncodingType".
Помимо использования функции FileTell(), в скрипте также используются функция FileGetInteger() для получения типа кодировки, FileIsEnding() для определения конца файла и FileSeek() для сдвига позиции каретки внутри файла при отображении строки со случайным номером.
Код:
//--- покажем окно входных параметров при запуске скрипта #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); }
Скрипт демонстрирует пример использования функции FileSize()
Demo_FileReadDoubleИндикатор демонстрирует пример использования функции FileReadDouble()
Скрипт демонстрирует пример использования функции FileWriteInteger()
Demo_FileReadIntegerИндикатор демонстрирует пример использования функции FileReadInteger()