FileWriteArray

この関数は string 以外の任意の型の配列を BIN ファイルに書きます(文字列や動的配列を含まない構造体の配列も可能)

uint  FileWriteArray(
  int          file_handle,        // ファイルハンドル
  const void&  array[],            // 配列
  int          start=0,            // 配列の開始インデックス
  int          count=WHOLE_ARRAY   // 要素数
  );

パラメータ

file_handle

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

array[]

[out] 記録する配列

start=0

[in]  配列内の最初のインデックス(最初に記録された要素の番号)

count=WHOLE_ARRAY

[in]  書かれる項目数(WHOLE_ARRAY は.開始点から配列の最後までの全ての項目が書き込まれることを意味します)。

戻り値

記録された項目数

注意事項

文字列配列は TXT ファイルに記録出来ます。この場合、文字列は自動的に行末文字「\r\n」で終了されます。 ANSI または UNICODE のファイルタイプに応じて、文字列は ansi エンコーディングに変換されます。

例:

//+------------------------------------------------------------------+
//|                                          Demo_FileWriteArray.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"
//--- 入力パラメータ
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| 価格データを格納する構造体                                             |
//+------------------------------------------------------------------+
struct prices
 {
  datetime          date; // 日付
  double            bid; // 売値
  double            ask; // 買値
 };
//--- グローバル変数
int    count=0;
int    size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 配列へのメモリ追加
  ArrayResize(arr,size);
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                                     |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//--- count<n の場合、残り数を書く
  WriteData(count);
 }
//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
 {
//--- データを配列に保存する
  arr[count].date=TimeCurrent();
  arr[count].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  arr[count].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- 現在のデータを表示する
  Print("Date = ",arr[count].date," Bid = ",arr[count].bid," Ask = ",arr[count].ask);
//--- カウンタを増やす
  count++;
//--- 配列がすでに記入済みなら、データをファイルに書いてゼロで書きなおす
  if(count==size)
    {
     WriteData(size);
     count=0;
    }
 }
//+------------------------------------------------------------------+
//| 配列の n 要素をファイルに書く                                            |
//+------------------------------------------------------------------+
void WriteData(const int n)
 {
//--- ファイルを開く
  ResetLastError();
  int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
  if(handle!=INVALID_HANDLE)
    {
    //--- 配列データをファイルの終わりに書く
    FileSeek(handle,0,SEEK_END);
    FileWriteArray(handle,arr,0,n);
    //--- ファイルを閉じる
    FileClose(handle);
    }
  else
    Print("Failed to open the file, error ",GetLastError());
 }

参照

変数FileSeek