File-Handling -das Schreiben funktioniert nicht zuverlässig

 

Ich habe einen EA, der empfangene Textnachrichten ausliest, auswertet und die Handlungsinformation in ein TextFile speichert.

Das File wurde erzeugt mit

int file_handle=FileOpen(Path+"//"+file_name,FILE_READ|FILE_CSV);

Andere EAs- die mehrfach vorkommen - lesen dieses Textfile aus und schießen es dann wieder mit

int file_handle=FileOpen(FileName+".txt",FILE_READ|FILE_TXT); 

Leider kommt es vor, dass nicht alle Textnachrichten zuverlässig in das File geschrieben werden.

Woran kann das liegen?
Kann in das Textfile geschrieben werden, während ein andere EA es zum Auslesen offen hat?

 
Ich habe nicht oft mit files zutun, aber sowie du das oben programmiert hast, sind das zwei unterschiedliche files. einmal FILE_CSV und einmal FILE_TXT und einmal file_name und dann FileName.

willst du die files nur auslesen oder auch schreiben? weil dann müsste noch FILE_WRITE in die FileOpen() eingefügt werden. Ansonsten frage ch mich gerade, was es mit der flag FILE_SHARE_READ auf sich hat und ob dir diese in deinem Fall von Nutzen sein könnte.

Ich glaube auch nicht, dass in ein file geschrieben werde kann, während ein anderer EA es zum lesen offen hat. jedenfalls würde ich die Datei immer nacheinander öffnen.



Das ist ein von Carl stammender CodeSchnipsel, der für das Schreiben von files funktioniert (zumindest bei mir). Der Code schreibt zeilenweise eine CSV und fügt ihr bei jedem neuen öffnen eine neue Zeile hinzu

//use:  addLineToFileCommon("line\n", "folder\\name.txt"); // shared=true, maxPrt=10
bool addLineToFileCommon(const string line, const string fName, const bool shared = true, const int maxPrt=10) {
   ResetLastError();
   static int nErr=0;
   int fH;
   if ( shared )
      fH = FileOpen(fName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON|FILE_SHARE_READ|FILE_SHARE_WRITE);
   else 
      fH = FileOpen(fName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON);
   if (fH == INVALID_HANDLE ) { if (nErr<maxPrt) Print("Common-File: >"+fName+"< Open FAILED err:",_LastError); return(false); }
   FileSeek(fH,0,SEEK_END);
   FileWriteString(fH, line, StringLen(line) );
   FileClose(fH);
   if (_LastError<2) return(true);
   if (nErr<maxPrt) ErrT("Write to Common-file: "+fName+" went wrong?");
   return(false);
}
 

Was es mit den Flags auf sich hat, kann hier nachgelesen werden: https://www.mql5.com/de/docs/constants/io_constants/fileflags

Dort wird auch erklärt, inwiefern die Öffnung einer Datei als CSV oder als TXT zu unterschiedlichem Leseverhalten der Read-Methoden führt.

Documentation on MQL5: Constants, Enumerations and Structures / Input/Output Constants / File Opening Flags
Documentation on MQL5: Constants, Enumerations and Structures / Input/Output Constants / File Opening Flags
  • www.mql5.com
File Opening Flags - Input/Output Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5