Русский

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

FileReadStruct

Cчитывает из бинарного файла содержимое в структуру, переданную в качестве параметра. Чтение производится с текущего положения файлового указателя.

uint  FileReadStruct(
   int          file_handle,        // handle файла
   const void&  struct_object,      // структура, куда происходит считывание
   int          size=-1             // размер структуры в байтах
   );

Параметры

file_handle

[in]  Файловый описатель открытого бинарного файла.

struct_object

[out]  Объект указанной структуры. Структура не должна содержать строки, динамические массивы и виртуальные функции.

size=-1

[in]  Количество байт, которые нужно прочитать. Если размер не указан или указано большее количество байт, чем размер структуры, то используется точный размер указанной структуры.

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

В случае удачи функция возвращает количество прочитанных байт 0 в случае ошибки.  При успешном завершении количество прочитанных байт равно размеру структуры. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример (используется файл, полученный в результате работы примера для функции FileWriteStruct())

//+------------------------------------------------------------------+
//|                                          Demo_FileReadStruct.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
//---- plot Label1
#property indicator_label1  "Open"
#property indicator_type1    DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label1  "High"
#property indicator_type2    DRAW_LINE
#property indicator_color2  clrGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
#property indicator_label1  "Low"
#property indicator_type3    DRAW_LINE
#property indicator_color3  clrOrange
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
#property indicator_label1  "Close"
#property indicator_type4    DRAW_LINE
#property indicator_color4  clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
#property indicator_separate_window
//--- параметры для получения данных
input string  InpFileName="EURUSD.txt"// имя файла
input string  InpDirectoryName="Data";  // имя директории
//+------------------------------------------------------------------+
//| Структура для хранения данных свечи                              |
//+------------------------------------------------------------------+
struct candlesticks
  {
   double            open;  // цена открытия
   double            close// цена закрытия
   double            high;  // максимальная цена
   double            low;   // минимальная цена
   datetime          date;  // дата
  };
//--- индикаторные буферы
double       open_buff[];
double       close_buff[];
double       high_buff[];
double       low_buff[];
//--- глобальные переменные
candlesticks cand_buff[];
int          size=0;
int          ind=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int default_size=100;
   ArrayResize(cand_buff,default_size);
//--- откроем файл
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_COMMON);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для чтения",InpFileName);
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
      //--- прочитаем данные из файла
      while(!FileIsEnding(file_handle))
        {
         //--- запишем данные в файл
         uint bytesread=FileReadStruct(file_handle,cand_buff[size]);
         //--- проверка количества записанных данных
         if (bytesread!=sizeof(candlesticks))
           {
            PrintFormat("Ошибка чтения данных. Код ошибки=%d",GetLastError());
            //--- закрываем файл
            FileClose(file_handle);
            return(INIT_FAILED);
           }
         else
           {
            size++;
            //--- проверим массив на переполненность
            if(size==default_size)
              {
               //--- увеличим размерность массива
               default_size+=100;
               ArrayResize(cand_buff,default_size);
              }
           }
        }
      //--- закроем файл
      FileClose(file_handle);
      PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
     }
   else
     {
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,open_buff,INDICATOR_DATA);
   SetIndexBuffer(1,high_buff,INDICATOR_DATA);
   SetIndexBuffer(2,low_buff,INDICATOR_DATA);
   SetIndexBuffer(3,close_buff,INDICATOR_DATA);
//--- пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ArraySetAsSeries(time,false);
//--- цикл для еще необработанных свечек
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- по умолчанию 0
      open_buff[i]=0;
      close_buff[i]=0;
      high_buff[i]=0;
      low_buff[i]=0;
      //--- проверка, есть ли еще данные
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //--- если даты совпадают, то используем значение из файла
            if(time[i]==cand_buff[j].date)
              {
               open_buff[i]=cand_buff[j].open;
               close_buff[i]=cand_buff[j].close;
               high_buff[i]=cand_buff[j].high;
               low_buff[i]=cand_buff[j].low;
               //--- увеличиваем счетчик
               ind=j+1;
               break;
              }
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Смотри также

Структуры и классы, FileWriteStruct()