【MQL4定数】ファイルのシーク位置定数(ENUM_FILE_POSITION)

【辞書】MQLリファレンス

ファイルのシーク位置定数(ENUM_FILE_POSITION)

ファイルのシーク位置定数(ENUM_FILE_POSITION)は、ファイルのどこからどこまでを読み込むのかを、設定するための定数です。

例えば、ファイルのヘッダー部分を読み飛ばすために、「ファイルの先頭から100文字までは無視する」という設定が可能です。

ファイルのシーク位置定数を使うには、以下の関数を使います。

  • FileSeek関数:ファイルのシーク位置を設定する関数

ファイルのシーク位置定数(ENUM_FILE_POSITION)

定数説明
SEEK_SETファイルの先頭
SEEK_CUR現在のファイルのシーク位置
SEEK_ENDファイルの最後

ファイルのシーク位置定数の使い方

主に、FileSeek関数で使用されます。

FileSeek関数の第3引数(origin)として、ファイルのシーク位置定数が使用されます。

例えば、以下のように使用します。

void OnInit()
  {
   //ファイルパスを指定
   string path = "folder/data.csv";

   //ファイルを読み込み可能・CSV形式で読み込む
   int handle = FileOpen(path,FILE_READ|FILE_CSV);
   
   //ファイルの読み込みエラーチェック
   if(handle != INVALID_HANDLE)
     {
      //文字列番号をランダムに選ぶ
      ulong ind = MathRand() % 100;

      //位置を文字列の始めにシフトする
      if(FileSeek(handle, ind, SEEK_SET) == true)
        {
         //ind 番号で文字列を読んで出力する
         PrintFormat("String text with %d number: \"%s\"", ind, FileReadString(handle));
        }

      //ファイルを閉じる
      FileClose(handle);
     }
  }

各定数ごとのサンプルプログラム

SEEK_SET(ファイルの先頭から指定位置へシーク)

SEEK_SETは、ファイルの先頭を基準にしてシーク位置を移動します。以下の例では、ファイルの先頭から50バイト目に移動してから読み込みを行います。

void OnStart()
  {
   string path = "test_data.bin";

   //ファイルをバイナリ形式・読み込みモードで開く
   int handle = FileOpen(path, FILE_READ | FILE_BIN);

   if(handle != INVALID_HANDLE)
     {
      //ファイルの先頭から50バイト目にシークする
      if(FileSeek(handle, 50, SEEK_SET))
        {
         //現在のシーク位置を取得して出力
         Print("SEEK_SET後の位置: ", FileTell(handle));

         //データを読み込む
         string data = FileReadString(handle, 10);
         Print("読み込んだデータ: ", data);
        }
      else
        {
         Print("FileSeek(SEEK_SET)に失敗しました");
        }

      FileClose(handle);
     }
   else
     {
      Print("ファイルオープンに失敗しました: ", GetLastError());
     }
  }

SEEK_CUR(現在位置から相対的にシーク)

SEEK_CURは、現在のシーク位置を基準にして移動します。以下の例では、データを一部読み込んだ後、さらに20バイト先に移動して読み込みを行います。

void OnStart()
  {
   string path = "test_data.bin";

   //ファイルをバイナリ形式・読み込みモードで開く
   int handle = FileOpen(path, FILE_READ | FILE_BIN);

   if(handle != INVALID_HANDLE)
     {
      //まず先頭から10バイト読み込む
      string firstData = FileReadString(handle, 10);
      Print("最初の10バイト: ", firstData);
      Print("現在の位置: ", FileTell(handle));

      //現在位置からさらに20バイト先にシークする
      if(FileSeek(handle, 20, SEEK_CUR))
        {
         Print("SEEK_CUR後の位置: ", FileTell(handle));

         //データを読み込む
         string data = FileReadString(handle, 10);
         Print("読み込んだデータ: ", data);
        }
      else
        {
         Print("FileSeek(SEEK_CUR)に失敗しました");
        }

      FileClose(handle);
     }
   else
     {
      Print("ファイルオープンに失敗しました: ", GetLastError());
     }
  }

SEEK_END(ファイルの末尾を基準にシーク)

SEEK_ENDは、ファイルの末尾を基準にして移動します。以下の例では、ファイルの末尾から30バイト手前に移動して、末尾付近のデータを読み込みます。

void OnStart()
  {
   string path = "test_data.bin";

   //ファイルをバイナリ形式・読み込みモードで開く
   int handle = FileOpen(path, FILE_READ | FILE_BIN);

   if(handle != INVALID_HANDLE)
     {
      //ファイルサイズを取得して出力
      ulong fileSize = FileSize(handle);
      Print("ファイルサイズ: ", fileSize, " バイト");

      //ファイルの末尾から30バイト手前にシークする
      if(FileSeek(handle, -30, SEEK_END))
        {
         Print("SEEK_END後の位置: ", FileTell(handle));

         //末尾付近のデータを読み込む
         string data = FileReadString(handle, 30);
         Print("末尾付近のデータ: ", data);
        }
      else
        {
         Print("FileSeek(SEEK_END)に失敗しました");
        }

      FileClose(handle);
     }
   else
     {
      Print("ファイルオープンに失敗しました: ", GetLastError());
     }
  }

【補足】ファイルのシーク位置定数の列挙型(ENUM_FILE_POSITION)

ファイルのシーク位置定数は、ENUM_FILE_POSITION​という列挙型に含まれています。

列挙型は、定数群をひとまとめにしたものです。

以下のように使います。

ENUM_FILE_POSITION filePosition = SEEK_SET;

上記のようにプログラムすると、filePosition変数に SEEK_SETの値が代入されます。