Escrevendo para o arquivo em uma nova linha - página 3

 
Alexey Viktorov:

E o conceito é somente para você na superfície.........

Eu quis dizer que a sugestão (conceito) "experimentar por conta própria" não precisa ser expressada, é claro como é. Igor eu entendi perfeitamente e pensei nesta opção, pela razão de ser a mais simples, mas para mim imho não é muito adequada, pelas circunstâncias descritas acima.

 
EfremovSergey:

Eis o senão: existem 10 programas que escrevem no arquivo e outros 10 que lêem a partir dele, você não quer que cada programa de leitura processe todos os dados acumulados para todo o tempo.

E neste caso, é melhor abandonar completamente o arquivo e trabalhar com um banco de dados SQLite. Isto é muito semelhante a trabalhar com arquivos, você também pode criar em uma pasta compartilhada, mas o processamento, a busca e a exclusão da cadeia é muito mais fácil.

 

Sergey, se você não precisa olhar este arquivo com seus olhos, então escreva imediatamente um array de seus dados nele

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);
   }

então tire o array do arquivo a qualquer momento

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);
      }
   }

E trabalhe com a matriz como desejar. Apague o último elemento, acrescente mais.

 
Alexey Viktorov:

E neste caso, é melhor abandonar completamente o arquivo e trabalhar com um banco de dados SQLite. Isto é muito semelhante a trabalhar com arquivos, você também pode criar em uma pasta compartilhada, mas processar, pesquisar e excluir linhas é muito mais fácil.

A MQL4 suporta trabalhar com SQLite? Não é apenas no formato TXT e CSV?

O acesso ao arquivo é feito através de um link simbólico, não importa onde o arquivo se encontra, em qual pasta.

 
Aleksei Stepanenko:

Sergey, se você não precisa olhar este arquivo com seus olhos, então escreva imediatamente um array de seus dados nele

então tire o array do arquivo a qualquer momento

E trabalhe com a matriz como desejar. Apagar o último elemento, adicionar outro.

Então, qual é a diferença, o array é escrito linha a linha no arquivo em qualquer caso, ou neste caso, é possível remover pelo menos o último ou primeiro elemento, array=string?

 

Eu não entendo bem a pergunta. Você tem uma série de dados sobre os quais pode fazer qualquer tipo de manipulação com facilidade. E uma simples escrita e leitura do arquivo em quatro linhas de código. Essa é a vantagem. Por que pensar em como um array é escrito em um arquivo?

Você faz as mudanças necessárias na matriz, carrega a matriz modificada em um arquivo e pronto.

 
Aleksei Stepanenko:

Eu não entendo bem a pergunta. Você tem uma série de dados sobre os quais pode fazer qualquer tipo de manipulação com facilidade. E uma simples escrita e leitura do arquivo em quatro linhas de código. Essa é a vantagem. Por que pensar em como um array é escrito em um arquivo?

Você faz as mudanças necessárias na matriz, carrega a matriz modificada em um arquivo e pronto.

A dificuldade aqui é que 20 aplicações terão que lidar com uma e a mesma matriz de cada vez, e é impossível determinar qual versão editada específica da matriz é relevante no momento atual.

Suponha que o primeiro Expert Advisor editou uma matriz e a publicou, e outra versão da matriz foi escrita sobre ela, sem levar em conta a anterior, e é isso... confusão...

Se, por exemplo, cada Expert Advisor pudesse apagar a linha relacionada após ter sido lida, então tudo funcionaria - ninguém incomoda ninguém e o arquivo não será sobrecarregado com dados redundantes, mas toda vez que a matriz editada for escrita em uma corrida, então não está claro como sincronizar a atualidade dos dados de cada um dos 20 Expert Advisors.

 

Gerenciar o acesso de vários EAs ao mesmo arquivo é algo em que você precisa pensar.

Aqui está algo para você pensar:

1. Para evitar que dois EAs trabalhem no mesmo arquivo ao mesmo tempo, crie outro arquivo de bandeira. Quando este arquivo não existe, o consultor especializado tem o direito de abrir o arquivo com os dados, antes disso criar uma bandeira de arquivo, mostrando aos outros que ele está ocupado até agora. Após a leitura-escrita, a EA apaga a bandeira de arquivo. Os dados agora são gratuitos para que qualquer outra EA possa trabalhar.

2. Você pode fazer variáveis para coletar informações sobre qualquer Expert Advisor que tenha usado os dados desta matriz. Escreva estas variáveis no mesmo arquivo.

3. Em vez da matriz habitual, crie uma matriz de estruturas, que inclui diferentes tipos de dados e é muito visual.

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

A gestão de vários EAs acessando o mesmo arquivo é algo em que você precisa pensar.


Quando vários Expert Advisors precisam escrever+adicionar+selecionar+ler um conjunto de dados, então os bancos de dados são envolvidos a torto e a direito.

Você pode usar"variáveis globais" e bandeiras, mas por que diabos não?

É para isso que servem os bancos de dados. Diferente, relacional, NoSQL e outros, mas é deles. E ali em sua mecânica tudo é afinado durante anos e décadas. Todos os lock-flags-semaphores-mutexes.
Tentar replicá-lo é uma enorme perda de tempo.

 
Exatamente!
Razão: