Speichern einer Bildschirmausgabe



  • Hallo liebe Community,

    Ich habe mich in letzter Zeit mit einem kleinen Wortgenerator ( Namensgenerator ) herumgeschlagen, den ich, meiner Meinung nach, zweckgemäss auch hinbekommen habe.

    Nun möchte ich gerne die Worte die dabei entstehen in einer .txt Datei speichern, so dass man sie auch später noch einmal einsehen kann.

    Hier ist der Programmteil:

    void namensgenerator()
    {
    
        char ant;                                                                   // Fortsetzungsparameter (j/n)
    
    do                                                                              // Begin der Schleife zum generieren von Zufallsworten
    {
        int maxnames, counter=0;                                                    /* Die Variablen maxnames ( Anzahl der zu erstellenden Worte )
                                                                                       und die Zählvariable counter werden auf 0 gesetzt.*/
    
        cout << "\nWieviele Namen sollen erstellt werden?? ";
        cin >> maxnames;                                                            // Anzahl der zu generierenden Namen wird eingegeben
    
        srand(GetTickCount());
    
        strcpy(name.erster[0],"Az");                                                // Diese Felder beeinhalten die Silben die in dem Wort
        strcpy(name.erster[1],"Ze");                                                // vorkommen sollen.
        strcpy(name.erster[2],"Ad");
        strcpy(name.erster[3],"Do");
        strcpy(name.erster[4],"Ra");                                                // Es gibt 4 Blöcke mit unterschiedlichen Silben die aufeinander abgestimmt sind.
        strcpy(name.erster[5],"Ba");                                                // Wichtig ist hierbei zu beachten, dass die ersten Silben mit einem Vokal oder
        strcpy(name.erster[6],"Xo");                                                // einem Übergangskonsonanten enden um mit den anderen Silben zusammen zu passen.
        strcpy(name.erster[7],"Da");
        strcpy(name.erster[8],"Scha");
        strcpy(name.erster[9],"My");
        strcpy(name.erster[10],"Ti");
    
        strcpy(name.zweiter[0],"rin");
        strcpy(name.zweiter[1],"la");
        strcpy(name.zweiter[2],"mo");
        strcpy(name.zweiter[3],"arx");
        strcpy(name.zweiter[4],"ar");
        strcpy(name.zweiter[5],"do");
        strcpy(name.zweiter[6],"ma");
        strcpy(name.zweiter[7],"mi");
    
        strcpy(name.dritter[0],"don");
        strcpy(name.dritter[1],"dran");
        strcpy(name.dritter[2],"ban");
        strcpy(name.dritter[3],"na");
        strcpy(name.dritter[4],"es");
        strcpy(name.dritter[5],"leth");
        strcpy(name.dritter[6],"ran");
        strcpy(name.dritter[7],"al");
    
        strcpy(name.vierter[0],"or");
        strcpy(name.vierter[1],"ar");
        strcpy(name.vierter[2],"ir");
        strcpy(name.vierter[3],"lor");
        strcpy(name.vierter[4],"kir");
        strcpy(name.vierter[5],"des");
        strcpy(name.vierter[6],"del");
        strcpy(name.vierter[7],"mos");
    
        cout << "\n";
    
        while(counter<maxnames)                                                     /* Unterschleife die die Variable counter anhebt um sich der vorher eingegebenen
                                                                                       Variable maxnames zu naehern. Die Schleife läuft solange wie die variable counter
                                                                                       kleiner ist als die Variable maxnames. Ist sie gleich gross endet die Schleife
                                                                                       und die gewählte Anzahl der Namen wird ausgegeben.*/
        {
    
         cout <<"\t\t°" << name.erster[rand()%11]                                   /* Ausgabe des ersten Zufallswortes. Aus den Silben des ersten Feldes wird per Zufallswurf
                                                                                       eine Silbe gewählt.*/
                        << name.zweiter[rand()%8]                                   // Zufallswurf für die zweite Silbe
                        << name.dritter[rand()%8];                                  // Zufallswurf für die dritte Silbe
    
    /* Um nicht immer alle 4 Silbenfelder zusammen auszugeben wird mit einer if-Anweisung eine Bedingung
       deklariert die die Anhängung einer 4ten Silbe erlaubt wenn bei einem Zufallswurf von 0-4 die Zahl 0
       "erwürfelt" wird. Somit werden permenante übergrosse Worte vermieden.*/
    
        if(rand()%4==0)                                                             // wenn Zufallszahl = 0 dann kommt eine 4te Silbe zum bestehenden Wort
        {
         cout << name.vierter[rand()%8];                                            // Zufallswurf für die vierte Silbe
        }
    
         cout<< "\n";
    
         counter++;                                                                 // Erhöhung des Counters. Abbruchbedingung der Schleife
    }
    
    cout << "\nGenerierung der  Namen ist abgeschlossen\n\n";
    
    cout << "\nNochmal? ( j / n )";
    
    cin >> ant;
    
    }
    while(ant=='j' || ant =='J');                                                   // Ende der Schleife des Programmteils für Wort/Namensgenerierung
    
    cin.get();
    
    main();
    
    }
    

    Leider kenn ich mich mit speichern gar nicht aus und die Tutorials die ich bisher durchstöbert habe helfen mir kein Stück weiter, bzw. versteh ich sie einfach gar nicht.

    Wenn das Programm ausgeführt wird, wird die Anzahl der eingegebenen maxnames auf dem Bildschirm ausgegeben. Eben jene möchte ich gern in einer .txt Datei sehen.

    Hat einer eine Hilfestellung für mich, bzw. hat einer Zeit den Programmteil zu testen und eine Idee wie ich meinen Wunsch verwirklichen kann?

    Das einzige was ich weiss ist, dass ich #include <fstream.h> noch einfügen muss 😞

    Ich bedanke mich schonmal für Anregungen.

    Liebe Grüße
    Matar



  • Als erstes sieht das strcpy()-Fragment grauenhaft aus. Da solltest du auf jeden Fall C++ Methoden (std:: string anstelle von char[] nutzen.

    Matar schrieb:

    Das einzige was ich weiss ist, dass ich #include <fstream.h> noch einfügen muss 😞

    Da hast du schon einen Anfang 😉 Jetzt mußt du dir "nur noch" einen 'ofstream file(dateiname);' erzeugen und kannst in den genauso schreiben wie du nach cout schreibst.



  • öhm, das wundert mich jetzt aber, dass er fstream.h und nicht fstream inkludieren soll. Wieso ist das so, CStoll?



  • Weil ich nicht genau genug hingesehen habe - natürlich ist '#include <fstream>' (ohne .h) korrekt.



  • bei dev c++ zickt der compiler bei einigen libaries rum wenn ich das .h nich mitsetze .. aber nur bei manchen.

    ich versuchs mal mit dem ofstream, mal gucken ob ich was in einer datei dann finde 🙂

    wie sieht denn der c++ befehl aus um in eine Datei zu schreiben?



  • Das parktische an Streams: sie funktionieren alle gleich. Mit andern Worten ein ofstream funktionniert (in den Basisfunktionen) wie cout.

    Ergo:

    ofstream out("meineDatei.txt");
    out<<"irgendwas";
    

    und schon ists gut.



  • Matar schrieb:

    bei dev c++ zickt der compiler bei einigen libaries rum wenn ich das .h nich mitsetze .. aber nur bei manchen.

    In Kurzfassung: Header aus dem ANSI-C++-Standard haben kein '.h', Systemheader deines Compilers/Betriebssystems haben idR ein '.h'.

    wie sieht denn der c++ befehl aus um in eine Datei zu schreiben?

    Wie ich schon sagte - in die Datei kannst du genauso schreiben wie auf die Standard-Ausgabe cout.

    (PS: Das ist evt. ein guter Zeitpunkt, um auf unser Magazin hinzuweisen - mein Artikel "Ein/Ausgabe in C++" könnte dir einiges erklären)



  • Ich habs, vielen Dank schonmal.

    void namensgenerator()
    {
    
        speichern.open("namensliste.txt");
        char ersterbuffer[5000];
        char zweiterbuffer[5000];
        char ant;                                                                   // Fortsetzungsparameter (j/n)
    
    do                                                                              // Begin der Schleife zum generieren von Zufallsworten
    {
        int maxnames, counter=0;                                                    /* Die Variablen maxnames ( Anzahl der zu erstellenden Worte )
                                                                                       und die Zählvariable counter werden auf 0 gesetzt.*/
    
        cout << "\nWieviele Namen sollen erstellt werden?? ";
        cin >> maxnames;                                                            // Anzahl der zu generierenden Namen wird eingegeben
    
        srand(GetTickCount());
    
        strcpy(name.erster[0],"Az");                                                // Diese Felder beeinhalten die Silben die in dem Wort
        strcpy(name.erster[1],"Ze");                                                // vorkommen sollen.
        strcpy(name.erster[2],"Ad");
        strcpy(name.erster[3],"Do");
        strcpy(name.erster[4],"Ra");                                                // Es gibt 4 Blöcke mit unterschiedlichen Silben die aufeinander abgestimmt sind.
        strcpy(name.erster[5],"Ba");                                                // Wichtig ist hierbei zu beachten, dass die ersten Silben mit einem Vokal oder
        strcpy(name.erster[6],"Xo");                                                // einem Übergangskonsonanten enden um mit den anderen Silben zusammen zu passen.
        strcpy(name.erster[7],"Da");
        strcpy(name.erster[8],"Scha");
        strcpy(name.erster[9],"My");
        strcpy(name.erster[10],"Ti");
    
        strcpy(name.zweiter[0],"rin");
        strcpy(name.zweiter[1],"la");
        strcpy(name.zweiter[2],"mo");
        strcpy(name.zweiter[3],"arx");
        strcpy(name.zweiter[4],"ar");
        strcpy(name.zweiter[5],"do");
        strcpy(name.zweiter[6],"ma");
        strcpy(name.zweiter[7],"mi");
    
        strcpy(name.dritter[0],"don");
        strcpy(name.dritter[1],"dran");
        strcpy(name.dritter[2],"ban");
        strcpy(name.dritter[3],"na");
        strcpy(name.dritter[4],"es");
        strcpy(name.dritter[5],"leth");
        strcpy(name.dritter[6],"ran");
        strcpy(name.dritter[7],"al");
    
        strcpy(name.vierter[0],"or");
        strcpy(name.vierter[1],"ar");
        strcpy(name.vierter[2],"ir");
        strcpy(name.vierter[3],"lor");
        strcpy(name.vierter[4],"kir");
        strcpy(name.vierter[5],"des");
        strcpy(name.vierter[6],"del");
        strcpy(name.vierter[7],"mos");
    
        cout << "\n";
        speichern << "Folgende " << maxnames << " Namen wurden gespeichert:\n\n";
    
        while(counter<maxnames)                                                     /* Unterschleife die die Variable counter anhebt um sich der vorher eingegebenen
                                                                                       Variable maxnames zu naehern. Die Schleife läuft solange wie die variable counter
                                                                                       kleiner ist als die Variable maxnames. Ist sie gleich gross endet die Schleife
                                                                                       und die gewählte Anzahl der Namen wird ausgegeben.*/
        {
    
         sprintf(ersterbuffer,"%s%s%s",name.erster[rand()%11],name.zweiter[rand()%8],name.dritter[rand()%8]);
    
         cout <<"\t\t°" <<  ersterbuffer;
    
         speichern      << ersterbuffer;
    
    /* Um nicht immer alle 4 Silbenfelder zusammen auszugeben wird mit einer if-Anweisung eine Bedingung
       deklariert die die Anhängung einer 4ten Silbe erlaubt wenn bei einem Zufallswurf von 0-4 die Zahl 0
       "erwürfelt" wird. Somit werden permenante übergrosse Worte vermieden.*/
    
        if(rand()%4==0)                                                             // wenn Zufallszahl = 0 dann kommt eine 4te Silbe zum bestehenden Wort
        {
         sprintf(zweiterbuffer,"%s",name.vierter[rand()%8]);                        // Zufallswurf für die vierte Silbe
         cout      << zweiterbuffer      ;
         speichern << zweiterbuffer;
        }
    
         cout<< "\n";
         speichern << endl;
         counter++;                                                                 // Erhöhung des Counters. Abbruchbedingung der Schleife
    
    }
    
    cout << "\nGenerierung der  Namen ist abgeschlossen\n\n";
    
    cout << "\nNochmal? ( j / n )";
    
    cin >> ant;
    
    }
    while(ant=='j' || ant =='J');                                                   // Ende der Schleife des Programmteils für Wort/Namensgenerierung
    
    cin.get();
    
    main();
    
    }
    

    Lieben Gruß

    Matar



  • Wie gesagt, nimm lieber strings als char-Arrays. Dann vereinfacht sich das zu 'ersterbuffer=name.erster[rand()%11]+name.zweiter[rand()%8]+name.dritter[rand()%8];'.

    (ansonsten: sprintf() nutzt die selben Formatstrings wie printf() - und %s steht für String (im C-Sinn, also nullterminiertes char-Array).)


Anmelden zum Antworten