2016-07-05 17 views
-1

Wenn ich den folgenden Code ausführen, foobar_fname durch den Inhalt von foobar_fname wenn getline läuft überschrieben wird:Warum überschreibt std :: getline das char-Array mit dem Dateinamen?

ostringstream st_foobar_fname; 
st_foobar_fname << foostr << BAR_CONST << barstr; 
const char *foobar_fname = (st_foobar_fname.str()).c_str(); 

ifstream foobar_file(foobar_fname); 
debug("Reading '%s'", foobar_fname); 

string foobar_def = ""; 
if (getline(foobar_file, foobar_def)) { 
    debug("'%s' reported message '%s'", foobar_fname, foobar_def.c_str()); 
} else { 
    error("Unable to read '%s'", foobar_fname); 
} 

Zum Beispiel, wenn foobar_fname=/home/user/fname und /home/user/fname enthält 'simple-Text-Inhalt', sieht die Ausgabe wie:

Reading '/home/user/fname' 
'simple-text-content' reported message 'simple-text-content' 

wenn jedoch /home/user/fname nicht vorhanden ist (und getline ausfällt), ist der Ausgang korrekt:

Reading '/home/user/fname' 
Unable to read '/home/user/fname' 

Wohin gehe ich falsch?

(Dies ist ein Stück alten Code, für den ich keine neuen Abhängigkeiten einführen möchte, also C++ 11, boost, etc sind keine praktikablen Lösungen).

+1

Könnten Sie bitte so freundlich sein und die Verwendung mit einem [MCVE] bieten, hier ist [etwas für den Anfang] (http://coliru.stacked-crooked.com/a/d4727423864d880e). (oder versuchen Sie es zumindest mit Ideone, die Standardeingabe ist dort einfacher) –

Antwort

2

Sie sehen die Symptome von undefiniertem Verhalten.

st_foobar_fname.str() 

gibt std::string zurück.

speichert einen Zeiger, der nach Ausführung der Zeile ungültig ist, da er einem temporären Objekt entspricht. Das temporäre Objekt wird zerstört und Sie bleiben mit einem baumelnden Zeiger zurück. Wenn Sie den Wert beibehalten möchten, verwenden Sie std::string.

std::string foobar_fname = st_foobar_fname.str(); 
+0

Das war es; Danke und guten Fang. – javanix

Verwandte Themen