stringstream - Trennung bei Leerzeichen verhindern



  • Moin.

    Ich verzweilfe gleich mit meinem stringstream. Wenn ich einen String in einem Stringstream habe und diesen wieder in einen String zurückschreiben möchte, gibt er ihn nur bis zum ersten Leerzeichen aus:

    // Pseudocode
    string buffer;
    stringstream is("Hallo Welt");
    is >> buffer;
    return buffer; // nur 'Hallo' drin
    

    Gibt's da ne Möglichkeit das in der Klasse abzuschalten?

    Danke

    /edit:
    Ja, ich weiß. In diesem kleinem Kontext ist string -> stringstream -> string natürlich sinnlos.


  • Mod

    Dazu gibt es zumindest keine einfache Möglichkeit. Eventuell gibt es da Möglichkeiten, wenn man den Unterbau des Streams verändert, aber ich mag da gerade nicht so genau drüber nachdenken, denn Gegenfrage: Wo soll die Leseaktion denn stattdessen aufhören?
    Wenn du diese Frage beantworten kannst, dann kannst du die passende Lesemethode dafür wählen. Der Operator >> ist ja anscheinend nicht das was du suchst.



  • Wie bei jedem anderen Stream auch:

    getline(is, buffer);    // optional mit delimiter als dritten Parameter
    


  • return is.str(); oder auch getline(is,buffer); .



  • Athar schrieb:

    return is.str(); oder auch getline(is,buffer); .

    Nun gut, dann muss ich den Kontext doch erklären. 😃

    Klasse zum Ein- und Auslesen von Config-Files. Im File habe ich Daten nach dem Schema "Key:Value". Meine Klasse liest alles ein und ich möchte nun eine spezialisierte Methode, die - abhängig vom mitgegebenen Typ - mir die Werte zurückgibt. Daher kann ich nicht return is.str() nehmen, weil ich nicht weiß, ob ich einen String habe, oder einen anderen Typ.

    template<class T>
    T getValue(string key)
    {
    	map<string, string>::iterator it = content.find(key);
    	if(it == content.end())
    		throw CFIOKeyNotFoundEx(key.c_str());
    
    	T buffer;
    	stringstream is(it->second);
    	is >> buffer;
    
    	return buffer;
    }
    

    Ich denke das Prinzip ist klar. Wenn ich nun einen String als Eintrag habe, darf der natürlich Leerzeichen enthalten. Ich muss aber IMHO den obigen Weg nehmen, damit es für alle Typen allgemeingültig ist. Ich möchte auch keine extra-Methode nur für Strings haben, wo ich diese gesondert behandle.



  • Du könntest die Template-Methode einfach für "string" spezialisieren:

    template<>
    string getValue<string>(string key)
    {
        map<string, string>::iterator it = content.find(key);
        if(it == content.end())
            throw CFIOKeyNotFoundEx(key.c_str());
    
        return it->second;
    }
    

    Am Anwender-Code ändert sich dann nichts...



  • Th69 schrieb:

    Du könntest die Template-Methode einfach für "string" spezialisieren:

    Oh man, das ich da nicht selbst drauf gekommen bin ist ja fast peinlich... Danke, werde ich morgen gleich ausprobieren. Danke schön!



  • Super, habs ausprobiert und funktioniert perfekt. Danke


Anmelden zum Antworten