//+--------------------------------------------------------------------------------+
//| 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"
//--- 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
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- legge e fa il print della stringa con il numero ind
PrintFormat("Testo della stringa con il 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);
}
|