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%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!)
Sie könnten (ab) tellp()
verwenden, was -1
zurückgibt, wenn der Stream keine Position hat:
Natürlich könnte es andere Streams geben, die -1
für diese Funktion zurückgeben, also verwenden Sie sie mit Vorsicht.
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
.
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.