FileSeek

Verschiebt die Position des Dateianzeigers um die angegebene Anzahl der Bytes gegen die angegebene Position.

bool  FileSeek(
   int                  file_handle,     // Datei-Handle
   long                 offset,          // in Bytes
   ENUM_FILE_POSITION   origin           // Position für Abzählung 
   );

Parameter

file_handle

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

offset

[in]  übertragung in Bytes (kann auch negativen Wert annehmen).

origin

[in]  Anfangspunkt für übertragung. Kann einen der Enumerationswerte ENUM_FILE_POSITION annehmen.

Rückgabewert

Gibt true im Erfolgsfall zurück, anderenfalls false. Für die Erhaltung der fehlerbezogenen Information muss die Funktion GetLastError() aufgerufen werden.

Hinweis

Wenn das Ergebnis der Funktionsdurchführung FileSeek() eine negative Zahl ist (ausserhalb der  "linken Grenze" der Datei), wird Dateianzeiger am Dateianfang gestellt.  

Wenn die Position ausserhalb der "rechten Grenze" der Datei (mehr als Dateigröße) gestellt wird , wird das nächste Schreiben in die Datei nicht von der Dateiende, sondern von der gestellten Position durchgeführt wird. Dabei werden unbestimmte Werte zwischen dem frühren Dateiende und der gestellten Position geschrieben.

Beispiel:

//+------------------------------------------------------------------+
//|                                                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"
//--- 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
      if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
        {
      //--- 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 Arrays
   ArrayResize(arr,i);
  }