FileTell

Devuelve la posición actual del puntero de archivos de un archivo abierto correspondiente.

ulong  FileTell(
   int  file_handle      // manejador del archivo
   );

Parámetros

file_handle

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

Valor devuelto

Posición actual del descriptor de archivos desde el principio del archivo.

Nota

Para obtener la información sobre el error hay que llamar a la función GetLastError().

Ejemplo:

//+------------------------------------------------------------------+
//|                                                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"
//--- 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
      FileSeek(file_handle,pos[ind],SEEK_SET);
      //--- leemos e imprimimos la cadena con el número ind
      PrintFormat("Texto de la cadena con el número %d: \"%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);
  }