FileSeek

Mueve la posición del puntero de archivos a una cantidad de bytes especificada respecto a la posición indicada.

bool  FileSeek(
   int                  file_handle,     // manejador del archivo
   long                 offset,          // en bytes
   ENUM_FILE_POSITION   origin           // posición de referencia
   );

Parámetros

file_handle

[in]  Descriptor de archivo devuelto por la función FileOpen().

offset

[in]  Desplazamiento en bytes (puede también adquirir un valor negativo).

origin

[in]  Punto de referencia para el desplazamiento. Puede ser uno de los valores de la enumeración ENUM_FILE_POSITION.

Valor devuelto

Devuelve true en caso de éxito, de lo contrario devuelve false. Para obtener la información sobre el error hay que llamar a la función GetLastError().

Nota

Si el resultado de ejecución de la función FileSeek() es un desplazamiento negativo (sobrepasando "el límite izquierdo" del archivo), el puntero de archivos será puesto en el principio del archivo.

Si la posición se pone fuera del "límite derecho" del archivo (más que el tamaño del archivo), la siguiente escritura en el archivo será realizada no desde el final sino desde la posición puesta. En este caso entre el final anterior del archivo y posición puesta habrán unos valores indeterminados.

Ejemplo:

//+------------------------------------------------------------------+
//|                                                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"
//--- mostramos la ventana de parámetros de entrada al iniciar el script
#property script_show_inputs
//--- parámetros de entrada
input string InpFileName="file.txt";    // nombre del archivo
input string InpDirectoryName="Data";   // nombre de la carpeta
input int    InpEncodingType=FILE_ANSI// ANSI=32 o UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- especificamos el valor de la variable para generar los números aleatorios
   _RandomSeed=GetTickCount();
//--- variable para las posiciones de inicio de cadenas
   ulong pos[];
   int   size;
//--- reseteamos el valor del error
   ResetLastError();
//--- abrimos el archivo
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("El archivo %s está abierto para la lectura",InpFileName);
      //--- obtenemos la posición de inicio para cada cadena de caracteres en el archivo
      GetStringPositions(file_handle,pos);
      //--- averiguamos el número total de cadenas en el archivo
      size=ArraySize(pos);
      if(!size)
        {
         //--- si en el archivo no hay cadenas, finalizamos el trabajo
         PrintFormat("¡El archivo %s esta vacío!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- elegimos el número de una cadena al azar
      int ind=MathRand()%size;
      //--- desplazamos la posición al inicio de esta cadena
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- leemos e imprimimos la cadena con el número ind
         PrintFormat("String text with %d number: \"%s\"",ind,FileReadString(file_handle));
        }
      //--- cerramos el archivo
      FileClose(file_handle);
      PrintFormat("El archivo %s ha sido cerrado",InpFileName);
     }
   else
      PrintFormat("Fallo al abrir el archivo %s, Código del error = %d",InpFileName,GetLastError());
  }
//+------------------------------------------------------------------+
//| La función determina las posiciones de inicio para cada una de las cadenas en el archivo y  |
//| las coloca en el array arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- tamaño del array por defecto
   int def_size=127;
//--- adjudicamos la memoria para el array
   ArrayResize(arr,def_size);
//--- contador de cadenas
   int i=0;
//--- si no es el fin del archivo, entonces por lo menos hay una cadena
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return// el archivo está vacío, salimos
//--- determinamos el desplazamiento en bytes dependiendo de la codificación
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- repasamos las cadenas en el ciclo
   while(1)
     {
      //--- leemos la cadena
      FileReadString(handle);
      //--- prueba en el fin del archivo
      if(!FileIsEnding(handle))
        {
         //--- recordamos la posición de la siguiente cadena
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- aumentamos el tamaño del array si está sobrecargado
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break// fin del archivo, salimos
     }
//--- definimos el tamaño real del array
   ArrayResize(arr,i);
  }