Lavorare con i file. - pagina 4

 

TheXpert:

OMG! Dove c'è l'uscita, è una sciocchezza. È così che otteniamo affermazioni come "OOP è più veloce" o "gli indicatori sono lenti, dovremmo mettere l'intero codice in Expert Advisor".

Capisco che non tutto funziona come previsto, ma almeno l'uso normale di FileFlush() dovrebbe essere più veloce di FileClose().

Ma continuo a pensare che non dovremmo inserire queste cose all'interno dei loop, non saranno comunque di grande aiuto.

E se ho capito bene l'esempio per MQL4, la chiamata di FileFlush() è posta tra due cicli (questo mi ha suggerito che sarebbe un freno in un ciclo).

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

Quindi, se capisco bene la logica degli sviluppatori, il file dovrebbe essere aperto in OnInit / Constructor della classe principale (forse non solo nel costruttore) e chiuso in OnDeint / Destructive della classe principale.

Intutti gli altri casi invece di FileClose usate FileFlush (dopo FileWrite e dopo i cicli).


 

TheXpert:

Yedelkin:

Ho scambiato le linee secondo la documentazione:

         FileFlush(handle_file);
         FileWrite(handle_file,t);

Dove è scritto questo nella documentazione?

C'è una frase simile in MQL5 Reference:

FileFlush

Nota

La funzione FileFlush() dovrebbe essere chiamata tra le operazioni di lettura da un file e di scrittura su un file.

Se "scrivere su file" == funzione FileWrite(), allora leggere: "La funzione FileFlush() deve esserechiamata prima della funzione FileWrite()". O hai un'opinione diversa?

TheXpert:

Yedelkin:
Ma ancora non capisco il senso di chiamare FileFlush() prima di FileWrite().

Come si può dare un senso a qualcosa che non ne ha uno? Riporta l'ordine delle linee alla pagina iniziale e ricontrolla. A quanto pare la documentazione non l'ha messa bene.

È bene sapere in anticipo cosa ha senso e cosa no quando si studia un nuovo materiale. Poiché la natura non ci ha dotato di tali talenti, dobbiamo "prendere ogni nuova altezza", testare, interpretare la documentazione e i risultati. Non sono nemmeno sicuro che i test stessi siano scritti correttamente. All'inizio ho messo intuitivamente FileFlush() dopo FileWrite(), ma dopo aver riletto il manuale ho cancellato quell'esempio.

TheXpert:

Interessante:

OMG! È solo un'assurdità dove si trova l'uscita. È così che otteniamo affermazioni come "OOP è più veloce" o "gli indicatori sono lenti, dovremmo mettere tutto il codice in Expert Advisor".

Sarebbe bello se ogni valutazione di "la tua uscita è stupida" fosse seguita dalla spiegazione di ciò che è stupido in essa :) Altrimenti, non è chiaro in che direzione muoversi inquisiti con un tale rigore della magistratura :)

 
TheXpert:

Non c'è motivo di buttare fuori i cambiamenti prima che appaiano, perché non ci sono ancora :)

Non ci crederete, ma proprio per questo ho scritto "Ma non capisco il senso di chiamare FileFlush() prima di FileWrite()", facendo riferimento alla documentazione di prima. Ma non ho abbastanza coraggio e conoscenza per mettere in discussione ogni riga della documentazione :)
... Beh, il corso è chiaro - stiamo aspettando cosa diranno gli sviluppatori se qualche problema è davvero rilevato.
 
Yedelkin:

C'è una frase simile in MQL5 Reference:

Se "write to file" == funzione FileWrite(), si legge: "La funzione FileFlush() deve essere chiamata prima della funzione FileWrite() ".O hai un'opinione diversa?

Analizziamo la descrizione "piuttosto sfortunata" e l'esempio di questa funzione per MQL4.

void FileFlush( int handle)


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

Nota: la funzione FileFlush() deve essere chiamata tra le operazioni di lettura e scrittura dei file.
Quando il file viene chiuso, i dati vengono automaticamente scaricati su disco, quindi non c'è bisogno di chiamare FileFlush() prima di chiamare FileClose().

La linea segnata qui è l'argomento della necessità di mettere la chiamata FileFlush nel ciclo prima di scrivere nel file.

Ma se comprendiamo questa frase parola per parola, otterremo quanto segue:

la funzione FileFlush() deve essere chiamata tra le operazioni di lettura del file (mentre la lettura è FileReadXXX) e la scrittura del file (la scrittura è collegata a FileWrite e FileWriteXXX).

Quando sichiude il file (leggere - quando FileClose viene eseguito), i dati vengono scaricati automaticamente su disco (leggere - quando FileFlush viene eseguito automaticamente).


Penso che gli sviluppatori non si siano preoccupati molto della correttezza della lettura della guida anche nella versione MQL4; è persino ridicolo parlare di mettere la parte troncata in MQL5.

Almeno la seconda frase del commento qui sopra dovrebbe apparire come segue, secondo me:

I dati vengono automaticamente resettati sul disco quando il file vienechiuso, quindi non c'è bisogno di chiamare FileFlush() prima di chiamare FileClose().

È anche un po' disordinato, ma da un certo punto di vista spiega perché FileFlush non dovrebbe essere usato prima di chiudere il file usando FileClose.


L'esempio non è così semplice, il testo dice una cosa (l'uso tra operazioni di lettura e scrittura), mentre l'esempio descrive l'uso tra due operazioni di scrittura del ciclo (il lavoro all'interno dei cicli non è affatto considerato nella guida).

Quindi, come minimo, si dovrebbe aggiungere quanto segue:

1. una descrizione di cos'è questo buffer di input/output e cosa succede effettivamente in esso tra l'apertura di un file, la lettura di un blocco di dati, la scrittura di un blocco di dati e la chiusura del file.

Questo molto probabilmente si riferisce all'intera sezione sulle operazioni sui file.

2. Dare un esempio normalmente comprensibile (può essere basato su una classe) di come usare correttamente la chiamata FileFlush per l'accesso a un singolo file (ad es. scrivere il valore del timer).

3 Fornire un normale esempio di chiamata quando si lavora con gli array. Per quanto ho capito, l'esempio descritto nel MQL4 Reference si riferisce a lavorare con array di grandi dimensioni, ma lo illustra in modo errato (in una parola - perché scrivere due volte una quantità abbastanza grande di dati identici al file, se può essere fatto più volte?)

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

La linea evidenziata qui è il vostro argomento per la necessità di chiamare FileFlush nel ciclo prima di scrivere nel file.

Ma se capiamo questo commento parola per parola, otteniamo quanto segue:

la funzione FileFlush() deve essere chiamata tra le operazioni di lettura del file (e la lettura è FileReadXXX) e di scrittura del file (la scrittura è collegata a FileWrite e FileWriteXXX).

Quando si chiude il file (leggere - quando si esegue FileClose) i dati saranno automaticamente scaricati sul disco (leggere - quando si esegue FileFlush).

Capisco cosa intendi. Mi dispiace, che inconsapevolmente ho equiparato l'operazione di "lettura da file" alla funzione FileOpen() (il mio Expert Advisor leggerà solo da OnInit(), mentre durante l'elaborazione di tick ed eventi personalizzati - solo scrittura; per questo motivo non ho considerato funzioni come FileReadXXX() nel ciclo). Tuttavia, FileFlush() prima di FileWriteXXX() - il principio è lo stesso in entrambi i riferimenti. E non era un'argomentazione nel suo significato classico (come un ragionamento della mia posizione), ma semplicemente una risposta alla domanda perché ho fatto quella frase.

Comunque, se gli sviluppatori non rispondono qui, posterò una richiesta stasera, con un link alla discussione e ai risultati intermedi. Anche due applicazioni sono necessarie: 1) "bug - non un bug" e 2) cambiamenti nella documentazione. Vorresti fare tu stesso la seconda domanda, visto che hai scavato così a fondo nell'argomento?

 
Yedelkin:

Capisco cosa sto pensando. Confesso che inconsapevolmente ho equiparato l'operazione "read from file" alla funzione FileOpen() (il mio Expert Advisor leggerà solo da OnInit(), mentre durante l'elaborazione dei tick e degli eventi utente - solo in scrittura; per questo non ho considerato funzioni come FileReadXXX() nel ciclo). Tuttavia, FileFlush() prima di FileWriteXXX() - il principio è lo stesso in entrambi i riferimenti. E non era un'argomentazione nel suo significato classico (come un ragionamento della mia posizione), ma semplicemente la risposta alla domanda perché ho fatto quella frase.

Comunque, se gli sviluppatori non rispondono qui, scriverò una richiesta stasera, con un link alla discussione e ai risultati intermedi. Sono necessarie anche due applicazioni: 1) "bug - non un bug" e 2) cambiamenti nella documentazione. Vorresti fare tu stesso la seconda richiesta, visto che hai scavato così a fondo nell'argomento?

1. È così profondo? Probabilmente lo farei volentieri, se capissi cosa vogliono dire gli sviluppatori e dove.

A volte c'è una menzione di un buffer I/O ma nessuna descrizione adeguata. O qualcuno qui sa cos'è il buffer FILE I/O?

È difficile aggiungere una descrizione normale di questo problema nel capitolo sulle operazioni sui file? O andare su Google in tutto il mondo per cercare una risposta a ciò che gli sviluppatori avevano in mente?

Capisco che la dimensione dell'aiuto è limitata, ma perché dovremmo prendere in giro coloro che stanno appena iniziando a imparare MQL?

2. Perché nessuna menzione di questo buffer che ho trovato solo nella Guida per questa funzione, perché non è menzionato altrove nella sezione sulle operazioni sui file?

3. Supponiamo che io abbia un'idea di questo buffer di input/output approssimativamente in questa forma

La nozione di buffer di input-output è collegata al file system. I dati di ingresso e di uscita vengono eseguiti attraverso questo buffer.

Il bufferè un'area di memoria che viene allocata per ogni file.

Alla registrazione in un file, tutte le informazioni all'inizio sono dirette al buffer e lì si accumulano fino a quando tutto il volume del buffer non sarà riempito. Solo dopo questo o dopo il comando speciale di dump (per esempio FileClose o FileFlush). i dati vengono trasferiti dal buffer al file.

Quando si legge da un file, i dati vengono prima letti nel buffer, e non vengono letti tanti dati quanti ne vengono richiesti, ma quanti ne entrano nel buffer.

E gli sviluppatori pensano davvero che queste siano tutte informazioni che possono essere interessanti per un nuovo arrivato che studia MQL (se solo questa definizione può essere considerata valida per questo linguaggio)?

Per esempio, mi stavo chiedendo qual è la dimensione di questo buffer e come viene definito.

Secondo me, tutte queste informazioni, e non solo queste, dovrebbero essere nella documentazione della lingua (lì, e non in vari articoli e discussioni sul forum).

 
Interesting:
OK, cercherò di scrivere un riferimento io stesso
 

Perché lo script non restituisce l'effettiva"Last Read Date" del file?

int handle_file;
void OnStart()
  {
   handle_file=FileOpen("Ye_file2.bin",FILE_READ|FILE_WRITE|FILE_BIN);
   switch(handle_file)
     {
      case  INVALID_HANDLE: break;
      default:
         Print("Дата создания файла Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_CREATE_DATE));
         for(int i=0;i<3;i++)
           {
            Sleep(3000);
            FileReadInteger(handle_file,CHAR_VALUE);
            Print("Дата последнего чтения Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_ACCESS_DATE));
           }
         FileClose(handle_file);
     }
  }
 
Yedelkin:

Perché lo script non restituisce l'effettiva"Last Read Date" del file?

Ultimo accesso, non lettura. Riaprite la maniglia e sarete felici.
 
TheXpert:
Ultimo accesso, non accesso in lettura.

OK, come avrete notato, nella mia domanda ho citato la frase testualmente dalla documentazione:

ENUM_FILE_PROPERTY_INTEGER

Identificatore

Descrizione dell'identificatore

FILE_EXISTS

Controllo dell'esistenza

DATA DI CREAZIONE DEL FILE

Data di creazione

DATA DI MODIFICA DEL FILE

Data dell'ultima modifica

DATA DI ACCESSO AL FILE

Data dell'ultima lettura

Domanda 1: Pensi che ci sia un errore di battitura nella documentazione, e che invece di "Last Read Date" dovrebbe essere qualcosa come "Last Open Date"? Almeno dalla tua risposta, si vede che le operazioni "leggere file" e "accedere a file" significano cose diverse per te.

Più in là. Se riavviate lo script allegato diverse volte, vedrete più o meno lo stesso comportamento:

FK      0       FileInteger (EURGBP,M1) 21:33:56        Дата создания файла Ye_file2.bin: 2011.09.03 21:22:25
IP      0       FileInteger (EURGBP,M1) 21:33:59        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:33:57
RL      0       FileInteger (EURGBP,M1) 21:34:02        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:33:57
NH      0       FileInteger (EURGBP,M1) 21:34:06        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:33:57
MH      0       FileInteger (EURGBP,M1) 21:34:43        Дата создания файла Ye_file2.bin: 2011.09.03 21:22:25
EP      0       FileInteger (EURGBP,M1) 21:34:46        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:34:06
 HL      0       FileInteger (EURGBP,M1) 21:34:50        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:34:06
IH      0       FileInteger (EURGBP,M1) 21:34:53        Дата последнего чтения Ye_file2.bin: 2011.09.03 21:34:06

Cioè, quando si esegue lo script per la prima volta, la terza chiamata aFileReadInteger() avviene alle21:34:06, ma la data dell'ultima lettura/accesso è diversa -21:33:57.Tuttavia, la seconda esecuzione dello script (37 secondi dopo) mostra che la prima chiamata della funzioneFileReadInteger() ha dato come risultato 21 :34:06, cioè il tempo dell'ultima chiamata della funzioneFileReadInteger() durante l 'esecuzione dello script precedente.

Inoltre, si verifica il secondo lancio dello script alle 21:34:43, il che significa che la "riapertura di una maniglia", come la chiamate voi, è avvenuta nello stesso momento. Ma dopo una tale "riapertura della maniglia" ritorna21:34:06, cioè un tempo completamente diverso da quello di cui state parlando.

Domanda 2: come si deve interpretare?

TheXpert:
Riapri la maniglia e sarai felice.

Nella situazione attuale, ci si aspetta una buona notizia quando le proprietà dei file vengono recuperate senza "riaprire" l'handle.

Motivazione: