FileReadInteger

La funzione legge int, short o il valore char dalla posizione corrente del puntatore del file a seconda della lunghezza specificata in byte.

int  FileReadInteger(
   int  file_handle,        // File handle
   int  size=INT_VALUE      // Grandezza di un integer in byte
   );

Parametri

file_handle

[in] Il descrittore di file restituito da FileOpen().

size=INT_VALUE

[in]  Numero di byte (fino a 4 inclusivi), che dev'essere letto. Le corrispondenti costanti vengono fornite: CHAR_VALUE = 1, SHORT_VALUE = 2 and INT_VALUE = 4, così la funzione può leggere il valore intero del tipo char, short o int.

Valore restituito

Un valore del tipo int. Il risultato di questa funzione deve essere esplicitamente castato ad un tipo target, cioè al tipo di dati che si ha bisogno di leggere. Giacchè viene restituito un valore di tipo int, esso può essere facilmente convertito in qualunque valore integer. Il puntatore del file è slittato per il numero dei byte letti.

Nota

Quando si legge meno di 4 byte, il risultato ricevuto è sempre positivo. If one or two bytes are read, the sign of the number can be determined by explicit casting to type char (1 byte) or short (2 bytes). Ottenere il segno per un numero tre-byte non è banale, poiché non vi è corrispondenza di tipo sottostante.

Esempio (il file ottenuto fopo l'esecuzione dell'esempio per la funzione FileWriteInteger è qui utilizzato)

//+--------------------------------------------------------------------------------+
//|                                                       Demo_FileReadInteger.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 indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Trends"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri per la lettura dei dati 
input string InpFileName="Trend.bin"// nome del file
input string InpDirectoryName="Data"// nome della directory
//--- variabili globali
int      ind=0;
int      size=0;
datetime time_buff[];
//--- buffers indicatore
double   buff[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
   int def_size=100;
//--- alloca la memoria per l'array
   ArrayResize(time_buff,def_size);
//--- apre il file
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s il file è disponibile per la lettura",InpFileName);
      PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- variabili aggiuntive
      int    arr_size;
      uchar  arr[];
      //--- legge i dati dal file
      while(!FileIsEnding(file_handle))
        {
         //--- trova come molti simboli vengono usati per scrivere l'orario
         arr_size=FileReadInteger(file_handle,INT_VALUE);
         ArrayResize(arr,arr_size);
         for(int i=0;i<arr_size;i++)
            arr[i]=(char)FileReadInteger(file_handle,CHAR_VALUE);
         //--- conserva i valori temporali
         time_buff[size]=StringToTime(CharArrayToString(arr));
         size++;
         //--- incrementa le grandezze degli array se non vengono riempiti
         if(size==def_size)
           {
            def_size+=100;
            ArrayResize(time_buff,def_size);
           }
        }
      //--- chiude il file
      FileClose(file_handle);
      PrintFormat("I dati vengono letti, il file %s è chiuso",InpFileName);
     }
   else
     {
      PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- lega l'array al buffer indicatore
   SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- imposta i valori dell'indicatore che non saranno visibili sul chart
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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);
   ArraySetAsSeries(close,false);
//--- il loop per la barra che non è stata ancora maneggiata
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- 0 per default
      buff[i]=0;
      //--- controlla se ci sono ancora dati presenti
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //--- se le date coincidono, viene usato il valore dal file
            if(time[i]==time_buff[j])
              {
               //--- riceve il prezzo
               buff[i]=close[i];
               //--- incrementa il contatore
               ind=j+1;
               break;
              }
           }
        }
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }

Vedi anche

IntegerToString, StringToInteger, Integer types, FileWriteInteger