объявление общего istream в c ++ - PullRequest
3 голосов
/ 08 февраля 2010

Мне нужно написать программу, которая читает из ifstream или cin, в зависимости от параметров, переданных в программу во время выполнения.

Я планировал сделать следующее:

 istream in;

 if(argv[1] == "cin")
 {
      in = cin;
 }
 else
 {
      ifStream inFile;
      inFile.open(argv[1].c_str());
      in = inFile;
 }

Однако istream в защищенном, и я не могу объявить istream в. Есть ли способ объявить такой универсальный в потоке?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2010

Попробуйте вместо istream*. Обратите внимание, однако, что вы должны немного изменить свой код. Используя указатели, вы должны сохранить область памяти объекта, на который вы указываете. Другими словами, переменная "inFile" не может быть там объявлена, так как она не будет существовать в другом месте. Код может быть:

 istream* in;
 ifStream inFile;

 if(!strcmp(argv[1],"cin"))
 {
      in = &cin;
 }
 else
 {
      inFile.open(argv[1]);
      in = &inFile;
 }
 // use *in

(Обратите внимание также на изменения в обработке строк. Я изменил их в качестве примера.)

1 голос
/ 08 февраля 2010

Альтернативный вариант - написать код, используя cin, а затем использовать перенаправление ввода при запуске программы, если вы хотите принять ввод из файла. Это не отвечает на ваш точный вопрос, но это более простой дизайн для представленного вами случая.

Например, вместо

program.exe cin

вы бы просто запустили

program.exe

и вместо

program.exe myfile.txt

вы бы запустили

program.exe < myfile.txt

Это работает на * nix и Windows.

0 голосов
/ 12 февраля 2018

Вы также можете сделать это без указателей:

ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));
...