Parallele Ausgabe mit cout sowie ofstream



  • Hallo

    In meinem C++ Programm will ich mir wichtige Zwischenergebnisse ausgeben lassen. Das mache ich einerseits mit std::cout und andererseits habe ich mit ofstream am Anfang des Programms einen Befehl print deklariert, der den Inhalt in eine Textdatei schreibt. Jedesmal wenn ich also ein cout setze kommt danach direkt ein befehl print von mir.

    Das funktioniert auch wunderbar, doch leider werden mir die Ergebnisse alle untereinander geschrieben (was ja auch erstmal intuitiv ist. Wieso sollte C++ denn auch was anderes machen...). Was kann man nun aber machen, damit ich zwei Ausgaben parallel anzeigen lassen kann? Das muss doch irgendwie gehen?

    Ein konkretes Beispiel aus meinem Programm: In der Konsole und dem textfile werden mir zwei Matrizen die ich berechne wie folgt ausgegeben:

    Binäre Adjazenzmatrix (ohne Selbstkopplung):
    0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 
    0 0 0 0 1 0 1 0 
    0 0 0 0 0 0 0 0 
    0 0 1 0 0 0 1 0 
    0 0 0 0 0 0 0 0 
    0 0 1 0 1 0 0 0 
    0 0 0 0 0 0 0 0 
    
    Bipolare Adjazenzmatrix (ohne Selbstkopplung):
     0 4 0 4 2 4 2 4 
     4 0 0 4 2 4 2 4 
     0 0 0 0 2 0 2 0 
     4 4 0 0 2 4 2 4 
     2 2 2 2 0 2 4 2 
     4 4 0 4 2 0 2 4 
     2 2 2 2 4 2 0 2 
     4 4 0 4 2 4 2 0
    

    Was ich möchte wie es aussehen soll wäre folgendes:

    Binäre Adjazenzmatrix (ohne Selbstkopplung)              Bipolare Adjazenzmatrix (ohne Selbstkopplung):
    0 0 0 0 0 0 0 0                                          0 4 0 4 2 4 2 4 
    0 0 0 0 0 0 0 0                                          4 0 0 4 2 4 2 4 
    0 0 0 0 1 0 1 0                                          0 0 0 0 2 0 2 0 
    0 0 0 0 0 0 0 0                                          4 4 0 0 2 4 2 4 
    0 0 1 0 0 0 1 0                                          2 2 2 2 0 2 4 2 
    0 0 0 0 0 0 0 0                                          4 4 0 4 2 0 2 4 
    0 0 1 0 1 0 0 0                                          2 2 2 2 4 2 0 2 
    0 0 0 0 0 0 0 0                                          4 4 0 4 2 4 2 0
    

    Ist sowas machbar und wie würde das realisiert werden?

    Vielen Dank für Hilfe und Grüße
    cpp_Jungspund



  • Ich würde mir eine Klasse bauen, die ein 2D-Array und eine printAt(x,y,text)-Funktion hat. Ist aber nur eine Möglichkeit.



  • Alternativ macht man die Ausgabe Zeile für Zeile und muss dann abwechseln von den Matrizen Daten ausgeben und dazwischen entsprechend viele Leerzeichen einfügen.



  • Hi

    Leprechaun schrieb:

    Ich würde mir eine Klasse bauen, die ein 2D-Array und eine printAt(x,y,text)-Funktion hat. Ist aber nur eine Möglichkeit.

    Könntest du bitte ein beliebiges Minimalbeispiel schreigen um zu zeigen wie das geht?

    Wird das dann auch mit ofstream funktionieren? Ich will ja eine Ausgabe auf dem terminel und in einem Text file.

    sebi707 schrieb:

    Alternativ macht man die Ausgabe Zeile für Zeile und muss dann abwechseln von den Matrizen Daten ausgeben und dazwischen entsprechend viele Leerzeichen einfügen.

    Das ist leider keine Option für mich, weil ich mit absoluter Gewissheit weiss, dass ich dann völlig den Überblick verliere was ich mache.

    Danke für die Hilfe und Gruß
    cpp_Jungspund



  • cpp_Jungspund schrieb:

    sebi707 schrieb:

    Alternativ macht man die Ausgabe Zeile für Zeile und muss dann abwechseln von den Matrizen Daten ausgeben und dazwischen entsprechend viele Leerzeichen einfügen.

    Das ist leider keine Option für mich, weil ich mit absoluter Gewissheit weiss, dass ich dann völlig den Überblick verliere was ich mache.

    Danke für die Hilfe und Gruß
    cpp_Jungspund

    kannst ja nen char[x][y] machen und dort die matrizen reinschreiben und dann das array ausgeben. dann kommste um die api-fkt drum rum und bleibst plattformunabhängig



  • cpp_Jungspund schrieb:

    Hi

    Leprechaun schrieb:

    Ich würde mir eine Klasse bauen, die ein 2D-Array und eine printAt(x,y,text)-Funktion hat. Ist aber nur eine Möglichkeit.

    Könntest du bitte ein beliebiges Minimalbeispiel schreigen um zu zeigen wie das geht?

    Das ist doch trivial. Im Prinzip:

    1. Im Konstruktor ein 2D-Array anlegen und mit Spaces auffüllen. Das ist dein virtueller Bildschirm.
    2. Funktion schreiben: PrintAt(int,int,String), die einen Text an bestimmte x/y Koordinaten im Array schreibt.
    3. Funktion schreiben: Flush(), die das Array zeilenweise auf den Screen schreibt.

    ^^ das als Grundversion musste erstmal basteln. Wenn das geht, dann Erweiterungen anstöpseln wie Formatierung von Zahlen, Clear(), Steuerzeichen-Interpreter, Write-to-File, C++-Streams, Turtle-Grafik, usw ... 😉



  • Es tut mir leid, aber das ist mir noch viel zu hoch. Ich lerne erst seit sehr kurz zeit C++.

    Die Frage nach dem parallelen Output muss doch schon öfters gestellt worden sein. Gibt es da keine Bibliothek und ne Dokumentation dazu wie es geht, die das einem abnimmt?


  • Mod

    Nein, es gibt keinen fertigen, magischen

    super_duper_parallel_stream out;
    

    Das ist auch keine häufige Frage. Streams tragen als Information bloß Folgen von Zeichen. Position, Zeitpunkt der Ausgabe, Farbe etc. sind alles bestenfalls Interpretationen, die das Ausgabegerät, auf dem die Zeichen letztlich landen, hinzu "erfindet". Entsprechend mag es zwar möglich sein, einem Stream irgendwie diese Eigenart aufzudrücken, aber es gibt keine Methode, die sich aufdrängt. Daher auch keine konkreten Antworten. Es mögen zwar viele Leute eine oder mehrere Ideen haben, aber vermutlich ist niemand so wirklich begeistert von seinen Ideen (zumindest sehe ich das bei mir selber so). Denn wer wirklich so etwas wie du beschreibst braucht, der kann auch gleich eine richtige GUI nutzen. Das wäre sehr viel einfacher und natürlicher, als einem Stream künstlich so etwas auf zu zwingen.



  • Naja mein Ziel ist einfach nur eine Textdatei in der Matrizen nebeneinander stehen. Dafür brauche ich und will ich keine graphische Oberfläche oder dergleichen.



  • Alternativ macht man die Ausgabe Zeile für Zeile und muss dann abwechseln von den Matrizen Daten ausgeben und dazwischen entsprechend viele Leerzeichen einfügen.

    Das ist leider keine Option für mich, weil ich mit absoluter Gewissheit weiss, dass ich dann völlig den Überblick verliere was ich mache.

    Ich würde dir dann am Ende wirklich empfehlen das hier zu tun. Es ist für einen Beginner einfachste Variante. (Vllt nicht die eleganteste, aber die einfachste).
    Benutze Funktionen und gute Variablennamen um den Überblick zu behalten und du scheinst ja mit Matrizen zu rechnen, dann ist dashier doch auch kein Problem.

    Gib einfach so viele Leerzeichen aus, wie es noch fehlen für die Breite des linke bereichs.

    |-------------- X Zeichen ---------------|
    Nur Y Zeichen_____________________________    
    Hier sinds nur Z Zeichen__________________
    

    usw.

    EDIT: Natürlich unter der Voraussetzung das man Monospace Fonts verwendet!

    Oh und dass das hier geht erwähne ich lieber nochmal:

    void print(std::ostream& stream, std::string const& what) {
        stream << what;
    }
    
    // somewhere else:
    std::ofstream writer("file.txt");
    
    print(std::cout, "Hello");
    print(writer, "World");
    


  • Ich habe jetzt hinbekommen was ich wollte. Habe es wie folgt gemacht:

    cout << "Binäre Adjazenzmatrix"  << "           Bipolare Adjazenzmatrix" << endl ;
    cout << "ohne Selbstkopplung"  << "             ohne Selbstkopplung" << endl ;
    for( ik=0; ik<ADSIZE;++ik) {
       for(il=0; il<ADSIZE;++il) cout << setw(2) << adjazenz_bin[ik][il] << setw(2);
       cout << "               ";
       for(il=0; il<ADSIZE; ++il) cout << setw(2) << adjazenz_bip[ik][il] << setw(2);
       cout << endl;
    }
    

    Das ist für C++ Könner vielleicht schlecht aber jetzt läuft es erstmal.

    Weil ich dazu lernen will, möchte ich aber auch das was Leprechaun zu mir schrieb versuchen. Dazu muss ich aber noch etwas warten um mehr Grundlagen zu erlernen.

    Danke für die Hilfe.



  • cpp_Jungspund schrieb:

    Ich habe jetzt hinbekommen was ich wollte. Habe es wie folgt gemacht:

    cout << "Binäre Adjazenzmatrix"  << "           Bipolare Adjazenzmatrix" << endl ;
    cout << "ohne Selbstkopplung"  << "             ohne Selbstkopplung" << endl ;
    for( ik=0; ik<ADSIZE;++ik) {
       for(il=0; il<ADSIZE;++il) cout << setw(2) << adjazenz_bin[ik][il] << setw(2);
       cout << "               ";
       for(il=0; il<ADSIZE; ++il) cout << setw(2) << adjazenz_bip[ik][il] << setw(2);
       cout << endl;
    }
    

    Das ist für C++ Könner vielleicht schlecht aber jetzt läuft es erstmal.

    Also ich finde Deine Lösung gut.


Anmelden zum Antworten