FileReadInteger

Lit du fichier binaire la valeur du int, short ou char en fonction de la longueur indiquée dans les bytes. La lecture est produite de la position courante de l'indicateur de fichier.

int  FileReadInteger(
   int  file_handle,        // handle du fichier
   int  size=INT_VALUE      // taille d'un nombre entier en bytes
   );

Paramètres

file_handle

[in]  Le descripteur de fichier rendu par la fonction FileOpen().

size=INT_VALUE

[in]  Le nombre de bytes (jusqu'à 4 inclus) qu'il faut lire. On prévoit les constantes correspondantes: CHAR_VALUE=1, SHORT_VALUE=2 et INT_VALUE=4, ainsi la fonction peut lire la valeur entière comme char, short ou int.

La valeur rendue

La valeur du type int. Il est nécessaire évidemment d'amener le résultat de cette fonction au type cible, c'est-à-dire à ce type de données, qu'il faut lire. Puisque revient la valeur comme int, on peut le transformer en n'importe quelle valeur entière. Le pointeur de fichier est déplacé par le nombre de bytes lus.

Note

A la lecture de moins 4 bytes, le résultat acquis sera toujours positif. Si un ou deux bytes sont lus, on peut exactement définir le signe du nombre par voie de la réduction évidente en conséquence vers le type char (1 byte) ou le type short (2 bytes). La réception du signe pour le nombre de trois bytes est non triviale, puisqu'il n'y a pas de type de basecorrespondant.

Exemple (on utilise le fichier reçu à la suite du travail de l'exemple pour la fonction 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
//--- les paramètres pour la lecture des données
input string InpFileName="Trend.bin"// le nom du fichier
input string InpDirectoryName="Data"// le nom du répertoire
//--- les 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;
//--- allouons la mémoire pour le tableau
   ArrayResize(time_buff,def_size);
//--- ouvrons le fichier
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Le fichier %s est ouvert pour la lecture",InpFileName);
      PrintFormat("La voie vers le fichier: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- les variables auxiliaires
      int    arr_size;
      uchar  arr[];
      //--- lisons les données du fichier
      while(!FileIsEnding(file_handle))
        {
         //--- apprenons combien de symboles sont utilisés pour l'inscription du temps
         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);
         //--- retiendrons la valeur du temps
         time_buff[size]=StringToTime(CharArrayToString(arr));
         size++;
         //--- augmentons les tailles des tableaux s'ils sont remplis
         if(size==def_size)
           {
            def_size+=100;
            ArrayResize(time_buff,def_size);
           }
        }
      //--- fermons le fichier
      FileClose(file_handle);
      PrintFormat("Les données sont lues, le fichier %s est fermé",InpFileName);
     }
   else
     {
      PrintFormat("On n' a pas réussi à ouvrir le fichier %s, le code de l'erreur = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- Le rattachement du tableau au tampon d'indicateur
   SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- l'établissement des valeurs de l'indicateur qui ne seront pas visibles sur le graphique
   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);
//--- le cycle pour les barres non-traitées
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- par défaut 0
      buff[i]=0;
      //--- la vérification s'il y a encore des données
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //---si les dates correspondent, utilisons la valeur du fichier
            if(time[i]==time_buff[j])
              {
               //--- recevrons le prix
               buff[i]=close[i];
               //--- augmentons le compteur
               ind=j+1;
               break;
              }
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Voir aussi

IntegerToString, StringToInteger, Les types entiers, FileWriteInteger