N
Das war natürlich nur ein Vorschlag...
Aber die Argumente verstehe ich nicht:
volkard schrieb:
ruf niemals close auf, wenn es der destuktor auch macht.
rof niemals open auf, wenn es der konstruktor auch macht.
Aber destruktor wird nur einmal aufgerufen, ich will die Datei aber nach jedem Eintrag schließen.
Aber das Objekt wird nur einmal initialisiert, ich will es aber mehrmals öffnen...
volkard schrieb:
long ip_adresse;
string requuse_uri;
...
ofstream("log.txt")<<"request "<<request_uri<<" from "<<ip_adresse<<'\n';
Klar, das geht nicht. Eigentlich wollte ich mir nur die Tipperei des .open(...);...;.clos(...); ersparen. Ich hab das ganze mit einem Makro gemacht, als ich auf das Problem gestoßen bin:
#define write_to_log(x)\
logfile.open(LOGFILENAME,ios::out|ios::app);\ //LOGFILENAME mit define eingeführt, logfile global
logfile<<x;\
logfile.close()
Nun gibt es ein Problem mit der initialisierung von logfile, also ist das Makro ungeeignet für ausgaben vor main().
Außerdem ist es ein Makro, und da die (aus gutem Grund) nicht beliebt sind und man vor allem dieses ersetzen kann: (mal eben hingeschreieben)
class logstream
{
private:
std::string logfile;
std::fstream lstr;
public:
logstream(const std::string& lfn):logfile(lfn){};
template<class T>
void inner_op_out(typename boost::call_traits<T>::param_type t) //damit sollte man int& (und die nicht vorhandenen Überladungen dafür) umgehen können
{
lstr.open(logfile,ios::app|ios::out);
lstr<<T;
lstr.close(); //suboptimal, aber mir fällt nichts anderes ein...
};
};
template<class T>
logstream& operator<<(logstream& l,typename boost::call_traits<T>::param_type t)
{
l.inner_op_out(t);
return l;
};
Jetzt haben wir immer noch eine globale Variable, aber kein Makro mehr. Entweder wir lassens so, oder benutzen ein singleton...