//+------------------------------------------------------------------+
//| 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"
//--- Beim Starten des Scripts zeigen Sie den Fenster mit den Eingabeparametern an
#property script_show_inputs
//--- Eingabeparameters
input string InpFileName="file.txt"; // der Dateiname
input string InpDirectoryName="Data"; // der Verzeichnisname
input int InpEncodingType=FILE_ANSI; // ANSI=32 oder UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- feststellen Sie den Variablenwert um Zufallszahlen zu generieren
_RandomSeed=GetTickCount();
//--- Variabel für die Positionen des Anfanges der Zeilen
ulong pos[];
int size;
//--- stürzen Sie den Fehlerwert
ResetLastError();
//--- öffnen Sie die Datei
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s Datei ist zum Lesen geöffnet",InpFileName);
//--- bekommen Sie die Position des Anfanges für jede Zeile in der Datei
GetStringPositions(file_handle,pos);
//--- ermitteln Sie wieviel allen der Zeilen in der Datei sind
size=ArraySize(pos);
if(!size)
{
//--- Wenn es in der Datei keine Zeilen gibt, so beenden wir die Arbeit
PrintFormat("Die Datei %s ist leer!",InpFileName);
FileClose(file_handle);
return;
}
//--- wählen Sie zufällig die Nummer der Zeile
int ind=MathRand()%size;
//--- verschieben Sie die Position an den Anfang der Zeile
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- lesen und drucken Sie eine Zeile mit der Nummer ind
PrintFormat("Der Text der Zeile mit der Nummer %d: \"%s\"",ind,FileReadString(file_handle));
//--- schließen Sie die Datei
FileClose(file_handle);
PrintFormat("die Datei %s ist geschlossen",InpFileName);
}
else
PrintFormat("Fehler beim Öffnen der Datei %s, Fehlercode = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| Funktion bestimmt die Startposition für jede der Zeilen in der |
//| Datei und legt sie in das Array arr |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- die standardmässige Größe des Arrays
int def_size=127;
//--- trennen Sie den Speichern für den Arrays
ArrayResize(arr,def_size);
//--- Der Zähler der Zeilen
int i=0;
//--- Wenn nicht das Ende der Datei, dann es gibt mindestens eine Zeile
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // die Datei ist leer, gehen
//--- bestimmen Sie die Verschiebung in den Bytes je nach der Kodierung
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- im Zyklus lesen Sie die Zeilen aus
while(1)
{
//--- lesen Sie die Zeile
FileReadString(handle);
//--- Die Prüfung auf dem Dateiende
if(!FileIsEnding(handle))
{
//--- merken Sie die Position der nächsten Zeile
arr[i]=FileTell(handle)+shift;
i++;
//--- die Größe des Arrays zu erhöhen, wenn es überfüllt ist
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // der Dateiende, gehen
}
//--- feststellen Sie den wahrhaften Umfang des Massives
ArrayResize(arr,i);
}
|