ファイルへの書き込みを改行で行う - ページ 3

 
Alexey Viktorov:

そして、そのコンセプトは、あくまでも表面上の自分のため......。

自分で実験してみる」という提案(コンセプト)は、声を出すまでもなく、そのままクリアしているという意味です。イゴール このオプションは、最もシンプルであるという理由で、私もよく理解していました。しかし、私には、上記のような状況にはあまり適していないと思います。

 
EfremovSergey:

ここで問題なのは、ファイルに書き込むプログラムが10個あり、さらにそこから読み出すプログラムが10個ある場合、それぞれの読み出しプログラムが蓄積されたすべてのデータをずっと処理するのは困るということだ。

そしてこの場合、ファイルを完全に放棄して、SQLiteデータベースで 作業した方が良い。これはファイルの操作によく似ていて、共有フォルダに作成することもできますが、文字列の加工、検索、削除はもっと簡単です。

 

Sergey、このファイルを目で見る必要がないのなら、データの配列を一度に書き込んでしまいましょう

int eHandle=FileOpen(eFileName,FILE_BIN|FILE_WRITE);
if(eHandle!=INVALID_HANDLE)
   {
   //сначала записываем размер массива
   FileWriteInteger(eHandle,ArraySize(eArray),INT_VALUE);
   //выгружаем данные из массива в файл
   FileWriteArray(eHandle,eArray,0,WHOLE_ARRAY);
   FileClose(eHandle);
   }

そして、いつでもファイルからアレイを取り出せます。

if(FileIsExist(eFileName))
   {
   eHandle=FileOpen(eFileName,FILE_BIN|FILE_READ);
   if(eHandle!=INVALID_HANDLE)
      {
      //сначала читаем и устанавливаем размер массива
      ArrayResize(eArray,FileReadInteger(eHandle,INT_VALUE));
      //затем выгружаем данные из файла в массив
      FileReadArray(eHandle,eArray,0,WHOLE_ARRAY);
      FileClose(eHandle);
      }
   }

そして、好きなようにアレイを操作してください。最後の要素を削除し、さらに追加する。

 
Alexey Viktorov:

そしてこの場合、ファイルを完全に放棄して、SQLiteデータベースで作業するのがよいでしょう。これは、ファイルを扱うのとよく似ていて、共有フォルダに作成することもできますが、加工、検索、行の削除がより簡単です。

MQL4はSQLiteとの連携に 対応していますか? TXTやCSV形式だけではないのでしょうか?

ファイルへのアクセスはシンボリックリンクで行われ、ファイルがどのフォルダーにあるかは関係ありません。

 
Aleksei Stepanenko:

Sergey、このファイルを目で見る必要がないのなら、データの配列を一度に書き込んでしまいましょう

そして、いつでもファイルからアレイを取り出せます。

そして、好きなようにアレイを操作してください。最後の要素を削除し、別の要素を追加します。

つまり、配列はどんな場合でも一行ずつファイルに書き込まれるのか、それともこの場合、少なくとも最後か最初の要素を削除することが可能なのか、array=stringと何が違うのでしょうか?

 

質問の意味がよくわからないのですが。データの配列を持っていて、その上でどんな操作も簡単にできる。そして、4行のコードで簡単な書き込みとファイルからの読み出しを行う。それが強みです。なぜ、配列が どのようにファイルに書き込ま れるかを考えるのか?

配列に必要な変更を加えて、変更後の配列をファイルにアップロードすれば完了です。

 
Aleksei Stepanenko:

質問の意味がよくわからないのですが。データの配列を持っていて、その上でどんな操作も簡単にできる。そして、4行のコードで簡単な書き込みとファイルからの読み出しを行う。それが強みです。なぜ、配列が どのようにファイルに書き込ま れるかを考えるのか?

配列に必要な変更を加えて、変更後の配列をファイルにアップロードすれば完了です。

ここで難しいのは、20のアプリケーションが同時に1つの同じ配列を扱うことになり、どの編集版の配列が今現在関係あるのか判断できないことだ。

最初のExpert Advisorが配列を編集して公開し、その上に別のバージョンの配列が、前の配列を考慮せずに書き込まれて、それで終わりだとしたら......混乱しますよね......。

例えば、すべてのExpert Advisorが読み込んだ後に関連する行を削除できれば、誰にも迷惑をかけず、ファイルに冗長なデータが増えることもなく、すべてがうまくいきますが、編集した配列をレースで書き込むたびに、20のExpert Advisorのそれぞれのデータの実体をどう同期させるかが不明確です。

 

複数のEAが同じファイルにアクセスできるように管理することは、考えなければならないことです。

ここで、考えていただきたいことがあります。

1.2つのEAが同じファイルに対して同時に動作しないようにするには、別のフラグファイルを作成します。このファイルが存在しない場合、Expert Advisor はデータを含むファイルを開く 権利を有し、その前にファイルフラグを作成し、これまでのところ忙しいことを他の人に示します。読み書きの後、EA はfile-flag を削除 する。このデータは、他のEAが自由に扱えるようになりました。

2.この配列のデータを使用したExpert Advisorの情報を収集するための変数を作成することができます。これらの変数を同じファイルに書き込む。

3.通常の配列の代わりに、構造体の配列を作成します。この配列にはさまざまな種類の データが含まれており、非常に視覚的にわかりやすくなっています。

struct MyData
   {
   int EANumber;
   datetime writeTime;
   double mydata1;
   double mydata2;
   } mydata[];
 
Aleksei Stepanenko:

複数のEAが同じファイルにアクセスする場合の管理は、考えておかなければならないことです。


複数のExpert Advisorが1つのデータセットに書き込み、追加、選択、読み込みを行う必要がある場合、データベースが無差別に関与することになります。

グローバル変数」や「フラグ」を使うこともできますが、なぜそうしないのでしょうか?

それはDBMSのことです。異なる、リレーショナル、NoSQLなど、しかし、それは彼らのものです。そして、そのメカニックの中で、何年も何十年も、すべてが微調整されているのです。すべてのlocs-flags-semaphores-mutexです。
それを再現しようとするのは、野暮というものです。

 
そのとおりです。