Drucker in Funktion bekannt machen



  • Hallo,
    wie kann ich meinen Drucker in einer Funktion bekannt machen?
    Ich habe folgendes versucht:

    // in funktion 1:
    ofstream drucker("LPT1");
    ...
    druck(drucker,"test");
    ...
    drucker.close();
    
    //in funktion 2:
    void druck(ofstream d, string s) {
    ...
    d.put(s[i]);
    ...
    }
    

    Die Fehlermeldung ist, dass sowohl ios_base als auch basic_streambuf private seien.
    Herzlichen Dank im Voraus.



  • Sieht mir nach einem Allgemeinen C++-Problem aus, etwas mehr Code könnte nciht schaden, verstehe nicht ganz was du willst 😞

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich durchsuche eine Datenbank und möchte die gefundenen Daten dann ausdrucken. Da die Einträge teilweise sehr lange sind, wollte ich mit Hilfe der Funktion einen Zeilenumbruch einbauen.
    Hier ist dann der übrige Code:

    //daten::drucken() wird von main aus aufgerufen
    const void daten::drucken() {
    
          ofstream drucker("LPT1");
    
          drucke(drucker,"Gefunden:\n\n");
          if (gefunden.size()!=0) 
             for (int i=0; i<gefunden.size();i++) { //drucken bis Datensatz zu ende
    //gefunden ist ein vector vom Typ struct mit den strings autor, titel und heft
                 drucke(drucker,"Autor: ");
                 drucke(drucker,gefunden[i].autor);
                 drucke(drucker,"\n");
                 drucke(drucker,"Titel: ");
                 drucke(drucker,gefunden[i].titel);
                 drucke(drucker,"\n");
                 drucke(drucker,"Heft: ");
                 drucke(drucker,gefunden[i].heft);
                 drucke(drucker,"\n\n");
             }
          else drucke(drucker,"nichts!");
    
          drucker.close();
    }
    

    und hier die ausgelagerte Funktion:

    void drucke(ofstream drucker, string s) {
         int zeilenzaehler=0;
         for (int i=0; i<s.size(); i++) {
             drucker.put(s[i]);    //Buchstaben drucken
             if (((i-(zeilenzaehler*50))>50)&&(s[i]==' ')) {
                drucker.put('\n');       //Zeilenumbruch, wenn mehr als 50 Zeichen und Wortende
                zeilenzaehler++;
             }
         }
    }
    

    Zuerst hatte ich ofstream drucker("LPT1") und drucker.close mit in die Funktion drucke(string s) übernommen. Dann hat er zwar gedruckt, aber natürlich jeden Eintrag auf eine eigene Seite...



  • Die Lösung: den Drucker einfach als Pointer übergeben. Ganz einfach also. Na ja, ich programmiere erst seit ein paar Tagen, da fallen mir manchmal die einfachsten Sachen nicht ein.

    // in funktion 1:
    ofstream drucker("LPT1");
    ...
    druck(&drucker,"test");
    ...
    drucker.close();
    
    //in funktion 2:
    void druck(ofstream *d, string s) {
    ...
    d->put(s[i]);
    ...
    }
    


  • Benutze lieber eine Referenz...

    // in funktion 1:
    ofstream drucker("LPT1");
    ...
    druck(drucker,"test");
    ...
    drucker.close();
    
    //in funktion 2:
    void druck(ofstream& d, string s) {
    ...
    d << s[i];
    ...
    }
    


  • Danke Walli, das klappt auch gut. Gibt es denn noch einen anderen Vorteil für eine Referenz, außer, dass man nicht so schnell Speicherchaos anrichten kann?



  • Ist einfach schöner und sicherer. Wenn man es auch mit einer Referenz machen kann, dann ist dies auf jeden Fall immer dem Pointer vorzuziehen. Bei Pointern muss man immer aufpassen, dass auch tatsächlich ein Objekt dahinter steht. Bei Referenzen wird das gewährleistet.



  • Also mehr so eine generelle Sache. Gut, dann lasse ich es in der Referenzform. Danke!


Anmelden zum Antworten