Probleme bei der Beschriftung einer neu erzeugten Datei mit aktuellem Datum
-
Hallo an alle,
ich habe ein kleines Programm, welches eine neue Datei erzeugt und diese mit einem aktuellen Zeitstempel als Dateinamen versehen soll.
Irgendwie harmoniert das ganze nicht. Die ausgabe ist immer:
15 August 02:12:56 2012
.txtDann wird ds Programm verworfen.
Kann mir jm. weiterhelfen was ich falsch mache oder wie ich es richtig umschreiben kann?
Danke und Grüße
Fill#include "stdafx.h" #include <string> #include <ctime> // Dateinamengenerierung #include <iostream> // Dateinamengenerierung #include <algorithm> // copy #include <iterator> // i(o)stream_iterator #include <string> #include <iostream> #include <fstream> #include <limits> // numeric_limits #include <time.h> // Für wait-Funktion using namespace std; string dateiname (); int main (void) { int a; time_t result = time(NULL); string ret_name = asctime(localtime(&result)); cout << ret_name << endl; // Namenstestausgabe for (a=0, a<10, a++) { ret_name=dateiname (); cout << ret_name << endl; ifstream f1("test.txt"); // vorhanden ofstream f2(ret_name); // neuanlegen // copy(); f1.close(); // Schließen f2.close(); // Schließen getchar(); } return 0; } string dateiname () { time_t result = time(NULL); string date = asctime(localtime(&result)); string name = date+".txt"; return name; }
-
asctime fügt am Ende ein Newline ein, dies müsstest du manuell entfernen.
date.erase(date.end()-1, date.end());Inwiefern ein Programm "verworfen" werden kann, verstehe ich zwar nicht, aber in deiner Schleife hast du doch ein getchar(), es wird also auf eine Benutzereingabe gewartet.
Und Initailaisierung, Test und Abbruchbedingung wird im Schleifenkopf jeweils durch ein Semikolon getrennt.Zum Testen kannst du es doch auch verkürzen:
int main () { for (a=0; a<10; a++) { cout << dateiname () << endl; getchar(); } }
-
FillColin schrieb:
Kann mir jm. weiterhelfen was ich falsch mache
Du bindest zum Beispiel tonnenweise Header doppelt und in verschiedenen Versionen (C-Version, C++Version von time.h/ctime) ein, zum Teil auch Header die du garnicht benutzt. Das vermittelt den Eindruck dass du entweder nicht besonders sorgfältig bist oder aber einfach nur Programmfetzen zusammenkopierst ohne so recht zu wissen was du anstellst.
Der Zeilenumbruch den du bekommst ist normal, das ist ein Feature von asctime (steht auch in jeder Referenz).
Dein Programm wird auch nicht einfach "verworfen" sondern es fliegen Exceptions, die du nicht fängst. Finde mit dem Debugger raus, woher die Exceptions kommen (Tip: schonmal einen Zeilenumbruch in einem Dateinamen gesehen?)
-
Ja ich weiß das viel zu viele header drinn sind, dass liegt allerdings daran, dass das Programm viel größer ist und ich nur den Teil kopiert habe, der mir Probleme macht. Ich wollte nun für das Problem keine 200 Zeilen posten.
Das mit der Newline hatte ich mir gedacht, wusste aber nicht wie ich diese wegbekomme.
DANKE "mapper" für den Hinweis wie man das machen kann.
-
Sieht gut aus aber irgendwie wird immer noch keine Datei angelegt. Ich vermute ja wegen den : bei der Zeitangabe.
Mon Aug 20 12:57:47 2012.txtKann man das auch unterbinden, oder gibt es eine einfachere Lösung?
Ich hatte gehofft das in wenigen zeilen erledigen zu können.// T2.cpp: Hauptprojektdatei. #include <string> #include <ctime> // Dateinamengenerierung #include <iostream> // Dateinamengenerierung #include <algorithm> // copy #include <iterator> // i(o)stream_iterator #include <fstream> #include <limits> // numeric_limits using namespace std; string dateiname (); int main (void) { time_t result = time(NULL); string ret_name = asctime(localtime(&result)); for (a=0, a<10, a++) { ret_name=dateiname (); cout << ret_name << endl; ifstream f1("test.txt"); // vorhanden ofstream f2(ret_name); // neuanlegen getchar(); // copy(); f1.close(); // Schließen f2.close(); // Schließen } return 0; } string dateiname () { time_t result = time(NULL); string date = asctime(localtime(&result)); date.erase(date.end()-1, date.end()); // Newline entfernen string name = date+".txt"; // Mon Aug 20 12:57:47 2012.txt (Problem mit ":" ) return name; }
-
Es gibt noch die Funtkion
gettime(), die einetmStruktur füllt. Diese Struktur hat eigene Member für Tag, Monat, Jahr, usw. Du musst lediglich die Ausgabe formatieren, z.B. mit einemostringstream.
Inwiefern Zeitzone und Sommerzeit berücksichtigt werden weiß ich nicht, das sollte die Doku aber klären.
-
FillColin schrieb:
Ich vermute ja [...]
Mit bloßen Vermutungen wirst du es nie weit bringen...
pumuckl schrieb:
Finde mit dem Debugger raus, woher die Exceptions kommen
-
Es ist wirklich erbaulich wie nett hier Manche zu Anfängern sein können, die noch leider nicht so geübt in der Handhabung der Sprache und Plattform sind.

"DocShoe" danke für den Tip ich versuche es gleich einmal.

-
FillColin schrieb:
Es ist wirklich erbaulich wie nett hier Manche zu Anfängern sein können, die noch leider nicht so geübt in der Handhabung der Sprache und Plattform sind.

Es war durchaus nicht "unnett" gemeint. Gerade Anfänger steigern sich oft in Vermutungen hinein, die zu nichts führen und einfach nur Zeit kosten. Der Debugger ist ganz knapp nach dem Compiler das wichtigste Instrument bei der Software-Entwicklung.
-
Ok, dann entschuldige bitte, dass ich dies falsch aufgenommen habe das lag nicht in meiner Absicht
__________________________________Sooo, nun habe ich es mit dem vorgeschlagenen Ansatz gelöst, erstmal vielen Dank für den Hinweis.
Es ist meiner ansicht nach dennoch sehr groß geworden, gibt es Möglichkeiten "string get_data()" kompakter, einfacher zu schreiben??
Danke
FIll
#include <string> #include <ctime> // Dateinamengenerierung #include <iostream> // Dateinamengenerierung #include <algorithm> // copy #include <iterator> // i(o)stream_iterator #include <fstream> #include <limits> // numeric_limits #include <sstream> // für get_date using namespace std; string get_date(); int main (void) { string ret_name= get_date(); cout << ret_name << endl; ifstream f1("test.txt"); // vorhanden ofstream f2(ret_name); // neuanlegen getchar(); f1.close(); // Schließen f2.close(); // Schließen return 0; } string get_date() { ostringstream oss; time_t result = time(NULL); tm *datum = localtime(&result); int sec = datum->tm_sec; int min = datum->tm_min; int hour = datum->tm_hour; int tag = datum->tm_mday; int monat = datum->tm_mon+1; int jahr = datum->tm_year+1900; oss << tag <<"-"<< monat <<"-"<< jahr << "_"<< hour <<"h-"<< min <<"m-"<< sec << "s"<<".txt"; string name = oss.str(); return name; }
-
FillColin schrieb:
Es ist meiner ansicht nach dennoch sehr groß geworden, gibt es Möglichkeiten "string get_data()" kompakter, einfacher zu schreiben??
Ja, einfach die lokalen Variablen rauswerfen und die Member der Struktur direkt benutzen

-
Spricht irgend etwas gegen strftime ?
-
oh man ja klar das geht ja...

vielen danke...lalalal...
-
DocShoe schrieb:
FillColin schrieb:
Es ist meiner ansicht nach dennoch sehr groß geworden, gibt es Möglichkeiten "string get_data()" kompakter, einfacher zu schreiben??
Ja, einfach die lokalen Variablen rauswerfen und die Member der Struktur direkt benutzen

meiner Meinung nach muss man es nicht kürzen. Ich würde die Hilfsvariablen noch mit "const" versehen und die Funktion dann so lassen, wie sie ist.
Ich finde es so übersichtlicher, auch wenn es etwas länger ist - und die Hilfsvariablen helfen beim Debuggen.
Felix