Sie können ohne Bezugnahme auf cin des streambuf mit einem anderen, und in einigen Programmen ist dies einfacher als die allgemeine Strategie von rund vorbei iStreams ersetzen cin direkt.
int main(int argc, char* argv[]) {
ifstream input;
streambuf* orig_cin = 0;
if (argc >= 2) {
input.open(argv[1]);
if (!input) return 1;
orig_cin = cin.rdbuf(input.rdbuf());
cin.tie(0); // tied to cout by default
}
try {
// normal program using cin
}
catch (...) {
if (orig_cin) cin.rdbuf(orig_cin);
throw;
}
return 0;
}
Auch wenn es extrem selten ist cin zu verwenden, nachdem die Steuerung verlässt Haupt, die oben try-catch vermeidet undefiniertes Verhalten, wenn das ist etwas, das Ihr Programm tun könnte.
Warum ist es notwendig, cin an cout zu binden, nachdem es an die Datei gebunden wurde, aber nicht im catch-Block? – m42a
@ m42a ist es _outied_ von cout. Aber ich stimme zu, dass wir es vielleicht zurückbinden wollen. –
@ m42a: Das Binden wirkt sich auf das Flushing aus (bevor cin von stdin liest, leert es cout), was nicht notwendig ist, wenn cin hier "umgeleitet" wird. In den meisten Fällen wäre es ein logischer Fehler von cin zu lesen, nachdem control leaves main verlassen hat, aber zumindest wenn Sie den streambuf wiederherstellen, vermeiden Sie undefiniertes Verhalten (das Filebuf aus dem ifstream wird zerstört). Sie können 'cin.tie (& cout)' verwenden, wenn Sie möchten. –