объявление универсального istream в С++
Вопрос
Мне нужно написать программу, которая считывает данные либо из ifstream, либо из cin, в зависимости от параметров, передаваемых в программу во время выполнения.
Я планировал сделать следующее:
istream in;
if(argv[1] == "cin")
{
in = cin;
}
else
{
ifStream inFile;
inFile.open(argv[1].c_str());
in = inFile;
}
Однако istream защищен, и я не могу объявить istream in.Есть ли способ объявить такое обобщение в потоке?
Решение
Попробуйте с istream*
вместо.Однако учтите, что вам придется немного изменить свой код.Используя указатели, вам необходимо сохранить область памяти объекта, на который вы указываете.Другими словами, переменную «inFile» здесь нельзя объявить, поскольку она не будет существовать вне else.Тогда код может быть таким:
istream* in;
ifStream inFile;
if(!strcmp(argv[1],"cin"))
{
in = &cin;
}
else
{
inFile.open(argv[1]);
in = &inFile;
}
// use *in
(Обратите также внимание на изменения в обработке строк.Я изменил их в качестве примера.)
Другие советы
Альтернативный вариант — написать код, используя cin
, а затем используйте перенаправление ввода при запуске программы, если вы хотите принять ввод из файла.Это не отвечает на ваш точный вопрос, но это более простая конструкция для представленного вами случая.
Например, вместо
program.exe cin
ты бы просто побежал
program.exe
и вместо
program.exe myfile.txt
ты бы побежал
program.exe < myfile.txt
Это работает на *nix и Windows.
Вы также можете сделать это без указателей:
ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));