Stringstreams



  • Hi Leute, gobt es irgendwo eine gute beschreibunh wie stringstreams funktionieren?
    Würde mein wissen bei den stringstreams gern etwas stärken!

    Oder vielleicht kann hier jemand erklären, mit codebeispielen und so?



  • Hallo,
    was genau willst du denn wissen? Wie man stringstreams benutzt oder wie sie intern implementiert sind?



  • also wie man sie benutzt....(nicht das speziellste, aber schon bisschen mehr als wie ein wort reinschreiben und auslesen)...



  • hm....bekomm ich da noch ne antwort? 😕



  • Eine_Frage schrieb:

    hm....bekomm ich da noch ne antwort? 😕

    Weist du wie man mit filestreams umgeht? Wenn ja ist es fast das selbe mit dem unterschied das es keine files sind. Oder wie mit cout und cin.

    es gibt doch std::ostringstream, std::istringstream und std::stringstream

    - std::ostringstream ( output stringstream ) ( vergleichbar mit std::ifstream oder std::cin (von der verwendung her) )
    - std::istringstream ( input stringstream ) ( vergleichbar mit std::ofstream oder std::cout bzw. std::cerr (von der verwendung her) )
    - std::stringstream ( input und output stringstream )

    ein beispiel für die Verwendung eines stringstreams wäre z.b. boost::lexical_cast
    das wird folgendermaßen ( zwar nicht exakt so, aber so ähnlich ) implementiert:

    (Folgender Sourcecode ist aus Exceptional C++ Style von Herb Sutter ( seiten 22 u 23 ): )

    template< typename Target , typename Source > 
       Target lexical_cast( Source arg )
       {
          std::stringstream interpreter;
          Target result;
          if(!(interpreter << arg) || !(interpreter >> result) || !(interpreter >> std::ws).eof())
            throw  bad_lexical_cast();
          return result;
       }
    

    Hier wird z.b. ein String "123" in einen int 123 umgewandelt:

    int zahl = lexical_cast<int>("123");
    

    Wie du siehst ganz praktisch. Eine andere Möglichkeit wäre das du deine Klassen Persistent machst und erst einmal alles im Speicher serialisierst anstatt direkt in eine Datei, was eigentlich schneller gehen sollte(wenn es viele daten sind), da du im Anschluß die kompletten informatioinen auf einen Schwung in eine Dateischreiben kannst und nicht für jedes Objekt neue schreiboperationen beginnen musst.

    Ich weiß nicht genau was du dir bei den stringstreams so vorgestellt hast, aber ich denke das es eigentlich nicht viel mehr dazu zu sagen gibt.

    BR



  • danke, nur hab ich boost leider nicht, und kenn mich damit garnicht aus!

    Aber mit filestreams kenn ich mich etwas was:

    ifstream und ofstream!
    write, read, <<, >>

    nur das seek und tell hab ich nicht verstanden!

    kann man mir ein beispiel anhand eines stringstream obnjektes geben?

    stringstream str;
    


  • #include <sstream>
    #include <iostream>
    
    int main()
    {
      char const * data = "Dies ist sind irgendwelche Daten, die du in den Stream geschrieben hast, bzw. schreibst und nun möchtest darin rum suchen (seeken)";
      std::stringstream sstr;
      sstr << data;
    
      sstr.seekg(-15,std::ios::end); //  Zum lesen 15 stellen vor das ende 
      char suchen[7] = {0};
      sstr.read(suchen,6);
      std::cout << suchen << std::endl;
    
      sstr.seekp(-15,std::ios::end); //  Zum schreiben 15 stellen vor das ende 
      sstr.write("kisten",6); // jetzt überschreiben wir das wort suchen mit kisten
    
     // Nun lesen wir das noch einmal aus: 
      sstr.seekg(-15,std::ios::end); //  Zum lesen 15 stellen vor das ende 
      char kisten[7] = {0};
      sstr.read(kisten,6);
      std::cout << kisten << std::endl;
    }
    


  • Es gibt dann für seekg und seekp noch die Möglichkeiten:

    std::ios::beg position vom anfang zb.

    sstr.seekg( 10 , std::ios::beg );
    

    oder std::ios::cur von der aktuellen position aus

    sstr.seekg( 10 , std::ios::beg );// jetzt sind wir an position 10
    sstr.seekg( 10 , std::ios::cur ); jetzt an position 20
    

    usw.

    BR



  • ok, das probier ich mal aus!

    Noch was würd ich gern wissen!

    Wie schreibe ich in den stream nacheinander zeichen, und wie lese ich diese nacheinander aus?

    Und funktioniert das alles auch mit string?



  • Das funktioniert entweder so:

    sstr << "Hallo ich bin eine weitere Zeichenkette in diesem string";
    

    und so:

    char const * einstring = "*sing* \"Hallo du da! Ja du da! Siehst du dich nicht auch ab und zu mal, auf weiter Flur nur von Einzellern umgeben, ... \"";
    
    sstr.write(einstring,strlen(einstring));
    

    🤡



  • das mit dein einzellern war nich auf mich bezogen oder?

    Ich meinte eher, wie ich sachen in einer schleife nacheinander reinschreibe, und in einer schleife nacheinander auslese!



  • nein das mit den einzellern war nicht auf dich bezogen, das ist aus einem Lied das mir grad im Kopf rumschwirrt *g*

    char const * data[] = { "Dies ist ein string\n","Und das ist ein anderer\n","auch ich bin nicht der gleiche\n" };
    for(unsigned i = 0; i < 3; ++i)
        sstr << data[i];
    
    // Und nun lesen wir zeile für zeile wieder ein:
    std::string line;
    while( std::getline(sstr,line) )
        std::cout << line << std::endl;
    


  • @Hume: wolltest du nicht auch noch was schreiben...=/


Anmelden zum Antworten