Print



  • Hallo, ich habe ein paar kleine Formatierungsprobleme auf meinem outstream.
    momentan verwende ich noch COUT um die Formatierung zu regeln, später im Programm werde ich stattdessen fstream verwenden um auf eine txt-Datei zu schreiben.

    Habe momentan das Problem, dass ich gerne folgende Ausgabe hätte:

    // auf dem Outstream
    PictureLink                                              MyLink
    CardName                                              BlaBlaBla
    Edition                                                     MMM
    Rareness                                                   Rare
    Colour                                                    Black
    ManaCosts                                                  1+3B
    CardType                                              Neverever
    Price                                                     12.95
    

    Wie kann ich denn die Variablen rechtsbündig anordnen?? egal was da von meinem selbstgeschriebenem Scanner an Stringlängen so ankommt? Also ich möchte quasi die strings und doubles die ich habe schön untereinander rechtsbündig am Outstream enden lassen...

    Problem 2:

    Ich habe einen Vector aus strings und möchte den darin gespeicherten text so ausgeben das sinnvolle Zeilenumbrüche ab einer gewissen Länge gemacht werden

    //Outstream
    Text Text Text Text Text Text Text Text Text Text Text Text 
    Text Text Text Text Text Text Text Text Text Text Text Text 
    Text Text Text Text Text Text Text Text Text Text Text Text 
    Text Text Text Text Text Text Text Text Text Text Text Text 
    Text Text Text Text Text Text Text Text Text Text Text Text
    
    //Meine aktuelle Print-Methode
    void CardReader::Print(std::ostream & ost) const {		// Zugriff auf PrivateMember funktioniert nicht (Iterator-Fehler)
    
    	size_t CardCounter = 1;
    
    	ost << "--------------------[Print: Vector]--------------------" << endl;
    
    	for (std::vector<CardInformation>::const_iterator Iter = Vect.begin(); Iter != Vect.end(); Iter++) {
    		ost << "--------------[Karte aus VektorPosition " << CardCounter << "]--------------" << endl;
    
    		ost << setfill(' ') << cPictureLink << setw(55) << Iter->PictureLink << endl;
    		ost << cCardName    << setw(55) << Iter->CardName    << endl;
    		ost << cEdition     << setw(55) << Iter->Edition     << endl;
    		ost << cRareness    << setw(55) << Iter->Rareness    << endl;
    		ost << cColour      << setw(55) << Iter->Colour      << endl;
    		ost << cManaCosts   << setw(55) << Iter->ManaCosts   << endl;
    		ost << cCardType    << setw(55) << Iter->CardType    << endl;
    		ost << cPrice       << setw(55) << Iter->Price       << endl;
    		ost << cTournaments << setw(55) << Iter->Tournaments << endl;
    
    		size_t TextPositonCounter = 0;
    		ost << cCardText    << endl;
    		for(std::vector<std::string>::const_iterator IT = Iter->CardText.begin(); IT != Iter->CardText.end(); IT++){
    			ost << Iter->CardText[TextPositonCounter] << " ";
    			if(TextPositonCounter % 9 == 0) ost << endl;
    			TextPositonCounter++;
    		}
    		ost << endl << endl << endl;
    		CardCounter++;
    	}
    	ost << "--------------------[Print: End]--------------------" << endl;
    }
    

  • Mod

    Problem 0: Da die Streams alle gleich sind, wird eine Lösung für einen Stream für alle funktionieren
    Problem 1: Rechtsbündig und Linksbündig:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <array>
    #include <vector>
    
    int main()
    {
      using namespace std;
      vector<array<string, 2>> foo = {{"Hallo", "Welt"}, {"Tri Tra Tru", "lala"},{"Der Kapser der", "ist wieder da"}};
    
      cout << "Unformatiert:\n";
      for(unsigned i = 0; i < foo.size(); ++i)
        {
          cout << foo[i][0] << foo[i][1] << '\n';
        }
      cout << "\n\nFormatiert:\n";
      for(unsigned i = 0; i < foo.size(); ++i)
        {
          // HIER steht das wichtige, der Rest des Programms ist bloß Drumherum für das Beispiel
          cout << setw(15) << left << foo[i][0];
          cout << setw(15) << right << foo[i][1] << '\n';
        }
    }
    

    Problem 2: Automatischer Zeilenumbruch. Eieiei, das ist ein bisschen schwieriger. Es ist möglich. Du wirst aber dafür einen eigenen Streambuf brauchen, der die Zeichen mitzählt, puffert, an der richtigen Stelle Trennzeichen einfügt und erst dann weitergibt, wenn er sicher ist, dass die Zeile ganz ist. Irgendwo hier im Forum geistert so etwas herum (wahrscheinlich von Autor Werner Salomon, eventuell auch von mir). Ich habe aber gerade keine Zeit, das zu suchen. Wenn du Glück hast liest Werner diesen Thread und zeigt es dir oder du findest es selbst.



  • MathiasS schrieb:

    // auf dem Outstream
    PictureLink MyLink

    Ginge mit

    #include <iostream>
    #include <string>
    #include <stdexcept>
    
    struct Printer
    {
        Printer(size_t toRight):
        mtoRight(toRight) {}
    
        std::string operator()(std::string const& first, std::string const& second)
        {
            if(static_cast<int>(mtoRight) - static_cast<int>(second.length()) - static_cast<int>(first.length()) <= 0)
                throw std::logic_error("Printer::operator(): The amount of characters to the right size is invalid!");
            return first + std::string(mtoRight - second.length() - first.length(), ' ') + second;
        }
    
    private:
    
        size_t mtoRight;
    };
    
    int main()
    {
        Printer p(20);
        std::cout << p("Hallo", "Welt!") << '\n'
                  << p("Bestellung:", "Kaese");
    
    }
    

    Zum Problem Zwei: Wann genau das passiert musst du selbst definieren. 😉



  • Hallo schon mal danke für deine Antwort!

    Ich glaube das Problem aus Beispiel 2 habe ich vllt nicht genau genug beschrieben:

    die Sachen die links stehen bei mir als zb CardName, PictureLink usw...
    sind leider unterschiedlich lang!

    Die Sachen die rechts davon untereinander stehen sollen sind je nach Scannereinlesen IMMER unterschiedlich lang, das weiß ich vorher noch nicht welche strings und doubles das werden.

    Drum wird das glaube ich mit dem Iomanip nicht funktionieren, weil da die jeweiligen zeilen ja kein einheitliches Ende haben oder?

    also habs mal so umgeschrieben:

    ost << cPictureLink << setw(55) << right << Iter->PictureLink << endl;
    		ost << cCardName    << setw(55) << right << Iter->CardName    << endl;
    		ost << cEdition     << setw(55) << right << Iter->Edition     << endl;
    		ost << cRareness    << setw(55) << right << Iter->Rareness    << endl;
    		ost << cColour      << setw(55) << right << Iter->Colour      << endl;
    		ost << cManaCosts   << setw(55) << right << Iter->ManaCosts   << endl;
    		ost << cCardType    << setw(55) << right << Iter->CardType    << endl;
    		ost << cPrice       << setw(55) << right << Iter->Price       << endl;
    		ost << cTournaments << setw(55) << right << Iter->Tournaments << endl;
    

    erhalte dadurch dann aber für jede zeile ein anderes Ende leider 😕



  • Du willst praktisch einen Blocksatz.



  • Hier noch als Nachtrag das vorläufige einzulesende File ( das echte File wird mehrere tausend Zeilen lang sein... )

    Wie man sieht wird jede karte am Outstream ausgegeben und es soll auch jede Karte von ihren Variablen her gleich formatiert sein

    X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
    
    PictureLink     MyLink
    CardName        Vampire Nocturnus
    Edition         M13
    Rareness        Mythic Rare
    Colour          Black
    ManaCosts       1 + 3B
    CardType        Creature - Vampire
    Price           12.95 Euro
    
    Tournaments		Vintage | Legacy | Extended | Modern | Standard
    
    CardText 
    Play with the top card of your library revealed. As long as the top card of your library is black, 
    Vampire Nocturnus and other Vampire creatures you control get +2/+1 and have flying.
    Strength 3 | Weakness 3
    
    X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
    
    PictureLink	    MyLink
    CardName        Lightning Bolt
    Edition         M10
    Rareness        Cummon
    Colour          Red
    ManaCosts       1R
    CardType        Instant
    Price           0.99 Euro
    
    Tournaments		Vintage | Legacy | Extended | Modern | Standard
    
    CardText
    Lightning Bolt deals 3 damage to target creature or player.
    
    X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
    
    PictureLink	    Blabla
    CardName        Blabla
    Edition         Blabla
    Rareness        Blabla
    Colour          Blabla
    ManaCosts       Blabla
    CardType        Blabla
    Price           11.1 Euro
    
    Tournaments		Blabla| Blabla | Blabla | Blabla | Blabla
    
    CardText
    Blabla Blabla Blabla Blabla Blabla Blabla.
    
    X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
    


  • out schrieb:

    Du willst praktisch einen Blocksatz.

    LOL so einfach hätte man es auch sagen können -,-


  • Mod

    Bitte lies meine Antwort, insbesondere mein Beispielprogramm genau! Führ es zur Not selber aus, wenn du mir nicht glaubst:

    Unformatiert:
    HalloWelt
    Tri Tra Trulala
    Der Kapser derist wieder da
    
    Formatiert:
    Hallo                     Welt
    Tri Tra Tru               lala
    Der Kapser der   ist wieder da
    


  • SeppJ schrieb:

    Bitte lies meine Antwort, insbesondere mein Beispielprogramm genau! Führ es zur Not selber aus, wenn du mir nicht glaubst:

    Unformatiert:
    HalloWelt
    Tri Tra Trulala
    Der Kapser derist wieder da
    
    Formatiert:
    Hallo                     Welt
    Tri Tra Tru               lala
    Der Kapser der   ist wieder da
    

    Ah ok jetzt gehts dankö 🙂



  • SeppJ schrieb:

    Bitte lies meine Antwort, insbesondere mein Beispielprogramm genau!

    War fuer ihn ein typischer Fall von tl:dr...


Anmelden zum Antworten