MetaTrader 5 herunterladen

FileTell

Gibt die laufende Position des Dateianzeigers der entsprechenden geöffneten Datei.

ulong  FileTell(
   int  file_handle      // Datei-Handle
   );

Parameter

file_handle

[in]  Dateiattribut, das durch die Funktion FileOpen() zurückgegeben wird.

Rückgabewert

Laufende Position des Dateiattributs in Bytes vom Anfang der Datei.

Hinweis

Für die Erhaltung der fehlerbezogenen Information muss die Funktion GetLastError() aufgerufen werden.

Beispiel:

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