2010-02-25 8 views
6

könnte mir jemand über einige praktische Beispiele zur Verwendung von String-Streams in C++ erzählen, d. H. Eingabe und Ausgabe in einen String-Stream unter Verwendung von Stream-Insertion- und Stream-Extraction-Operatoren?C++: Welche Vorteile bieten String-Streams?

+0

Sie meinen cin und cout? Im Gegensatz zu C-style getc und printf? –

+2

@Vanessa: OP bedeutet wahrscheinlich 'std :: stringstream', (' #include ') – Bill

+0

@Bill: ja ich meine das! –

Antwort

11

können Sie String-Streams verwenden, um etwas zu konvertieren, die operator << in einen String implementiert:

#include <sstream> 

template<typename T> 
std::string toString(const T& t) 
{ 
    std::ostringstream stream; 
    stream << t; 

    return stream.str(); 
} 

oder sogar

template <typename U, typename T> 
U convert(const T& t) 
{ 
    std::stringstream stream; 
    stream << t; 

    U u; 
    stream >> u; 

    return u; 
} 
+0

Denken Sie daran, dass diese Lösung nur für primitive Typen und überladene Versionen von 'operator <<' mit bestimmten Klassen funktioniert. – fogo

+1

@fogo: Und da es relativ üblich ist, Streaming-Operatoren für Klassen zu definieren, ist das keine so große Sache. –

+0

@Martin York In der Tat habe ich gerade einen richtigen Kommentar erwogen, wenn man bedenkt, dass * irgendwas * in der Antwort umgeschrieben wurde. – fogo

2

Neben Vorteile gibt es one point to carefully consider, wenn Sie gcc 4.3.1 verwenden. Ich habe die vorherigen Versionen von gcc nicht überprüft.

+0

Dies war eine Einschränkung einer bestimmten Implementierung (gcc). Es folgt der Link durch den Bugzilla-Bug, der mit dem Problem verbunden ist. Sie werden auch bemerken, dass der Bug als gelöst markiert wurde. der Mutex wird nicht mehr verwendet –

+0

Dann ist es großartig! Ich werde meinen Beitrag bearbeiten, um Informationen hinzuzufügen, welche diese Informationen nur für einige Versionen von gcc relevant sind. –

2

Sie können überall dort verwendet werden, wo ein normaler Stream verwendet werden kann.

In Situationen, in denen Sie aus einer Datei gelesen haben, könnten Sie möglicherweise aus einem Zeichenfolge-Stream lesen.

void compile(std::istream& str) 
{ 
    CPlusPlusLexer lexer(str); 
    CPlusPlusParser parser(lexer); 
    BackEnd   backend(parser); 

    backend.compile(); 
} 

int main() 
{ 
    std::fstream file("Plop.cpp"); 
    compile(file); 

    std::stringstream test("#include <iostream>\n int main() { std::cout << \"H World\n\";}"); 
    compile(test); 
} 
3

Ich benutze sie meist als Speicherpuffer, bei der Schaffung von Meldungen:

if(someVector.size() > MAX_SIZE) 
{ 
    ostringstream buffer; 
    buffer << "Vector should not have " << someVector.size() << " eleements"; 
    throw std::runtime_error(buffer.str()); 
} 

oder komplexe Strings zu konstruieren:

std::string MyObject::GenerateDumpPath() 
{ 
    using namespace std; 

    std::ostringstream  dumpPath; 

    // add the file name 
    dumpPath << "\\myobject." 
     << setw(3) << setfill('0') << uniqueFileId 
     << "." << boost::lexical_cast<std::string>(state) 
     << "_" << ymd.year 
     << "." << setw(2) << setfill('0') << ymd.month.as_number() 
     << "." << ymd.day.as_number() 
     << "_" << time.hours() 
     << "." << time.minutes() 
     << "." << time.seconds() 
     << ".xml"; 

    return dumpPath.str(); 
} 

Es ist nützlich, weil es die Erweiterbarkeit von std::stream bringt s zur Verwendung von Zeichenpuffern (Ostreams-Erweiterbarkeit und Locales-Unterstützung, Pufferspeicherverwaltung ist verborgen und so weiter).

Ein anderes Beispiel war ich der Fehler in gsoap Bibliothek Berichterstattung gesehen haben, Dependency Injection mit:. soap_stream_fault einen ostream & Parameter nimmt in Fehlermeldungen melden

Wenn Sie möchten, passieren kann std :: cerr, std :: cout oder eine std :: ostringstream-Implementierung (ich verwende es mit einer std :: ostringstream-Implementierung).

Verwandte Themen