Probleme mit FileWriteString(), FileReadString() - Seite 2

 

Und warum funktioniert das in MQL4 und in MQL5 nicht mehr ?

Aber es ist mir mittlerweile egal. Hauptsache es funktioniert irgendwie.

 
Alain Verleyen:

Ja, das ist eine dritte Lösung, aber keine gute, weil sie nicht universell ist und nur funktioniert, weil Sie die Länge der Zeichenfolge kennen, bevor Sie sie lesen.

Der Trick ist ja: immer abwechselnd string-Länge und String schreiben. Man muss die Länge also nicht "kennen", denn sie wird stets gelesen unmittelbar bevor der nächste String ansteht.

In der Praxis funktioniert das gut.

Natürlich ist das nicht "universell", i.e. irgendeine fremde Person kann mit einer solchen Datei nichts anfangen, solange sie nicht weiß, mit welcher Maske die Datei strukturiert ist. Aber das gilt ja für sämtliche Binärdateien. Bei Char-Arrays ist das ja nicht anders: man stelle sich eine heterogene Binärdatei vor, die sich gemischt aus irgendwelchen Zahlen, Arrays, structs, usw. und eben auch char-Arrays zusammensetzt. Dann braucht man beim Lesen der Datei ja im Falle der Verwendung von Char-Arrays genauso die Information, ab wo das Array beginnt und welche Anzahl von Zeichen zu lesen ist. Das ist also ebenso wenig universell. Man müsste die Größe des zu lesenden Arrays also ebenfalls in die Datei schreiben. Dieses Problem besteht nur dann nicht, wenn es sich um eine homogene Datei handelt, die ausschließlich chars kodiert.

In der Praxis, wenn wir über EA-Programmierung reden, ist es ja i.d.R. die gleiche Person, die die Funktionen für das Lesen und das Schreiben formuliert. Die grundsätzliche Struktur der Datei ist also bekannt. Die String-Längen können trotzdem variabel sein. Ich arbeite selbst ausschließlich mit "Variante 3" und kann daher sagen, dass es so gut funktioniert (=auch mit variablen String-Längen).

edit @Otto Pauser: wenn die Funktion WebRequest() also zwangsläufig ein char-Array liefert, hat es sich mit der Variante über FileWriteString für den den gegebenen Fall natürlich erledigt, daher also mehr für den allgemeinen Fall "Schreiben und Lesen von Strings in .bin-Dateien"

 
Otto Pauser :

Und warum funktioniert das in MQL4 und in MQL5 nicht mehr ?

Aber es ist mir mittlerweile egal. Hauptsache es funktioniert irgendwie.

Weil in mql4 FILE_ANSI der Standard ist. In mql5 ist FILE_UNICODE die Standardeinstellung.

Ansonsten funktionieren beide gleich.

 
Chris70 :

Der Trick ist ja: immer abwechselnd string-Länge und String schreiben. Man muss die Länge also nicht "kennen", denn sie wird stets gelesen unmittelbar bevor der nächste String ansteht.

In der Praxis funktioniert das gut.

Natürlich ist das nicht "universell", i.e. irgendeine fremde Person kann mit einer solchen Datei nichts anfangen, solange sie nicht weiß, mit welcher Maske die Datei strukturiert ist. Aber das gilt ja für sämtliche Binärdateien. Bei Char-Arrays ist das ja nicht anders: man stelle sich eine heterogene Binärdatei vor, die sich gemischt aus irgendwelchen Zahlen, Arrays, structs, usw. und eben auch char-Arrays zusammensetzt. Dann braucht man beim Lesen der Datei ja im Falle der Verwendung von Char-Arrays genauso die Information, ab wo das Array beginnt und welche Anzahl von Zeichen zu lesen ist. Das ist also ebenso wenig universell. Man müsste die Größe des zu lesenden Arrays also ebenfalls in die Datei schreiben. Dieses Problem besteht nur dann nicht, wenn es sich um eine homogene Datei handelt, die ausschließlich chars kodiert.

In der Praxis, wenn wir über EA-Programmierung reden, ist es ja i.d.R. die gleiche Person, die die Funktionen für das Lesen und das Schreiben formuliert. Ich arbeite selbst ausschließlich mit "Variante 3" und kann daher sagen, dass es so gut funktioniert, auch mit variablen String-Längen.

Wenn jemand es benutzt und versteht, was er tut, ist alles in Ordnung. Aber das Forum wird von vielen Leuten mit unterschiedlichen Kenntnissen gelesen und deshalb würde ich diesen Ansatz nicht empfehlen. Das Öffnen einer Binärdatei mit FILE_ANSI in mql5 ist ein Trick und ein guter Weg, um Fehler und Bugs zu vermeiden. Tun Sie dies nur, wenn Sie die Auswirkungen genau kennen. ("du" ist der Leser, nicht Chris, der genau weiß, was er tut ;-).
 
         int filehandle=FileOpen("news-log.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
            {
               FileWriteArray(filehandle,WebResult,0,ArraySize(WebResult));
               FileClose(filehandle);

               filehandle=FileOpen("news-log.htm",FILE_READ|FILE_BIN);
               if(filehandle!=INVALID_HANDLE)
                  {
                     result=FileReadArray(filehandle,WebResult);
                     FileClose(filehandle);
                     string text=CharArrayToString(WebResult);
                     return(text);
                 }
            }

So funktioniert das ganz hervorragend. Danke an alle, jetzt verstehe ich auch die Unterschiede MQL4/MQL5 hier.

Ich kannte CharArrayToString() leider noch nicht :(

Grund der Beschwerde: