Puede reemplazar streambuf de cin con otra, y, en algunos programas esto es más simple que la estrategia general de pasar alrededor de iStreams sin hacer referencia a cin directamente.
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;
}
pesar de que es extremadamente raro de usar cin después del control deja principal, lo anterior try-catch evita un comportamiento indefinido si eso es algo que su programa podría hacer.
¿Por qué es necesario vincular cin a cout después de vincularlo al archivo pero no en el bloque catch? – m42a
@ m42a es _untied_ de cout. Pero estoy de acuerdo en que podemos querer volver a atarlo. –
@ m42a: la vinculación afecta al enjuague (antes de que cin lea de stdin, se vacía) que no es necesario cuando cin se "redirige" aquí. En la mayoría de los casos, sería un error lógico leer de cin después de que el control abandone main, pero al menos si restableces el streambuf evitarás un comportamiento indefinido (se destruirá el archivo bifurcado del ifstream). Puede usar 'cin.tie (& cout)' si lo desea. –