String / Stringstream Frage

tr0nix

tr0nix

der-mit-dem-tux-tanzt
Hallo zusammen

Ich schreibe gerade eine Fehler/Loggingklasse und habe da ein kleines Problem.
Wenn ich was loggen will, kann ich 2 Argumente mitgeben. Zuerst eine art "Level" (enum mit verschiedenen Werten) und als zweites einen String mit dem Fehlerbeschreib.
Nun will ich aber im String einen Satz und eine Variable angeben koennen. Also wenn ich eine Datei oeffnen will will ich sagen koennen
log( NOTICE, (string) "Konnte " <datei> " nicht oeffnen" );

Wie mache ich das am schlausten? Geht das moeglicherweise mit stringstream?

Gruss
Joel

P.S. Datei ist vom Typ string. Habe aber auch int-Werte!
 
Zuletzt bearbeitet:
thorus

thorus

GNU-Freiheitskämpfer
In C++ bin ich ned ganz fit, aber als alter C-Fanatiker würde ich das so machen:
Code:
char *tmp;
sprintf(tmp, "Konnte %s nicht oeffnen", datei);
log(NOTICE, tmp);

cu
thorus

EDIT: Fataler Fehler ;)
Speicher muß noch allokiert werden...

Code:
char *tmp;
tmp = (char *)malloc((strlen(datei)+21)*sizeof(char));
sprintf(tmp, "Konnte %s nicht oeffnen", datei);
log(NOTICE, tmp);
free(tmp);
 
Zuletzt bearbeitet:
tr0nix

tr0nix

der-mit-dem-tux-tanzt
Mh danke, aber ich wuerde den String gerne direkt mitgeben und nicht vorher noch in den Fehlermeldung-String reinkonvertieren.. das wuerde mich jedesmal 2 weitere Codezeilen kosten pro Fehlermeldung :/
 
H

hopfe

Haudegen
Warum wenn das als Funktion machst, brauchst das ganze nur einmal schreiben. Die zwei Zeilen werden zur Laufzeit nicht stark auffallen, da es sich ja um eine Fehlermeldung handelt.
 
tr0nix

tr0nix

der-mit-dem-tux-tanzt
Ich habs mal so geloest:
Ich deklariere in der Klasse welche die Fehler/Logmeldungen wirft eine private Stringstream Klasse.

Code:
// To build error-msg's
stringstream GLLogStream;

Wenn ein Fehler auftritt, baue ich mit der bereits deklarierten Variable den Fehlertext und schicke ihn an die Methode zum loggen (GLLogger ist ein Pointer auf eine statische Methode einer anderen Klasse):
Code:
GLLogStream << "TEXMANAGER: Loading image " << filename <<
				    " failed and no default image defined!" << endl;
GLLogger( GLCRITICAL, GLLogStream );

Da der String via Referenz uebermittelt wird, kann ich den gesetzten String in der Logging-Methode wieder leeren und wieder brauchen.
Nur.. wie leere ich den Stringstream buffer? ;) *narf*

// Edit
Hat sich erledigt. Hab clear() vergessen ;)
 
Zuletzt bearbeitet:
H

hoza

Jungspund
Original geschrieben von thorus
In C++ bin ich ned ganz fit, aber als alter C-Fanatiker würde ich das so machen:
Code:
char *tmp;
sprintf(tmp, "Konnte %s nicht oeffnen", datei);
log(NOTICE, tmp);

So eher:

Code:
void
DoLog(unsigned long severity, const char *fmt, ...) 
{
va_list start;

va_start(start, fmt);

fprintf(logfile, "<%u> ", severity);
vfprintf(logfile, fmt, start);
fprintf(logfile, "\n");

va_end(start);

return;

Dann kannst nämlich ganz gemütlich
DoLog(0, "%i attempts to write on %s failed", num, string);
aufrufen :)
 
tr0nix

tr0nix

der-mit-dem-tux-tanzt
Also mit meiner Loesung bin ich zufrieden ;). Aber es sollen ja auch C'ler etwas davon haben hehe.
 

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Bei PostgreSQL als anderer als der angemeldete Nutzer verbinden - Wo liegt der Fehler

HD Parameter setzen Suse 10.3, lahmer gehts kaum!

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Samba als PDC [Short-HOWTO]

Oben