Arbeiten mit Dateien. - Seite 2

 
mql5:
Strings in MQL sind Unicode (2 Byte pro Zeichen) und kernel32.dll Funktionen sind Ansi (1 Byte pro Zeichen). Verwenden Sie ein Byte-Array und die Funktion StringToCharArray, um die ansish-Funktionen aufzurufen
Wie das?
Wenn ich mich recht erinnere, ist Windows fast vollständig Unicode, und das schon seit langem...

Oder ist kernel32.dll eine Ausnahme?

-----Hinzufügen------

Ich habe es mir angesehen, wirklich ansi, seltsam...

 

Ein Ratschlag für einen Amateur. Meine Kenntnisse im Umgang mit Dateien entsprechen denen eines Word-Benutzers.

Der Expert Advisor muss einen Wert vom Typ datetime in der Datei überschreiben, und zwar jedes Mal am Anfang der Datei, während der gesamten Dauer seiner Arbeit. Lesen Sie den zuletzt geschriebenen Wert - nur beim Neustart des Expert Advisors. Ich habe eine einfache Konstruktion mit einer .csv-Datei erstellt - alles scheint zu funktionieren. Es wurden die folgenden Fragen gestellt:

1) Welcher Dateityp sollte für die Speicherung von Datumswerten verwendet werden, um die Zeit für das Schreiben der Prozedur zu minimieren? So wie ich es verstanden habe, arbeiten .csv-Dateien mit Zeichenketten, und wo es Zeichenketten gibt, gibt es einen zusätzlichen Zeitaufwand für ihre Verarbeitung.

2) Wie verwende ich FileClose() richtig : sollte ich die Datei jedes Mal schließen, nachdem ich einen neuen Wert in sie geschrieben habe, oder sie einmal in der Funktion OnDeinit() schließen? Ich möchte die Datei einmal öffnen und dann einfach neue Werte hineinschreiben, ohne Zeit mit dem mehrmaligen Öffnen und Schließen der Datei zu verschwenden. Aber ist es sicher, dies zu tun?

3) Verstehe ich das richtig, dass, wenn ein Wert in die Datei geschrieben wird, die Datei aber nicht geschlossen wird, dieser geschriebene Wert im Falle eines plötzlichen Stromausfalls nicht verschwindet, und wenn das Programm geladen wird, kann er später gelesen werden?

 

Yedelkin:

Es haben sich folgende Fragen ergeben:

1) Welcher Dateityp sollte zum Speichern von Datumswerten verwendet werden, um den Zeitaufwand für das Schreiben von Prozeduren zu minimieren? So wie ich es verstanden habe, arbeiten .csv-Dateien mit Zeichenketten, und wo es Zeichenketten gibt, gibt es einen zusätzlichen Zeitaufwand für ihre Verarbeitung.

2) Wie verwende ich FileClose() richtig : sollte ich die Datei jedes Mal schließen, nachdem ich einen neuen Wert in sie geschrieben habe, oder sie einmal in der Funktion OnDeinit() schließen? Ich möchte die Datei einmal öffnen und dann einfach neue Werte hineinschreiben, ohne Zeit mit dem mehrmaligen Öffnen und Schließen der Datei zu verschwenden. Aber ist es sicher, dies zu tun?

3) Verstehe ich das richtig, dass, wenn ein Wert in die Datei geschrieben wird, die Datei aber nicht geschlossen wird, dieser geschriebene Wert im Falle eines plötzlichen Stromausfalls nicht verschwindet, und wenn das Programm geladen wird, kann er später gelesen werden?

1. Dies hängt vom Format ab, in dem die Datei gespeichert ist. Sie können das Datum als Zahl, Text oder einen speziellen Datentyp speichern.

Die zweite Frage wäre folgende: Warum speichern wir sie in einer Datei, wer wird sie sehen und wie?

Das Schreiben in TXT wäre die einfachste und zuverlässigste Option (man kann es von jedem Programm oder fast jedem Programm lesen), CSV ist eine fortgeschrittenere Art, in eine Datei zu schreiben. Es gibt Vorteile, aber auch eindeutige Nachteile.

2. Ich ziehe es vor, einmal in OnInit oder im Konstruktor der Hauptklasse (hängt von der Implementierung ab) zu öffnen und in OnDeinit oder im Destruktor zu schließen.

Wenn jedoch die Notwendigkeit besteht, die Datei erneut zu öffnen (es gibt eine Reihe von Gründen für solche Aktionen), können Sie dies in regelmäßigen Abständen tun (einmal pro Stunde/Tag/Woche).

Wenn die Datei groß ist oder die darin enthaltenen Informationen nur schwer wiederhergestellt werden können, ist es besser, sie regelmäßig zu überschreiben oder eine neue Datei zu erstellen.

3. wenn ein Wert geschrieben wurde, die Datei aber nicht ordnungsgemäß geschlossen wird (plötzlicher Stromausfall oder Aufhängen der Software), gehen die Daten höchstwahrscheinlich verloren (ob teilweise oder vollständig ist eine andere Frage).

Ich erinnere mich, dass ich in einem in Delphi geschriebenen Programm mit dem Schreiben in eine einfache Textdatei experimentiert habe. Bei Problemen war der letzte Datensatz oft überholt oder fehlte.

 

Eine mql-Funktion, die den Zeitpunkt der letzten Änderung der Datei zurückgibt, wäre sehr willkommen.

datetime FileLastModificationTime(string FName);
 
MetaDriver:

Eine mql-Funktion, die den Zeitpunkt der letzten Änderung der Datei zurückgibt, wäre sehr willkommen.

datetime FileLastModificationTime(string FName); 
Überhaupt - der Traum eines jeden Dichters!
 
Interesting:

1. Das Datum kann gespeichert werden als: Zahl, Text oder spezieller Datentyp.

Ich konnte keine Funktion finden, die das Datum als datetime-Typ speichert. Wenn auch nur durch Arrays.

Aus irgendeinem Grund scheint es besser zu sein, Werte vom Typ datetime in einer Binärdatei zu speichern (die Datei selbst ist so konzipiert, dass sie nur von demselben Expert Advisor beim erneuten Laden gelesen werden kann). Ich werde versuchen zu experimentieren.

Interessant:

Wenn ein Wert geschrieben wurde, die Datei aber nicht ordnungsgemäß geschlossen wurde (plötzlicher Stromausfall oder Aufhängen der Software), gehen die Daten höchstwahrscheinlich verloren (ob teilweise oder vollständig, ist eine andere Frage).

Ich erinnere mich, wie ich in einem in Delphi geschriebenen Programm mit dem Schreiben in plain txt experimentierte. Dort wurde bei Problemen oft der letzte Datensatz überboten oder fehlte.

Das ist sehr schade. Es stellt sich heraus, dass Sie die Funktion FileClose() immer verwenden müssen, wenn Sie die Speicherung des letzten Wertes garantieren wollen :(

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

Das ist sehr bedauerlich. Es hat sich herausgestellt, dass man FileClose() immer verwenden muss, wenn man sicherstellen will, dass der zuletzt geschriebene Wert gespeichert wird :(

Zu diesem Zweck wurdeFileFlush() erfunden.
 

sergeev:

Yedelkin:

Das ist sehr bedauerlich. Es hat sich herausgestellt, dass man FileClose() immer benutzen muss, wenn man garantieren will, dass der letzte Wert, den man geschrieben hat, gespeichert wird :(

Zu diesem Zweck wurde FileFlush() erfunden.

Das mag sein. Es wird jedoch nicht gesagt, wie es zu verwenden ist (wann es zu verwenden ist). Es mag eine einfache Frage für einen Profi sein, aber ich persönlich habe nach dem Lesen der Dokumentation keinen besonderen Sinn in FileFlush() gesehen...

Und der Unterschied zwischen FileClose() und FileFlush() ist immer noch unklar :/

FileFlush

Zurücksetzen aller im Datei-E/A-Puffer verbleibenden Daten auf die Festplatte.

...FileFlush() muss zwischen Dateilese- und Dateischreiboperationen aufgerufen werden.

Es wird also nicht in eine Datei geschrieben und die Daten sind bereits irgendwo auf der Festplatte gespeichert?

 
Yedelkin:

Möglicherweise. Aber es wird nicht gesagt, wie man es benutzt (wann man es benutzt). Es mag eine einfache Frage für einen Profi sein, aber persönlich sehe ich nach dem Lesen der Dokumentation keinen besonderen Sinn in FileFlush()...

Und der Unterschied zwischen FileClose() und FileFlush() ist immer noch unklar :/

Es wird also nicht in die Datei geschrieben, sondern die Daten werden bereits irgendwo "gespült"?

Hier ist eine ausführlichere Beschreibung und ein Beispiel aus der MQL4-Referenz

void FileFlush( int handle)


Setzt alle im Datei-E/A-Puffer verbleibenden Daten auf die Festplatte zurück.

Hinweis: FileFlush() muss zwischen Dateilese- und Dateischreiboperationen aufgerufen werden.
Wenn eine Datei geschlossen wird, werden die Daten automatisch auf die Festplatte zurückgesetzt, so dass es nicht notwendig ist, FileFlush() vor dem Aufruf von FileClose() aufzurufen.
Parameter:
Griff - Von FileOpen() zurückgegebener Dateideskriptor.

Beispiel:

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

Wenn ich es richtig verstanden habe, schließt der FileFlush-Aufruf im Gegensatz zu FileClose die Datei nicht, so dass man mit ihr weiterarbeiten kann. Und im Vergleich zum erneuten Öffnen sollten Sie eine deutliche Geschwindigkeitssteigerung erzielen.

Sie brauchen allerdings ein konkreteres Beispiel für die jeweilige Aufgabe.

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

Hier ist eine ausführlichere Beschreibung mit einem Beispiel aus der MQL4-Hilfe

"Beim Schließen der Datei werden die Daten automatisch auf die Festplatte zurückgesetzt, so dass es nicht notwendig ist, FileFlush() vor dem Aufruf von FileClose() aufzurufen" - Ja, ja, ich beginne zu verstehen, wasSergejew meinte. Es stellt sich also heraus, dass Sie anstelle von FileClose() FileFlush() aufrufen können, um die Speicherung des letzten Datensatzes in der Datei zu gewährleisten? Und das soll eine kompetente Lösung sein?