FileSeek

A função move a posição do ponteiro de arquivo por um certo número de bytes de informação em relação à posição especificada.

bool  FileSeek(
   int                  file_handle,     // Manipular arquivo
   long                 offset,          // Em bytes
   ENUM_FILE_POSITION   origin           // Posição para referência
   );

Parâmetros

file_handle

[in]  Descritor de arquivo retornado pelo FileOpen().

offset

[in] A mudança de bytes (pode tomar um valor negativo).

origin

[in] O ponto de partida para o deslocamento. Pode ser um dos valores de ENUM_FILE_POSITION.

Valor do Retorno

Retorna true se bem sucedido, caso contrário false. Para obter informação sobre o erro chamar GetLastError().

Observação

Se a execução da função FileSeek() resulta em uma mudança negativa (indo além do "nível limite" do arquivo), o ponteiro do arquivo será definido para o arquivo de início.

Se a posição for definido para além do "limite direito" do arquivo (maior do que o tamanho do arquivo),a próxima escrita para o arquivo será executado não a partir do final do arquivo, mas a partir da posição definida. Neste caso, os valores indefinidos serão escritos para o final do arquivo anterior e a posição definida.

Exemplo:

//+------------------------------------------------------------------+
//|                                                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"
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="file.txt";    // nome do arquivo
input string InpDirectoryName="Data";   // nome do diretório
input int    InpEncodingType=FILE_ANSI// ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)                        |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- especificar o valor da variável para gerar números aleatórios
   _RandomSeed=GetTickCount();
//--- variáveis ​​para posições de pontos de início das strings
   ulong pos[];
   int   size;
//--- redefine o valor de erro
   ResetLastError();
//--- abre o arquivo
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s arquivo está disponível para leitura",InpFileName);
      //--- receber a posição inicial para cada string no arquivo
      GetStringPositions(file_handle,pos);
      //--- definir o número de strings no arquivo
      size=ArraySize(pos);
      if(!size)
        {
         //--- parar se o arquivo não tem strings
         PrintFormat("%s arquivo está vazio!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- fazer uma seleção aleatória de um número de string
      int ind=MathRand()%size;
      //--- deslocar posição de ponto de partida da string
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- ler e imprimir a string com o número ind
         PrintFormat("Texto string com %d número: \"%s\"",ind,FileReadString(file_handle));
        }
      //--- fechar o arquivo
      FileClose(file_handle);
      PrintFormat("%s arquivo está vazio",InpFileName);
     }
   else
      PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
  }
//+-------------------------------------------------------------------------------+
//| A função define pontos de partida para cada uma das strings no arquivo e      |
//| coloca-los em arr array                                                       |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- array tamanho padrão
   int def_size=127;
//--- alocar memória para o array
   ArrayResize(arr,def_size);
//--- contador string
   int i=0;
//--- se isto não é o fim do arquivo, então há pelo menos uma string
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// o arquivo está vazio, sair
//--- define o deslocamento em bytes, dependendo em codificação
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- ir através das strings no loop
   while(1)
     {
      //--- ler a string
      FileReadString(handle);
      //--- verificar o final do arquivo
      if(!FileIsEnding(handle))
        {
         //--- armazenar a próxima posição da string
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- aumentar o tamanho da array, se ela é transbordada
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// final do arquivo, sair
     }
//--- definir o tamanho real de array
   ArrayResize(arr,i);
  }