erklärt generic istream in c ++
Frage
Ich brauche ein Programm zu schreiben, die entweder aus ifstream oder cin liest, in Abhängigkeit von Parametern in das Programm zur Laufzeit übergeben.
Ich habe geplant, auf Sie folgendermaßen vorgehen:
istream in;
if(argv[1] == "cin")
{
in = cin;
}
else
{
ifStream inFile;
inFile.open(argv[1].c_str());
in = inFile;
}
Allerdings istream in geschützt, und ich kann nicht istream in deklarieren. Gibt es eine Möglichkeit eine solche in Strom generic zu erklären?
Lösung
Versuchen Sie stattdessen mit einem istream*
. Beachten Sie jedoch, dass Sie Ihren Code leicht zu ändern. Mit Zeiger Sie den Speicherbereich des Objekts erhalten müssen, die Sie zeigen. Mit anderen Worten kann die „inFile“ Variable nicht dort erklärt werden, da sie nicht aus der sonst existieren. Der Code könnte sein, dann:
istream* in;
ifStream inFile;
if(!strcmp(argv[1],"cin"))
{
in = &cin;
}
else
{
inFile.open(argv[1]);
in = &inFile;
}
// use *in
(Beachten Sie auch die Änderungen in der Zeichenfolge Handhabung. Ich änderte sie als Beispiel.)
Andere Tipps
Eine alternative Konstruktion ist der Code mit cin
zu schreiben, und dann verwenden Eingabeumleitung , wenn das Programm ausgeführt wird, wenn Sie Eingabe aus einer Datei annehmen möchten. Dies gilt nicht Ihre genaue Frage beantworten, aber es ist ein einfacher Entwurf für den Fall, dass Sie präsentiert.
Zum Beispiel, anstelle von
program.exe cin
Sie würden nur ausführen
program.exe
und anstelle von
program.exe myfile.txt
Sie liefe
program.exe < myfile.txt
Dies funktioniert auf * nix und Windows.
Sie können dies auch tun, ohne die Zeiger:
ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));