Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Formatierte Ausgabe mit std::cout

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.02.2009, 19:26 Uhr
~derKomische
Gast


Hallo Zusamme,

ich wuerde gerne mittels std::cout rechts- und linksbuendige Ausgaben erzeugen. Leider klappt es nur so halb mit folgendem Code:


C++:
#include <iostream>
#include <iomanip>

int main( int argc, char ** argv )
{
    std::cout << std::setiosflags( std::ios::left ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
        std::cout << std::setiosflags( std::ios::right ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
        std::cout << std::setiosflags( std::ios::left ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
        std::cout << std::setiosflags( std::ios::right ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;

    return 0;
}



Erwartete Ausgabe:

Code:
#Tach      #
#      Tach#
#Tach      #
#      Tach#



tatsaechliche Ausgabe:

Code:
#Tach      #
#      Tach#
#      Tach#
#      Tach#



Irgendwie scheine ich wohl den "std::setiosflags( std::ios::right )" nicht richtig zu verstehen.

Kann mir vielleicht jemand weiterhelfen, wie ich in einem std::cout teils rechts- und teils linksbuendige Textbloecke ausgeben kann. (Klar kann man das manuell programmieren, aber das ist ja nicht wirklich ordentlich, wenn der stl das scheinbar anbietet)

danke im Vorraus

Dieser Post wurde am 21.02.2009 um 21:03 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.02.2009, 21:18 Uhr
~f.-th.
Gast


Hab es unter Win gecheckt, wusste vorher auch nicht:


C++:
#include <iostream>
#include <iomanip>

int main( int argc, char ** argv )
{
    std::cout << std::setiosflags( std::ios::left ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::setiosflags( std::ios::right ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::resetiosflags(std::ios::right) << std::setiosflags( std::ios::left ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::setiosflags( std::ios::right ) << "#" << std::setfill( ' ' ) << std::setw( 10 ) << "Tach" << "#" << std::endl;

    return 0;
}


das reset notwendig ist - hab es nur an der einen Stelle eingefügt - warum nicht an
den anderen kann ich auch nicht sagen

Sauberer ist es wahrscheinlich noch einige reset mehr

MfG f.-th.

Dieser Post wurde am 22.02.2009 um 09:10 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.02.2009, 22:01 Uhr
0xdeadbeef
Gott
(Operator)


Dass das überhaupt funktioniert, ist eigentlich ziemlich erstaunlich, und ob es mit jedem Compiler funktioniert, wage ich stark zu bezweifeln.

std::setiosflags funktioniert mit selective flags nicht, d.h., left, right, internal, dec, oct, hex, fixed und scientific können damit nicht gesetzt werden. Es ruft ja nur setf mit dem übergebenen Parameter auf, und da

C++:
std::cout.setf(std::ios::left); // FALSCH!
std::cout.setf(std::ios::left, std::ios::adjustfield); // Richtig.


ergibt sich diese Problematik. Wenn die Implementierung straightforward ist, wird vermutlich beim ersten mal das left-bit gesetzt (was es vermutlich eh schon ist), beim zweiten mal das right-bit, und von da an sind beide gesetzt und die weiteren Aufrufe bringen nichts mehr - verlassen kann man sich darauf aber genausowenig wie darauf, was passiert, wenn beide bits gesetzt sind.

Zum Glück gibt es aber ja dedizierte Manipulatoren dafür:

C++:
#include <iostream>
#include <iomanip>

int main()
{
  std::cout << std::left  << "#" << std::setw(10) << "Tach" << "#\n"
            << std::right << "#" << std::setw(10) << "Tach" << "#\n"
            << std::left  << "#" << std::setw(10) << "Tach" << "#\n"
            << std::right << "#" << std::setw(10) << "Tach" << "#"
            << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.02.2009 um 22:02 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.02.2009, 09:12 Uhr
~f.-th.
Gast


Hatte die erst Variante nach einem anderen Beispiel im Netz angepasst.

Noch ein wenig herum probiert.
Nun ein wenig kürzer


C++:
#include <iostream>
#include <iomanip>

int main( int argc, char ** argv )
{
    std::cout << std::setfill( '-' );
    std::cout << std::setiosflags( std::ios::left ) << "#" << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::setiosflags( std::ios::right ) << "#" << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::resetiosflags(std::ios::right) << "#" << std::setw( 10 ) << "Tach" << "#" << std::endl;
    std::cout << std::setiosflags( std::ios::right ) << "#" << std::setw( 10 ) << "Tach" << "#" << std::endl;

    return 0;
}



Ist wohl so das irgendwann beide Flags gesetzt sind und da rechts und links nicht
gleichzeitig möglich sind eins den Vorrang hat

MfG f.-th.

Dieser Post wurde am 22.02.2009 um 09:13 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.02.2009, 09:14 Uhr
~f.-th.
Gast


Die Tags wollen nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.02.2009, 00:47 Uhr
0xdeadbeef
Gott
(Operator)


Das Verhalten deines Beispiels ist nach wie vor nicht definiert. Selbst wenn man den Standard so liest, dass setf einfach stumpf die Bitmaske durchschleift, in der zweiten Zeile sind das left- und das right-Bit beide gesetzt, und du hast keinerlei Garantie, dass der Stream das als rechtsbündige Formatierung versteht. Es funktioniert bei dir nur zufällig, und wird es mit anderen Compilern (oder Bibliotheken) unter Umständen nicht tun.

std::setiosflags und std::resetiosflags sind für selective flags stumpf nicht gedacht. Benutz std::left und std::right, ernsthaft - dafür sind sie ja da.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.02.2009, 08:59 Uhr
~derKomische
Gast


Hey super,

dann war meine Vermutung ja richtig: ich hatte es nicht verstanden

nochmals vielen Dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: