14 Stimmen

Zuweisung von cout an einen Variablennamen

Wie kann ich in ANSI C++ den cout-Stream einem Variablennamen zuweisen? Wenn der Benutzer einen Namen für die Ausgabedatei angegeben hat, soll die Ausgabe dorthin gesendet werden, andernfalls soll sie auf den Bildschirm ausgegeben werden. Also so etwas wie:

ofstream outFile;
if (outFileRequested) 
    outFile.open("foo.txt", ios::out);
else
    outFile = cout;  // Will not compile because outFile does not have an 
                     // assignment operator

outFile << "whatever" << endl;

Ich habe versucht, dies auch als Makrofunktion zu tun:

#define OUTPUT outFileRequested?outFile:cout

OUTPUT << "whatever" << endl;

Aber auch das führte zu einem Compilerfehler.

Ich vermutete, dass ich entweder einen IF-THEN-Block für jeden Ausgang verwenden könnte, aber ich würde das gerne vermeiden, wenn ich könnte. Irgendwelche Ideen?

0voto

Ich bin mir nicht sicher, ob man cout einer Variablen vom Typ ofstream zuweisen kann. cout ist ein Objekt vom Typ ostream (während cin vom Typ istream ist) und ich bin mir nicht sicher, ob das eine vom anderen erbt. Vielleicht wäre es also besser, zu prüfen, ob eine Datei angegeben wurde/existiert und den entsprechenden Stream-Typ zu erzeugen.

0voto

sizu Punkte 126

Die Beschaffung dauerte etwa zwei Stunden. Im Grunde habe ich eine externe Klasse, die eine Testsuite ausführt. Ich sende in einem Delegaten, um die Tests auszuführen, so dass, um Zugriff auf die Ausgabe zu haben, muss ich in einem Ausgabestrom zu senden. Ich denke, ich könnte einen anderen Stream pro Test getan haben. Wie auch immer, ich wollte in den ofstream übergeben, um später verwendet werden.

// Main code to create Test Suite Object
ofstream debugFile("debug.txt");
TestSuiteObject* myTestSuite = new TestSuiteObject(&debugFile);

// Test Suite Object
class TestSuiteObject: public Test::Suite
{
public:
 TestSuiteObject(std::ofstream* debug) : m_debug(*debug)
 {
  m_debug << "some witty remark" << std::endl;
  TEST_ADD(TestSuiteObject::test1);
  TEST_ADD(TestSuiteObject::test2);
  TEST_ADD(TestSuiteObject::test3);

 }

 void test1();
 void test2();
 void test3();

private:
 std::ofstream& m_debug;
};

0 Stimmen

Sind Sie sicher, dass Sie dies an der richtigen Stelle platziert haben? Es scheint nicht auf die Frage zu reagieren...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X