Lavorare con i file. - pagina 2

 
mql5:
Le stringhe in MQL sono unicode (2 byte per carattere) e le funzioni di kernel32.dll sono ansi (1 byte per carattere). Usa un array di byte e la funzione StringToCharArray per chiamare le funzioni ansish
Come mai?
Se ricordo bene, Windows è quasi interamente Unicode, e lo è stato per molto tempo...

O kernel32.dll è un'eccezione?

-----Added------

Guardato, davvero ansi, strano...

 

Un consiglio per un dilettante. La mia conoscenza del lavoro con i file è al livello di un utente Word.

L'Expert Advisor ha bisogno di sovrascrivere un valore di tipo datetime nel file, ogni volta all'inizio del file, durante tutto il tempo del suo lavoro. Leggere l'ultimo valore scritto - solo quando si riavvia l'Expert Advisor. Ho fatto una semplice costruzione, usando un file .csv - tutto sembra funzionare. Sono apparse le seguenti domande:

1) Quale tipo di file è meglio usare per salvare i valori di datetime al fine di minimizzare il tempo di scrittura della procedura? Come ho capito, i file .csv lavorano con stringhe, e dove ci sono stringhe, c'è un consumo di tempo aggiuntivo per la loro elaborazione.

2) Come usare correttamente FileClose(): devo chiudere il file ogni volta dopo avervi scritto un nuovo valore, o chiuderlo una volta sola, nella funzione OnDeinit()? Vorrei aprire il file una volta e poi scrivere solo nuovi valori in esso, senza perdere tempo ad aprirlo-chiuderlo più volte. Ma è sicuro farlo?

3) Ho capito bene che se qualche valore viene scritto nel file, ma il file non viene chiuso, allora in caso di un'improvvisa interruzione di corrente questo valore scritto non scomparirà, e quando il programma verrà caricato, sarà possibile leggerlo in seguito?

 

Yedelkin:

Sono sorte le seguenti domande:

1) Quale tipo di file è meglio usare per salvare i valori di datetime al fine di minimizzare il tempo della procedura di scrittura? Come ho capito, i file .csv lavorano con le stringhe, e dove ci sono le stringhe, c'è un consumo di tempo supplementare per la loro elaborazione.

2) Come usare correttamente FileClose(): devo chiudere il file ogni volta dopo avergli scritto un nuovo valore, o chiuderlo una volta sola, nella funzione OnDeinit()? Vorrei aprire il file una volta e poi scrivere solo nuovi valori in esso, senza perdere tempo ad aprirlo-chiuderlo più volte. Ma è sicuro farlo?

3) Ho capito bene che se qualche valore viene scritto nel file, ma il file non viene chiuso, allora in caso di un'improvvisa interruzione di corrente questo valore scritto non scomparirà, e quando il programma verrà caricato, sarà possibile leggerlo in seguito?

1. Dipende dal formato in cui viene salvato il file. Potete salvare la data come un numero, un testo o un tipo specializzato in datetime.

La seconda domanda è questa: perché lo salviamo in un file, chi lo leggerà e come lo vedrà?

Scrivere su TXT sarebbe l'opzione più semplice e affidabile (si può leggere da qualsiasi programma, o quasi), CSV è un modo più avanzato per scrivere su file. Ci sono dei vantaggi, ma anche degli svantaggi ben definiti.

2. Preferisco aprire una volta in OnInit o nel costruttore della classe principale (dipende dall'implementazione) e chiudere in OnDeinit o nel distruttore.

Ma se c'è la necessità di riaprire il file (ci sono diverse ragioni per tali azioni), puoi farlo periodicamente (una volta ogni ora/giorno/settimana).

Se il file è grande o le informazioni in esso contenute saranno difficili da ripristinare, è meglio sovrascriverlo periodicamente o crearne uno nuovo.

3. se il valore è stato scritto ma il file non è stato chiuso correttamente (improvvisa interruzione di corrente o blocco del software) molto probabilmente i dati saranno persi (parzialmente o completamente è una questione separata).

Ricordo di aver sperimentato la scrittura su semplice txt in un programma scritto in Delphi. In caso di problemi l'ultimo record era spesso battuto o mancante.

 

Una funzione mql che restituisca l'ora dell'ultima modifica del file sarebbe molto gradita.

datetime FileLastModificationTime(string FName);
 
MetaDriver:

Una funzione mql che restituisca l'ora dell'ultima modifica del file sarebbe molto gradita.

datetime FileLastModificationTime(string FName); 
In generale - il sogno di un poeta!
 
Interesting:

1. la data può essere salvata come: numero, testo o tipo datetime.

Non ho trovato nessuna funzione che salvi la data come tipo datetime. Se non altro attraverso gli array.

Per qualche ragione, sembra che sarebbe meglio memorizzare i valori di tipo datetime in un file binario (il file stesso è progettato per essere letto solo dallo stesso Expert Advisor durante il ricaricamento). Cercherò di sperimentare.

Interessante:

Se il valore è stato scritto, ma il file non è stato chiuso correttamente (improvvisa interruzione di corrente o blocco del software) molto probabilmente i dati saranno persi (parzialmente o completamente è una questione separata).

Ricordo di aver sperimentato la scrittura in txt semplice in un programma scritto in Delphi. Lì in caso di problemi l'ultimo record era spesso battuto o mancante.

Che peccato. Si scopre che se volete garantire il salvataggio dell'ultimo valore dovete usare sempre la funzione FileClose() :(

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип datetime - Документация по MQL5
 
Yedelkin:

È un peccato. Si scopre che se volete assicurarvi che l'ultimo valore scritto sia salvato, dovete usare sempre FileClose() :(

FileFlush() è stato inventato per questo scopo.
 

sergeev:

Yedelkin:

È un peccato. Si scopre che se volete essere sicuri di salvare l'ultimo valore che avete scritto, dovete usare sempre FileClose() :(

FileFlush() è stato inventato per questo scopo.

Può essere. Ma non dice nulla su come usarlo (quando usarlo). Potrebbe essere una domanda facile per un professionista, ma personalmente non ho visto alcun senso speciale in FileFlush() dopo aver letto la documentazione...

E la differenza tra FileClose() e FileFlush() non è ancora chiara :/

FileFlush

Ripristina su disco tutti i dati rimasti nel buffer di I/O del file.

...FileFlush() deve essere chiamato tra le operazioni di lettura e scrittura di file.

Quindi, non c'è scrittura su file e i dati sono già "scaricati su disco" da qualche parte?

 
Yedelkin:

Possibilmente. Ma non dice come usarlo (quando usarlo). Potrebbe essere una domanda facile per un professionista, ma personalmente, dopo aver letto la documentazione, non vedo alcun senso speciale in FileFlush()...

E la differenza tra FileClose() e FileFlush() non è ancora chiara :/

Quindi, non c'è scrittura sul file, ma i dati sono già "scaricati" da qualche parte?

Ecco una descrizione più dettagliata e un esempio da MQL4 Reference

void FileFlush( int handle)


Ripristina su disco tutti i dati rimanenti nel buffer di I/O del file.

Nota: FileFlush() deve essere chiamato tra le operazioni di lettura e scrittura di file.
Quando un file viene chiuso, i dati vengono automaticamente resettati sul disco, quindi non c'è bisogno di chiamare FileFlush() prima di chiamare FileClose().
Parametri:
maniglia - Descrittore di file restituito da FileOpen().

Esempio:

int bars_count=Bars;
int handle=FileOpen("mydat.csv",FILE_CSV|FILE_WRITE);
  
  if(handle>0)
    {
     FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileFlush(handle);
     ...
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileClose(handle);
    }

Se ho capito bene, la chiamata FileFlush, a differenza di FileClose, non chiude il file, il che permette di continuare a lavorare con esso. E rispetto alla riapertura, si dovrebbe ottenere un aumento significativo della velocità.

Anche se hai bisogno di un esempio più specifico del compito da svolgere.

FileFlush - Документация на MQL4
  • docs.mql4.com
FileFlush - Документация на MQL4
 
Interesting:

Ecco una descrizione più dettagliata con un esempio, dall'aiuto di MQL4

"Quando si chiude il file, i dati vengono automaticamente resettati sul disco, quindi non c'è bisogno di chiamare FileFlush() prima di chiamare FileClose()" - Sì, sì, comincio a capire di cosa stava parlandosergeev. Quindi, si scopre che invece di FileClose() si può chiamare FileFlush() per garantire il salvataggio dell'ultimo record nel file? E questa sarebbe una soluzione competente?