FileReadInteger

La función lee de un archivo binario el valor del tipo int, short o char dependiendo de la longitud indicada en bytes. La lectura se realiza desde la posición actual del puntero de archivos.

int  FileReadInteger(
   int  file_handle,        // manejador del archivo
   int  size=INT_VALUE      // tamaño del tipo entero en bytes
   );

Parámetros

file_handle

[in]  Descriptor de archivo devuelto por la función FileOpen().

size=INT_VALUE

[in]  Número de bytes (hasta 4 inclusive) que hay que leer. Están previstas las siguientes constantes: CHAR_VALUE=1, SHORT_VALUE=2 y INT_VALUE=4, así la función puede leer el valor entero del tipo char, short o int.

Valor devuelto

Valor del tipo int. Es necesario convertir explicitamente el resultado de esta función a un tipo fuente, es decir a aquel tipo de datos que hace falta leer. Puesto que se devuelve el valor del tipo int, se puede convertirlo tranquilamente a cualquier valor entero. El puntero de archivo se desplaza a la cantidad de bytes leídos.

Nota

Cuando se lee menos de 4 bytes, el resultado obtenido será siempre positivo. Si se lee uno o dos bytes, se puede determinar exactamente el signo del número mediante la conversión explícita al tipo char (1 byte) o al tipo short (2 bytes), respectivamente. La obtención del signo para un número de tres bytes no es trivial, ya que no hay tipo base correspondiente.

Ejemplo (se utiliza el archivo conseguido como resultado de trabajo del ejemplo para la función FileWriteInteger)

//+------------------------------------------------------------------+
//|                                         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
//--- parámetros para la lectura de datos
input string InpFileName="Trend.bin"// nombre del archivo
input string InpDirectoryName="Data"// nombre de la carpeta
//--- variables globales
int      ind=0;
int      size=0;
datetime time_buff[];
//--- indicator buffers
double   buff[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int def_size=100;
//--- adjudicamos la memoria para el array
   ArrayResize(time_buff,def_size);
//--- abrimos el archivo
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Archivo %s abierto para la lectura",InpFileName);
      PrintFormat("Ruta del archivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- variables auxiliares
      int    arr_size;
      uchar  arr[];
      //--- leemos los datos desde el archivo
      while(!FileIsEnding(file_handle))
        {
         //--- averiguamos cuántos símbolos han sido utilizados para la escritura del tiempo
         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);
         //--- recordamos el valor del tiempo
         time_buff[size]=StringToTime(CharArrayToString(arr));
         size++;
         //--- aumentamos el tamaño de los arrays si están sobrecargados
         if(size==def_size)
           {
            def_size+=100;
            ArrayResize(time_buff,def_size);
           }
        }
      //--- cerramos el archivo
      FileClose(file_handle);
      PrintFormat("Datos leídos, archivo %s cerrado",InpFileName);
     }
   else
     {
      PrintFormat("Fallo al abrir el archivo %s, Código del error = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- enlace del array al búfer de indicadores
   SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- establecimiento de valores del indicador que no van a mostrarse en el gráfico
   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);
   ArraySetAsSeries(close,false);
//--- ciclo para las barras no procesadas todavía
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- por defecto 0
      buff[i]=0;
      //--- prueba de que si hay más datos
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //--- si las fechas coinciden, utilizamos el valor desde el archivo
            if(time[i]==time_buff[j])
              {
               //--- obtenemos el precio
               buff[i]=close[i];
               //--- aumentamos el contador
               ind=j+1;
               break;
              }
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Véase también

IntegerToString, StringToInteger, Tipos enteros, FileWriteInteger