Вопрос

Мне нужно написать программу, которая считывает данные либо из 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]));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top