FileTell

Rend la position courante de l'indicateur de fichier du fichier correspondant ouvert.

ulong  FileTell(
   int  file_handle      // handle du fichier
   );

Paramètres

file_handle

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

La valeur rendue

La position courante du descripteur de fichier dans les bytes du début du fichier.

Note

Pour recevoir l'information sur l'erreur, il faut appeler la fonction GetLastError().

Exemple:

//+------------------------------------------------------------------+
//|                                                Demo_FileTell.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"
//--- montrons la fenêtre des paramètres d'entrée au lancement du script
#property script_show_inputs
//--- les paramètres d'entrée
input string InpFileName="file.txt";    // le nom du fichier
input string InpDirectoryName="Data";   // le nom du répertoire
input int    InpEncodingType=FILE_ANSI// ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- établissons la valeur de la variable pour la génération des nombres accidentels
   _RandomSeed=GetTickCount();
//--- les variables pour les positions du début des chaînes
   ulong pos[];
   int   size;
//--- oblitérons la valeur de l'erreur
   ResetLastError();
//--- ouvrons le fichier
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Le fichier %s est ouvert pour la lecture",InpFileName);
      //--- recevrons la position du début pour chaque chaîne dans le fichier
      GetStringPositions(file_handle,pos);
      //--- définissons le nombre de chaînes dans le fichier
      size=ArraySize(pos);
      if(!size)
        {
         //--- S'il n'y a pas de chaînes dans le fichier, terminons le travail
         PrintFormat("Le fichier %s est vide!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- choisirons le numéro de chaîne par hasard
      int ind=MathRand()%size;
      //--- déplaçons la position au début de cette chaîne
      FileSeek(file_handle,pos[ind],SEEK_SET);
      //--- lisons et imprimons la chaîne avec le numéro ind
      PrintFormat("Le texte de la chaîne avec le numéro %d: \"%s\"",ind,FileReadString(file_handle));
      //--- fermons le fichier
      FileClose(file_handle);
      PrintFormat("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());
  }
//+------------------------------------------------------------------+
//| La fonction définit les positions du début pour chacune des chaînes dans le fichier et |
//| les place dans un tableau arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- la taille du tableau par défaut
   int def_size=127;
//--- allouons la mémoire pour le tableau
   ArrayResize(arr,def_size);
//--- le compteur des chaînes
   int i=0;
//--- s'il n'y a pas de la fin du fichier, il y a quand même une chaîne
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// le fichier est vide, sortons
//--- définissons le décalage en octets en fonction de l'encodage
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- trions les chaînes dans le cycle
   while(1)
     {
      //--- lisons la chaîne
      FileReadString(handle);
      //--- la vérification à la fin du fichier
      if(!FileIsEnding(handle))
        {
         //--- retiendrons la position de la chaîne suivante
         arr[i]=FileTell(handle)+shift;
         i++;
         //---augmentons la taille du tableau, s'il est rempli
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// la fin du fichier, sortons
     }
//---établissons la taille véritable du tableau
   ArrayResize(arr,i);
  }