//+------------------------------------------------------------------+
//| 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"
//--- スクリプトの起動時に入力パラメータのウィンドウを表示する
#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;
//--- 位置を文字列の始めにシフトする
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- 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);
}
|