FileSeek

La funzione sposta la posizione del puntatore di file per un determinato numero di byte rispetto alla posizione specificata.

bool  FileSeek(
   int                  file_handle,     // File handle
   long                 offset,          // In byte
   ENUM_FILE_POSITION   origin           // Posizione per riferimento
   );

Parametri

file_handle

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

offset

[in] Lo slttamento in byte (può assumere un valore negativo).

origin

[in] Il punto di partenza per lo spostamento. Può essere uno dei valori di ENUM_FILE_POSITION.

Valore restituito

In caso di successo la funzione restituisce true, altrimenti false. Per ottenere informazioni sull' errore chiamare la funzione GetLastError().

Nota

Se l'esecuzione della funzione FileSeek() risulta in uno slittamento negativo (va oltre il "livello di confine" del file), il puntatore del file viene impostato all'inizio del file.

Se una posizione viene impostata al di là del "limite destro" del file (più grande della dimensione del file), la scritta accanto al file non verrà effettuata a partire dalla fine del file, ma dalla posizione impostata. In questo caso, valori indefiniti verranno scritti per la fine del file precedente e la posizione impostata.

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                              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"
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="file.txt";    // nome del file
input string InpDirectoryName="Data";   // nome della directory
input int    InpEncodingType=FILE_ANSI// ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script                                         |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
//--- specifica il valore della variabile per generare numeri casuali
   _RandomSeed=GetTickCount();
//--- variabili per le posizioni dei punti di inizio della stringa
   ulong pos[];
   int   size;
//--- resetta il valore dell' errore
   ResetLastError();
//--- apre il file
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s il file è disponibile per la lettura",InpFileName);
      //--- riceve la posizione d'inizio per ogni stringa nel file
      GetStringPositions(file_handle,pos);
      //--- definisce il numero di stringhe nel file
      size=ArraySize(pos);
      if(!size)
        {
         //--- si ferma se il file non ha stringhe
         PrintFormat("il file %s è vuoto!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- fa una selezione casuale di un numero di stringa
      int ind=MathRand()%size;
      //--- slitta la posizione al punto iniziale della stringa
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- legge e fa il print della stringa con il numero ind
         PrintFormat("Testo stringa con numero %d : \"%s\"",ind,FileReadString(file_handle));
        }
      //--- chiude il file
      FileClose(file_handle);
      PrintFormat("il file %s è stato chiuso",InpFileName);
     }
   else
      PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError());
  }
//+-------------------------------------------------------------------------------+
//| La funzione definisce i punti di inizio per ogni stringa nel file e           |
//| li piazza nell'array arr                                                      |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- grandezza array di default
   int def_size=127;
//--- alloca la memoria per l'array
   ArrayResize(arr,def_size);
//--- contatore stringa
   int i=0;
//--- se questa non è la fine del file, allora c'è ancora una stringa
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// il file è vuoto, esce
//--- definisce lo slittamento in byte a seconda della codifica
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- va attraverso le stringhe nel loop
   while(1)
     {
      //--- legge la stringa
      FileReadString(handle);
      //--- controlla la fine del file
      if(!FileIsEnding(handle))
        {
         //--- memorizza la posizione della prossima stringa
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- incrementa la grandezza dell'array se è stato riempito
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// fine del file, uscita
     }
//--- definisce l'attuale grandezza dell'array
   ArrayResize(arr,i);
  }