Unterscheidung zwischen Datei- und Konsolenstreams

8

So bestimmen Sie, ob es sich bei ostream um eine Datei oder einen Konsolenstream handelt. Im folgenden Programm möchte ich "Hallo Datei!" Drucken beim Schreiben in eine Datei und "Hallo Konsole!" beim Schreiben in die Konsole. Welche Bedingung sollte ich in Zeile 17 angeben?

%Vor%     
cpp 06.08.2013, 13:18
quelle

5 Antworten

4

Vielleicht nicht hübsch, aber

%Vor%

Wir könnten &os == &std::cout verwenden, aber die Standard-Ausgabe wird möglicherweise in die Datei umgeleitet, daher denke ich, dass es besser ist, stattdessen das streambuf-Objekt zu verwenden. (Siehe diese Antwort zum besseren Verständnis der Umleitung funktioniert, und warum streambuf zu vergleichen, löst das Problem sicher!)

    
kokan 06.08.2013, 13:28
quelle
3

Sie könnten (ab) tellp() verwenden, was -1 zurückgibt, wenn der Stream keine Position hat:

%Vor%

Natürlich könnte es andere Streams geben, die -1 für diese Funktion zurückgeben, also verwenden Sie sie mit Vorsicht.

    
Tobias Brandt 06.08.2013 13:34
quelle
2

Eins ist ofstream und das andere ist ostream . Habe einfach zwei Methoden.

%Vor%     
andre 06.08.2013 13:43
quelle
2

Es gibt keine tragbaren Mittel. Unter Unix können Sie Folgendes tun:

%Vor%

Unter Windows wird isatty _isatty und ich bin mir nicht sicher dass die Makros existieren (aber ich vermute, dass sie das tun).

Das setzt natürlich voraus, dass Sie nichts tun, um es zu verwirren in deinem Code. Etwas wie:

%Vor%

zum Beispiel oder:

%Vor%

Oder sogar:

%Vor%

Aber es ist so nah wie möglich ohne die tatsächliche fd aus dem filebuf .

    
James Kanze 06.08.2013 13:50
quelle
0

Dies funktioniert in Visual Studio 2012

%Vor%

Aber ein ostream könnte etwas sein, das kein ofstream oder die Konsole ist, also müsstest du vorsichtig sein.

    
Peter Hull 06.08.2013 13:44
quelle

Tags und Links