Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
780
Rating:
(33)
Veröffentlicht:
2016.06.20 13:23
Aktualisiert:
2016.11.22 07:34
\MQL5\Files\Data\
file.txt (0.1 KB) ansehen
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Das Skript öffnet die Textdatei, analysiert die Positionen der String-Startpunkte in dieser Datei und zeigt den Stringtext mit einer Zufallszahl an. Um das Array von den Startpositionen für jede Zeichenfolge in der Datei zu bestimmen, wurde die GetStringPositions()-Funktion geschrieben. Die Funktion sucht den String-Startpunkt unter Berücksichtigung der Art der Codierung der Dateien, die im "InpEncodingType" Eingabeparameter angegeben werden kann.

Neben der FileTell() Funktion, verwendet das Skript auch die FileGetInteger() Funktion um die Art der Codierung zu ermitteln, die FileIsEnding() Funktion um das Ende der Datei zu estimmen und die FileSeek() Funktion um die Positon der Zeilenschaltung in der Datei zu verschieben, wenn der String mit einer Zufallszahl angezeigt wird.

Code:

//--- Zeige Fenster mit den Eingabeparametern, wenn Sie das Skript starten
#property script_show_inputs
Eingabeparameter:
input string InpFileName="file.txt";    // Dateiname
input string InpDirectoryName="Data";   // Verzeichnisname
input int    InpEncodingType=FILE_ANSI; // ANSI=32 oder UNICODE=64
//+------------------------------------------------------------------+
//| Skript Programmstart Funktion                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Wert für Variable zur Generierung von Zufallszahlen festlegen
   _RandomSeed=GetTickCount();
//--- Variablen für Positionen der String-Startpunkte
   ulong pos[];
   int   size;
//--- Fehlerwert zurücksetzen
   ResetLastError();
//--- Datei öffnen
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s Datei ist bereit zum Lesen",InpFileName);
      //--- Startpunkt für jeden String der Datei ermitteln
      GetStringPositions(file_handle,pos);
      //--- Anzahl der Strings in der Datei bestimmen
      size=ArraySize(pos);
      if(!size)
        {
         //--- beenden, wenn die Datei keine Strings enthält
         PrintFormat("%s Datei ist leer!",InpFileName);
         FileClose(file_handle);
         return;
        }
      //--- Zufälliger Auswahl einer Stringnummer
      int ind=MathRand()%size;
      //--- Verschiebung der Position an den Startpunkt des Strings
      FileSeek(file_handle,pos[ind],SEEK_SET);
      //--- lesen und Ausgeben des String mit ind Nummer
      PrintFormat("Stringtext mit %d Nummer: \"%s\"",ind,FileReadString(file_handle));
      //--- Datei schließen
      FileClose(file_handle);
      PrintFormat("%s Datei ist geschlossen",InpFileName);
     }
   else
      PrintFormat("Fehler beim Öffnen der Datei %s , Fehlercode = %d",InpFileName,GetLastError());
  }
//+-------------------------------------------------------------------------------+
//| Die Funktion definiert Startpunkte für jeden String in der Datei und          |
//| kopiert diese in das Array arr                                                |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- Standard Arraygröße
   int def_size=127;
//--- Speicher für das Array reservieren
   ArrayResize(arr,def_size);
//--- Stringzähler
   int i=0;
//--- wenn das nicht das Dateiende ist, dann gibt es mindestens einen String
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return; // die Datei ist leer, Ende
//--- definiere die Verschiebung in Bytes abhängig von der Codierung
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- in der Schleife die Strings durchgehen
   while(1)
     {
      //--- String lesen
      FileReadString(handle);
      //--- auf Dateiende prüfen
      if(!FileIsEnding(handle))
        {
         //--- Position des nächsten Strings speichern
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- bei Überlauf Größe des Strings vergrößern
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break; // Ender der Datei, Ende
     }
//--- definiere aktuelle Größe des Arrays
   ArrayResize(arr,i);
  }

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/1634

Demo_FileSize Demo_FileSize

Das Skript demonstriert ein Beispiel für die Verwendung der FileSize() Funktion

Demo_FileReadDouble Demo_FileReadDouble

Der Indikator demonstriert ein Beispiel für die Verwendung der FileReadDouble() Funktion

Demo_FileWriteInteger Demo_FileWriteInteger

Das Skript demonstriert ein Beispiel für die Verwendung der FileWriteInteger() Funktion

Demo_FileReadInteger Demo_FileReadInteger

Der Indikator demonstriert ein Beispiel für die Verwendung der FileReadInteger() Funktion