mehrzeilige Konsolenausgabe



  • Wie kann ich eine mehrzeilige Konsolenausgabe erstellen bzw. erzeugen ohne z.B. sowas:

    for(x=0;x<100;x++)
    {
      std::cout << array[x] << std::endl;
    }
    

    aber da würde ja jede zeile einzeln ausgegeben... ich möchte aber ALLE zeilen auf einmal ausgeben... geht soetwas überhaupt?



  • Geh halt nen Umweg über einen stringstream . Zuerst alles in den stringstream schreiben, dann den stringstream nach cout .



  • Kann im Augenblick nichts testen, darum aus dem Bauch: Alle Zeilen (abgeschlossen mit /n) in String, dann ausgeben?
    Oder so; zu spät.



  • DocShoe schrieb:

    Geh halt nen Umweg über einen stringstream . Zuerst alles in den stringstream schreiben, dann den stringstream nach cout .

    danke genau das hab ich gemeint ...
    perfekt 🙂 problem gelöst...

    hier :

    std::stringstream ss;
    ss << ".... \n" << "....\n" <<std::endl;
    

    - mit "\n" Zeilenumbruch ... 🙂
    - vielen dank für alle antworten... 😃 👍
    lg


  • Mod

    😕 Und was ist da dran deiner Meinung nach nun anders, als wenn du es direkt nach cout schreiben würdest (außer, dass es nun umständlicher ist)?

    PS: Dir ist schon klar, dass endl != '\n'?



  • SeppJ schrieb:

    PS: Dir ist schon klar, dass endl != '\n'?

    Auf der Konsole schon und hier handelt es sich zweifelsfrei um Konsolenausgaben.



  • SeppJ schrieb:

    😕 Und was ist da dran deiner Meinung nach nun anders, als wenn du es direkt nach cout schreiben würdest (außer, dass es nun umständlicher ist)?

    Da kommen dann sporadisch die Zeilen an, wenn man das anders macht, ist da eine Pause und dann die Zeilen schneller hintereinander. Oder so.



  • SeppJ schrieb:

    😕 Und was ist da dran deiner Meinung nach nun anders, als wenn du es direkt nach cout schreiben würdest (außer, dass es nun umständlicher ist)?

    - ähm findest du stringstreams umständlich?
    - eig wollte ich der übersichtlichkeit halber ein stringstream nutzen, da du bei einer mehrzeiligen ausgabe mit cout, wie oben schon beschrieben eine for-schleife nutzen musst soweit ich weiß (sofern kein stringstream genutz wird)
    - da ich 1. keine for-schleife durchlaufen will bzw. muss, rechenleistung die gespart werden kann... (auch wenns evt. nix ausmacht 😃 )
    - 2. ist es wesentlich übersichtlicher und meiner meinung nach auch einfacher ein stringstream zu nutzen da du damit den text sehr gut und nachvollziehbar setzten kannst

    z.B. so:

    std::stringstream stringstream_beispiel;
    stringstream_beispiel << "1" << "2"<<
                          << "3\n" << "4 \n"
                          << std::endl; 
    
    std::cout << stringstream_beispiel.str() << std::endl;
    

    - hier habe ich den text an einer stelle und aknn in auch nach 1-2 jahren noch relativ einfach wiederfinden und ggf. anpassen... (auch andere die evt. mal den QUellcode lesen können dies wesentlich besser nachvollziehen oder ändern als mit for-schleife :p )

    - und umständlicher ist dies in meinen augen auch nicht... ganz im gegenteil... einfach gehts doch eig gar nich... 😃

    ps. ja ich kenne den unterschied zwischen std::endl; und "\n" 😃 du?



  • Ich denke SeppJ meinte nicht umständlich, aber umständlicher in Relation zu direkt mit cout zu arbeiten.

    Verstehe auch nicht was an

    std::stringstream stringstream_beispiel; 
    stringstream_beispiel << "1" << "2"<< 
                          << "3\n" << "4 \n" 
                          << std::endl; 
    
    std::cout << stringstream_beispiel.str() << std::endl;
    

    besser sein soll als

    std::cout             << "1" << "2"<< 
                          << "3\n" << "4 \n" 
                          << std::endl;
    

    (Außer, dass im oberen Beispiel ein zweites endl folgt.)



  • HelPleaseHelP schrieb:

    - ähm findest du stringstreams umständlich?

    Unnötige zusätzliche? Joa...

    HelPleaseHelP schrieb:

    - eig wollte ich der übersichtlichkeit halber ein stringstream nutzen, da du bei einer mehrzeiligen ausgabe mit cout, wie oben schon beschrieben eine for-schleife nutzen musst soweit ich weiß (sofern kein stringstream genutz wird)

    Muss man bei Stringstreams auch wenn man da ein Array reinschreiben möchte. Oder man muss es in keinem der Fälle mit std::copy und std::ostream_iterator .

    HelPleaseHelP schrieb:

    - da ich 1. keine for-schleife durchlaufen will bzw. muss, rechenleistung die gespart werden kann... (auch wenns evt. nix ausmacht 😃 )

    Und das hat was genau mit Stringstreams und std::cout zu tun? Die haben ja beide dasselbe Interface...
    Und wenn du weder for -Schleifen (noch sonstige Iterationen) noch Rekursion nutzt, dann sieht dein Code nun so aus?

    std::stringstream stringstream_beispiel; 
    stringstream_beispiel << array[0] << std::endl << array[1] << /* ... */;
    std::cout << stringstream_beispiel.str() << std::endl;
    

    Denn das war ja die Aufgabe im Op.
    Und for -Schleifen und Performance lol... Kurze Schleifen kann der Compiler sowieso selbst unrollen.

    HelPleaseHelP schrieb:

    - 2. ist es wesentlich übersichtlicher und meiner meinung nach auch einfacher ein stringstream zu nutzen da du damit den text sehr gut und nachvollziehbar setzten kannst

    Alles in einen zusätzlichen Stream zu pumpen um dessen Inhalt dann in den eigentlichen Stream zu schreiben findest du wesentlich übersichtlicher und nachvollziehbarer? Na dann...

    HelPleaseHelP schrieb:

    std::stringstream stringstream_beispiel;
    stringstream_beispiel << "1" << "2"<<
                          << "3\n" << "4 \n"
                          << std::endl; 
    
    std::cout << stringstream_beispiel.str() << std::endl;
    

    Hmm, ne danke, dann doch lieber das:

    tkausl schrieb:

    std::cout             << "1" << "2"<< 
                          << "3\n" << "4 \n" 
                          << std::endl;
    

    Kürzer, besser lesbar (man kennt das endgültige Ziel sofort) und u.U. (wenn der Compiler nicht alles optimieren konnte) auch schneller.

    HelPleaseHelP schrieb:

    - hier habe ich den text an einer stelle und aknn in auch nach 1-2 jahren noch relativ einfach wiederfinden und ggf. anpassen... (auch andere die evt. mal den QUellcode lesen können dies wesentlich besser nachvollziehen oder ändern als mit for-schleife :p )

    ???? Hier gibst du das Array mit den 100 Einträgen auch gar nicht aus, schon klar braucht's dann keine Schleife. Hier braucht's auch keine Schleife wenn du direkt nach std::cout schreibst. Das Interface ist wie gesagt dasselbe.

    HelPleaseHelP schrieb:

    - und umständlicher ist dies in meinen augen auch nicht... ganz im gegenteil... einfach gehts doch eig gar nich... 😃

    Eine zusätzliche Indirektion ist eine Vereinfachung? Na dann...

    HelPleaseHelP schrieb:

    ps. ja ich kenne den unterschied zwischen std::endl; und "\n" 😃 du?

    Nö, tust du nicht. Wieso sonst willst du den Stringstream flushen?



  • asfdlol schrieb:

    HelPleaseHelP schrieb:

    - ähm findest du stringstreams umständlich?

    Unnötige zusätzliche? Joa...

    HelPleaseHelP schrieb:

    - eig wollte ich der übersichtlichkeit halber ein stringstream nutzen, da du bei einer mehrzeiligen ausgabe mit cout, wie oben schon beschrieben eine for-schleife nutzen musst soweit ich weiß (sofern kein stringstream genutz wird)

    Muss man bei Stringstreams auch wenn man da ein Array reinschreiben möchte. Oder man muss es in keinem der Fälle mit std::copy und std::ostream_iterator .

    HelPleaseHelP schrieb:

    - da ich 1. keine for-schleife durchlaufen will bzw. muss, rechenleistung die gespart werden kann... (auch wenns evt. nix ausmacht )

    Und das hat was genau mit Stringstreams und std::cout zu tun? Die haben ja beide dasselbe Interface...
    Und wenn du weder for -Schleifen (noch sonstige Iterationen) noch Rekursion nutzt, dann sieht dein Code nun so aus?

    std::stringstream stringstream_beispiel; 
    stringstream_beispiel << array[0] << std::endl << array[1] << /* ... */;
    std::cout << stringstream_beispiel.str() << std::endl;
    

    Denn das war ja die Aufgabe im Op.
    Und for -Schleifen und Performance lol... Kurze Schleifen kann der Compiler sowieso selbst unrollen.

    HelPleaseHelP schrieb:

    - 2. ist es wesentlich übersichtlicher und meiner meinung nach auch einfacher ein stringstream zu nutzen da du damit den text sehr gut und nachvollziehbar setzten kannst

    Alles in einen zusätzlichen Stream zu pumpen um dessen Inhalt dann in den eigentlichen Stream zu schreiben findest du wesentlich übersichtlicher und nachvollziehbarer? Na dann...

    HelPleaseHelP schrieb:

    std::stringstream stringstream_beispiel;
    stringstream_beispiel << "1" << "2"<<
                          << "3\n" << "4 \n"
                          << std::endl; 
    
    std::cout << stringstream_beispiel.str() << std::endl;
    

    Hmm, ne danke, dann doch lieber das:

    tkausl schrieb:

    std::cout             << "1" << "2"<< 
                          << "3\n" << "4 \n" 
                          << std::endl;
    

    Kürzer, besser lesbar (man kennt das endgültige Ziel sofort) und u.U. (wenn der Compiler nicht alles optimieren konnte) auch schneller.

    HelPleaseHelP schrieb:

    - hier habe ich den text an einer stelle und aknn in auch nach 1-2 jahren noch relativ einfach wiederfinden und ggf. anpassen... (auch andere die evt. mal den QUellcode lesen können dies wesentlich besser nachvollziehen oder ändern als mit for-schleife )

    ???? Hier gibst du das Array mit den 100 Einträgen auch gar nicht aus, schon klar braucht's dann keine Schleife. Hier braucht's auch keine Schleife wenn du direkt nach std::cout schreibst. Das Interface ist wie gesagt dasselbe.

    HelPleaseHelP schrieb:

    - und umständlicher ist dies in meinen augen auch nicht... ganz im gegenteil... einfach gehts doch eig gar nich...

    Eine zusätzliche Indirektion ist eine Vereinfachung? Na dann...

    HelPleaseHelP schrieb:

    ps. ja ich kenne den unterschied zwischen std::endl; und "\n" du?

    Nö, tust du nicht. Wieso sonst willst du den Stringstream flushen?

    ... ein festgesetzten text mit:

    cout << "1" << "2" << endl;
    

    😃 ...
    ist meiner meinung nach wenn du im nachhinein meldungen ändern möchtest umständlicher da du dann durch den code scrollst und dies tust...

    naturlich ist richtig was du sagst und wenn der stringstream nicht gebraucht wird dann geht auch .... (bzw. sollte man dies nutzen)

    cout << " 1 " << " 2 " ..
    

    jedoch brauhc ich genau das... 🙄 (ich will kein cout machen und genau deswegen brauch ich alles im stringstream ... )
    brauchen wir doch jetzt nicht drüber diskutieren was für mich geeigneter ist oder?
    zur reinen ausgabe ist sicherlich cout geeigneter...
    hast du recht sehe ich auch so... sollte meiner meinung nach am anwendungszweck entschieden werden um unnötige deklaratione oder variablen oder sonstiges zu vermeiden ! 🙄

    😃
    ups, sry endl gehört nat. nicht zum stringstream... da hab ich mich vertippt ... hatte ich gar nicht gesehen... 🙄
    und ich kenne den unterschied und die bedeutung trozdem :p


Anmelden zum Antworten