//+------------------------------------------------------------------+
//| 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);
}
|