bleicher: c++, streams erzeugen

Grüße,
ich habe versucht die doumentation bei MS und cplusplus.com zu nutzen werde aber draus nicht schlau,
habe eine einfache funktion die bestimmte daten per cout<< ausgibt, nun wollte ich einen eigenen stream an die funktion geben um bei bedarf von cout in eine datei umleiten zu können. nur weiss ich nicht wie ich den ostream object richtig erzeuge,

meine idee war (in "Pseudocode):

if(//in die console){
  ostream temp=cout;
}else{
//hier filezeiger erzeugen
  ostream temp(&file);
}

dump(ostream temp){
//was auch immer hier an daten gemacht wird, data ist ein string
  temp<<sDaten;
}

nun kreig ich cannot acces provate member fehler, und simples ostream temp; nörgelt über das fehlen des standartconstructors.
ist meine absicht zu kompliziert/aufwendig?

MFG
bleicher

--
__________________________-

FirefoxMyth
  1. Tach auch.

    habe eine einfache funktion die bestimmte daten per cout<< ausgibt, nun wollte ich einen eigenen stream an die funktion geben um bei bedarf von cout in eine datei umleiten zu können. nur weiss ich nicht wie ich den ostream object richtig erzeuge,

    Ich benutze dieses Codefetzelchen:

    std::ostream& out = (filename != "-")
    ? *(new std::ofstream(filename.c_str()))
    : std::cout;

    Wenn filename ein Minuszeichen ist (na, wer korrigiert mich gleich und schreibt, es sei ein Bindestrich?), dann ist out gleichbedeutend mit cout, ansonsten ist es ein fstream auf filename.

    Bis die Tage,
    Matti

    1. Grüße,

      std::ostream& out = (filename != "-")
      ? *(new std::ofstream(filename.c_str()))
      : std::cout;

      allein die Zeile ostream& out =  &cout; produiziert eine fehlermldung
      "cannot convert from std::ostream to std::ostream &"

      MFG
      bleicher

      --
      __________________________-

      FirefoxMyth
    2. Grüße,
      und ohne & gibt es für ostream& out= cout;

      "Error 9 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' c:\program files\microsoft visual studio 9.0\vc\include\ostream 584
      "
      MFG
      bleicher

      --
      __________________________-

      FirefoxMyth
      1. Tach auch.

        und ohne & gibt es für ostream& out= cout;

        "Error 9 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' c:\program files\microsoft visual studio 9.0\vc\include\ostream 584
        "

        Ich werde heute abend nochmal schauen, kann sein, dass ich auf dem Laptop, von dem ich vorhin gepostet habe, irgendwelchen Murks drin hatte.

        Hilfe zur Suche, bis ich selbst meinen Code gefunden habe:
        http://stackoverflow.com/questions/366955/obtain-a-stdostream-either-from-stdcout-or-stdofstreamfile und folgende Links.

        Bis die Tage,
        Matti

  2. Hallo,

    dein Pseudocode funktioniert nicht, weil die C++-Streams nicht kopierbar sind. Du musst also entweder eine Referenz oder einen Zeiger auf einen Stream übergeben.

    std::ostream* ptr = &cout;
    oder
    std::ostream& ref = cout;

    Wichtig ist, dass du die Referenz nicht mit der Adresse initialisierst sondern direkt mit dem Objekt. Wann solltest du welche Variante wählen? Zu bevorzugen ist in der Regel die Referenz, es sei denn du willst explizit 0 als möglichen Wert erlauben, dann brauchst du den Zeiger.

    void dump(std::ostream&, int value) {
        ostream << value;
    }

    dump(std::cout, 5);
    oder
    ofstream out("test.txt");
    dump(out, 5);

    Gruss,
    OhneName