FileSeek

この関数は、ファイルポインタの位置を指定された位置から指定されたバイト数で移動します。

bool  FileSeek(
  int                file_handle,    // ファイルハンドル
  long                offset,          // バイト単位
  ENUM_FILE_POSITION  origin          // 参考位置
  );

パラメータ

file_handle

[in] FileOpen() から戻されたファイル記述子

offset

[in] バイト単位でのシフト(負の値も可能)

origin

[in] シフトの開始点。ENUM_FILE_POSITION 列挙のいずれかの値。

戻り値

成功の場合は true、それ以外の場合は false。 エラー情報を取得するにはGetLastError() 関数が呼ばれます。

注意事項

FileSeek() 関数の実行が(ファイルの「レベルの境界」を超えて)負のシフトを生じる場合は、ファイルポインタはファイルの先頭に設定されます。

位置が、ファイルサイズより大きい、ファイルの「右境界」を超えて設定されている場合は、次のファイルへの書き込みは、ファイルの末尾ではなく、設定された位置から行われます。この場合、前のファイルの終わりと位置設定に不定値が書き込まれます。

例:

//+------------------------------------------------------------------+
//|                                                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"
//--- スクリプトの起動時に入力パラメータのウィンドウを表示する
#property script_show_inputs
//--- 入力パラメータ
input string InpFileName="file.txt";   // ファイル名
input string InpDirectoryName="Data";   // ディレクトリ名
input int   InpEncodingType=FILE_ANSI; // ANSI=32 または UNICODE=64
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 乱数を生成するための変数の値を指定する
  _RandomSeed=GetTickCount();
//--- 文字列の開始位置のための変数
  ulong pos[];
  int   size;
//--- エラー値をリセットする
  ResetLastError();
//--- ファイルを開く
  int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
  if(file_handle!=INVALID_HANDLE)
    {
    PrintFormat("%s file is available for reading",InpFileName);
    //--- ファイル内の各文字列の開始位置を受け取る
     GetStringPositions(file_handle,pos);
    //--- ファイル内の文字列の数を定義する
     size=ArraySize(pos);
    if(!size)
       {
        //--- ファイルに文字列がない場合、停止する
        PrintFormat("%s file is empty!",InpFileName);
        FileClose(file_handle);
        return;
       }
    //--- 文字列番号をランダムに選ぶ
    int ind=MathRand()%size;
    //--- 位置を文字列の始めにシフトする
    if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
       {
    //--- ind 番号で文字列を読んで出力する
        PrintFormat("String text with %d number: \"%s\"",ind,FileReadString(file_handle));
       }
    //--- ファイルを閉じる
    FileClose(file_handle);
    PrintFormat("%s file is closed",InpFileName);
    }
  else
    PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError());
 }
//+-------------------------------------------------------------------------------+
//| この関数はファイル内の文字列の開始点を定義して                                            |
//| 配列に格納する                                                                    |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
 {
//--- デフォルトの配列サイズ
  int def_size=127;
//--- 配列へのメモリ追加
  ArrayResize(arr,def_size);
//--- 文字列カウンタ
  int i=0;
//--- これがファイルの最後でない場合、少なくても 1 つの文字列がある
  if(!FileIsEnding(handle))
    {
     arr[i]=FileTell(handle);
     i++;
    }
  else
    return; // ファイルが空なので終了する
//--- エンコーディングに応じてバイト単位のシフトを定義する
  int shift;
  if(FileGetInteger(handle,FILE_IS_ANSI))
     shift=1;
  else
     shift=2;
//--- ループで文字列をみる
  while(1)
    {
    //--- 文字列を読む
    FileReadString(handle);
    //--- ファイルの終わりをチェックする
    if(!FileIsEnding(handle))
       {
        //--- 文字列の次の位置を格納する
        arr[i]=FileTell(handle)+shift;
        i++;
        //--- オーバーフローしている場合は、配列のサイズを増やす
        if(i==def_size)
          {
           def_size+=def_size+1;
          ArrayResize(arr,def_size);
          }
       }
    else
        break; // ファイルの終わり。終了する。
    }
//--- 配列の実際のサイズを定義する
  ArrayResize(arr,i);
 }