Datei-Zugriff: Umleiten der Standard-Kanäle

Es besteht in C++ die Möglichkeit, die Standard-Kanäle cin, cout, cerr oder clog programmgesteuert "umzuleiten".
So können z.B. alle Ausgaben statt auf cout in eine Datei sammel.dat umgeleitet werden. Der Grund für diese Möglichkeit der Zuweisung, die in den bisher genannten Stream-Klassen nicht vorhanden war, liegt daran, daß die vier oben genannten Standard-Kanäle in Wirklichkeit gar keine Objekte der Klassen ostream und istream sind, sondern Objekte der abgeleiteten Klassen istream_withassign und ostream_withassign. Zu weiteren Informationen zu diesem Thema vgl.

  ofstream datei("sammel.dat", ios::app);
  ...
  cout = datei;                          // cout wird in die geöffnete Datei umgeleitet
  cout << "dieser text soll noch dazu";  // String wird in Datei geschrieben

Man sollte jedoch beachten, daß das Objekt datei als lokales Objekt am Blockende automatisch geschlossen wird.
Hat man jeodch -- wie im Beispiel -- cout umgeleitet, so wird mit dem Objekt datei auch cout geschlossen! Folglich kann anschließend auf cout nicht mehr geschrieben werden. Da dies i.allg. nicht erwünscht sein dürfte, sollte man -- bevor man die Umleitung vornimmt -- das alte Objekt in einer globalen Variablen zwischenzuspeichern.

  ostream_withassign saveCout;
  ...
  saveCout =cout;
  ...                  // Umleiten und Ausgabe in eine Datei
  cout = saveCout;     // cout restaurieren

Nachdem alle Ausgaben in die umgeleitete Datei vorgenommen wurden, kann dann der Standardausgabekanal zurückgesetzt werden.