Scrivere nel file su una nuova linea - pagina 3

 
Alexey Viktorov:

E il concetto è solo per voi in superficie.........

Intendevo dire che il suggerimento (concetto) "sperimentare da soli" non ha bisogno di essere espresso, è chiaro così com'è. Igor ho capito perfettamente e io stesso ho pensato a questa opzione, per la ragione che è la più semplice, ma per me imho non è molto adatta, per le circostanze descritte sopra.

 
EfremovSergey:

Ecco la fregatura: ci sono 10 programmi che scrivono sul file e altri 10 che leggono da esso, non si vuole che ogni programma di lettura elabori tutti i dati accumulati per tutto il tempo.

E in questo caso, è meglio abbandonare del tutto il file e lavorare con un database SQLite. Questo è molto simile al lavoro con i file, si può anche creare in una cartella condivisa, ma l'elaborazione, la ricerca e la cancellazione della stringa è molto più semplice.

 

Sergey, se non hai bisogno di guardare questo file con gli occhi, allora scrivi un array dei tuoi dati in una volta sola

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

poi togliere l'array dal file in qualsiasi 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 lavorate con l'array come volete. Cancellare l'ultimo elemento, aggiungerne altri.

 
Alexey Viktorov:

E in questo caso, è meglio abbandonare del tutto il file e lavorare con un database SQLite. Questo è molto simile al lavoro con i file, che potete anche creare in una cartella condivisa, ma l'elaborazione, la ricerca e la cancellazione delle righe è molto più semplice.

MQL4 supporta il lavoro con SQLite? Non è solo il formato TXT e CSV?

L'accesso al file avviene tramite un collegamento simbolico, non importa dove si trova il file, in quale cartella.

 
Aleksei Stepanenko:

Sergey, se non hai bisogno di guardare questo file con gli occhi, allora scrivi un array dei tuoi dati in una volta sola

poi togliere l'array dal file in qualsiasi momento

E lavorate con l'array come volete. Cancellare l'ultimo elemento, aggiungerne un altro.

Quindi, qual è la differenza, l'array viene scritto nel file riga per riga in ogni caso, o in questo caso, è possibile rimuovere almeno l'ultimo o il primo elemento, array=stringa?

 

Non capisco bene la domanda. Avete un array di dati su cui potete fare qualsiasi tipo di manipolazione con facilità. E una semplice scrittura e lettura dal file in quattro righe di codice. Questo è il vantaggio. Perché pensare a come un array viene scritto in un file?

Si fanno le modifiche necessarie nell'array, si carica l'array modificato in un file e il gioco è fatto.

 
Aleksei Stepanenko:

Non capisco bene la domanda. Avete un array di dati su cui potete fare qualsiasi tipo di manipolazione con facilità. E una semplice scrittura e lettura dal file in quattro righe di codice. Questo è il vantaggio. Perché pensare a come un array viene scritto in un file?

Si fanno le modifiche necessarie nell'array, si carica l'array modificato in un file e il gioco è fatto.

La difficoltà qui è che 20 applicazioni dovranno gestire uno stesso array alla volta, ed è impossibile determinare quale particolare versione modificata dell'array è rilevante al momento attuale.

Supponiamo che il primo Expert Advisor abbia modificato l'array e l'abbia pubblicato, e che un'altra versione dell'array sia stata scritta sopra, senza tener conto della precedente, e questo è tutto... confusione...

Se per esempio ogni Expert Advisor potesse cancellare la riga relativa dopo che è stata letta, allora tutto funzionerebbe - nessuno disturba nessuno e il file non sarà sovraccaricato di dati ridondanti, ma ogni volta che l'array modificato viene scritto in corsa, allora non è chiaro come sincronizzare l'attualità dei dati da ciascuno dei 20 Expert Advisor.

 

Gestire l'accesso di più EAs allo stesso file è qualcosa a cui dovete pensare.

Ecco qualcosa su cui riflettere:

1. Per evitare che due EA lavorino contemporaneamente sullo stesso file, create un altro file di flag. Quando questo file non esiste, l'Expert Advisor ha il diritto di aprire il file con i dati, prima di creare un file-flag, mostrando agli altri che è occupato finora. Dopo la lettura-scrittura, l'EA cancella il file-flag. I dati sono ora liberi per qualsiasi altra EA su cui lavorare.

2. È possibile creare variabili per raccogliere informazioni su qualsiasi Expert Advisor che ha utilizzato i dati in questa matrice. Scrivete queste variabili nello stesso file.

3. Invece del solito array, create un array di strutture, che include diversi tipi di dati ed è molto visivo.

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

La gestione di più EAs che accedono allo stesso file è qualcosa a cui bisogna pensare.


Quando diversi Expert Advisors hanno bisogno di scrivere+aggiungere+selezionare+leggere un set di dati, allora i database sono coinvolti volenti o nolenti.

Si possono usare"variabili globali" e bandiere, ma perché diavolo no?

Questa è una cosa da DBMS. Diversi, relazionali, NoSQL e altri, ma sono loro. E lì nella loro meccanica tutto è messo a punto per anni e decenni. Tutti i locs-flags-semaphores-mutexes.
Cercare di replicarlo è una selvaggia perdita di tempo.

 
Esattamente!