//+------------------------------------------------------------------+ 
//|                                                Demo_FileSeek.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" 
//--- display the window of input parameters when launching the script 
#property script_show_inputs 
//--- input parameters 
input string InpFileName="file.txt";    // file name 
input string InpDirectoryName="Data";   // directory name 
input int    InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- specify the value of the variable for generating random numbers 
   _RandomSeed=GetTickCount(); 
//--- variables for positions of the strings' start points 
   ulong pos[]; 
   int   size; 
//--- reset the error value 
   ResetLastError(); 
//--- open the file 
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType); 
   if(file_handle!=INVALID_HANDLE) 
     { 
      PrintFormat("%s file is available for reading",InpFileName); 
      //--- receive start position for each string in the file 
      GetStringPositions(file_handle,pos); 
      //--- define the number of strings in the file 
      size=ArraySize(pos); 
      if(!size) 
        { 
         //--- stop if the file does not have strings 
         PrintFormat("%s file is empty!",InpFileName); 
         FileClose(file_handle); 
         return; 
        } 
      //--- make a random selection of a string number 
      int ind=MathRand()%size; 
      //--- shift position to the starting point of the string 
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true) 
        { 
      //--- read and print the string with ind number 
         PrintFormat("String text with %d number: \"%s\"",ind,FileReadString(file_handle)); 
        } 
      //--- close the file 
      FileClose(file_handle); 
      PrintFormat("%s file is closed",InpFileName); 
     } 
   else 
      PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError()); 
  } 
//+-------------------------------------------------------------------------------+ 
//| The function defines starting points for each of the strings in the file and  | 
//| places them in arr array                                                      | 
//+-------------------------------------------------------------------------------+ 
void GetStringPositions(const int handle,ulong &arr[]) 
  { 
//--- default array size 
   int def_size=127; 
//--- allocate memory for the array 
   ArrayResize(arr,def_size); 
//--- string counter 
   int i=0; 
//--- if this is not the file's end, then there is at least one string 
   if(!FileIsEnding(handle)) 
     { 
      arr[i]=FileTell(handle); 
      i++; 
     } 
   else 
      return; // the file is empty, exit 
//--- define the shift in bytes depending on encoding 
   int shift; 
   if(FileGetInteger(handle,FILE_IS_ANSI)) 
      shift=1; 
   else 
      shift=2; 
//--- go through the strings in the loop 
   while(1) 
     { 
      //--- read the string 
      FileReadString(handle); 
      //--- check for the file end 
      if(!FileIsEnding(handle)) 
        { 
         //--- store the next string's position 
         arr[i]=FileTell(handle)+shift; 
         i++; 
         //--- increase the size of the array if it is overflown 
         if(i==def_size) 
           { 
            def_size+=def_size+1; 
            ArrayResize(arr,def_size); 
           } 
        } 
      else 
         break; // end of the file, exit 
     } 
//--- define the actual size of the array 
   ArrayResize(arr,i); 
  }  |