C ++: Zuwenden Sie CIN einer Ifstream -Variablen zu?
Frage
Sie kennen die gemeinsame Stdio -Idiom, die stdin
wird durch einen Dateinamen von "-" angegeben, z. B.
if ((strcmp(fname, "-"))
fp = fopen(fname);
else
fp = stdin;
Was ist der beste Weg, dies mit einem zu tun? ifstream
Beispiel? Ich habe ein bisschen Code erhalten, das einen hat ifstream
Als Teil einer Klasse und ich möchte Code hinzufügen, um das Äquivalent zu tun, so etwas wie:
if ( filename == "-")
logstream = cin; // **how do I do this*?*
else
logstream.open( filename.c_str() );
Lösung
cin
ist nicht ein ifstream
, aber wenn Sie verwenden können istream
Stattdessen sind Sie dann dabei, zu gewinnen. Andernfalls, wenn Sie bereit sind, nicht portable zu sein, haben Sie einfach geöffnet /dev/stdin
oder /dev/fd/0
oder Wasauchimmer. :-)
Wenn du tun Sie möchten tragbar sein und können Ihr Programm nutzen lassen istream
, Hier ist eine Möglichkeit, es zu tun:
struct noop {
void operator()(...) const {}
};
// ...
shared_ptr<istream> input;
if (filename == "-")
input.reset(&cin, noop());
else
input.reset(new ifstream(filename.c_str()));
Das noop
ist ein Deleter anzugeben, der nichts in der tut cin
Fall, weil, na ja, cin
soll nicht gelöscht werden.
Andere Tipps
- Speichern Sie die Initiale Streambuf von Cin in eine Variable
- Ändere das Streambuf von Cin zum eine aus der Datei.
- Tun Sie, was Sie tun müssen
- Und vergessen Sie nicht, Cin Streambuf vor dem Schließen Ihrer Datei wiederherzustellen - Raii kann helfen.