Umwandlung TDateTime in AnsiString
-
ich habe einen Vektor, der das aktuelle Datum enthält vom Typ TDateTime. Diesen will ich in einer Datei speichern was so leider nicht funktioniert. Ich nehme an, dass ich den Ausdruck erst in ein AnsiString umwandeln muss. Get time() und Get_date sind eigene Methoden, die das Datum bzw die Zeit zurückgeben.
ofstream saveFile; for (unsigned int i=0; i<batch.size(); i++){ saveFile << i << "\t" << batch[i].Get_time() << "\t" << batch[i].Get_date() << endl; }
Wie mach ich das?
-
FormatDateTime
-
TDateTime lässt sich durch einen double repräsentieren, um ihn in eine Datei (std::ostream) zu schreiben du musst lediglich den operator<<() entsprechend überladen:
std::ostream& operator<<( std::ostream& os, TDateTime op ) { // Variante 1: Datum in Binärform schreiben double Value = (double) op; os.write( &Value, sizeof( Value ) ); // Variante 2: Datum in Textform (double, nicht formatiert) schreiben os << (double) op; return os; }
PS:
Ich weiss nicht, ob ein reinterpret_cast/static_cast die double operator() Überladung von TDateTime triggert, daher habe ich mal C-casts benutzt.
-
von Operatorüberladung hab ich leider noch keine Ahnung. Wie kann ich das in meinem speziellen Beispiel machen? Es kommen dann ja auch noch mehr Variablen dazu, wobei ich die direkt reinschreiben kann, da es double sind.
-
Nun ja, das würde auch ohne Überladung gehen. Schließlich kann man direkt auf den double Wert zugreifen und diesen in die Datei schreiben: siehe TDateTime::Val.
-
Joe_M. schrieb:
Nun ja, das würde auch ohne Überladung gehen. Schließlich kann man direkt auf den double Wert zugreifen und diesen in die Datei schreiben: siehe TDateTime::Val.
Guter Einwand!
-
das Datumsformat soll ja unverändert bleiben. Mit Val bekomm ich ja den double-Wert, den ich dort ja nicht haben will. Gibts da noch eine Alternative?
-
Was heißt, das Datumsformat soll unverändert bleiben? Du änderst ja nichts. Intern arbeitet TDateTime mit double.
Du kannst allerdings auch eine Ausgabe als String machen (falls es das ist, was Du meinst):
TDateTime::DateTimeString()
TDateTime::DateString()
TDateTime::TimeString()
-
for (unsigned int i=0; i<batch.size(); i++) { saveFile << batch[i].Get_time().DateTimeString() << batch[i].Get_date().DateTimeString() << endl; }
bekomme dann diesen Fehler:
[C++ Fehler] Start.cpp(108): E2094 'operator<<' ist im Typ 'ofstream' für Argumente des Typs 'AnsiString' nicht implementiert.Möchte eigentlich nur, dass in der Textdatei das gespeicherte Datum und die Uhrzeit steht.
-
Schau mal in die Hilfe zu AnsiString. Da sollte sowas stehen.
Hinweis: Wenn Sie die Streaming-Operatoren von C++ (<< und >>) mit dem Typ AnsiString nutzen möchten, müssen Sie vor #include <dstring.h> die Anweisung #include <iostream> oder #define VCL_IOSTREAM angeben. Verwenden Sie die include-Anweisung mit vcl.h oder system.h, geschieht dies automatisch.
-
Ja passiert eben wenn man zwei Konzepte/Bibliotheken mischt.
saveFile << batch[i].Get_time().DateTimeString().c_str()