在c ++中声明泛型istream

时间:2010-02-07 23:07:11

标签: c++ iostream ifstream 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。有没有办法在流中声明这样的泛型?

3 个答案:

答案 0 :(得分:3)

尝试使用istream*。但请注意,您必须稍微更改代码。使用指针,您必须保留您指向的对象的内存区域。换句话说,“inFile”变量不能在那里声明,因为它不会存在于else之外。代码可以是:

 istream* in;
 ifStream inFile;

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

(另请注意字符串处理中的修改。我将它们修改为一个例子。)

答案 1 :(得分:1)

另一种设计是使用cin编写代码,然后在运行程序时使用input redirection,如果您想接受来自文件的输入。这不能回答您的确切问题,但对于您提出的案例,这是一个更简单的设计。

例如,而不是

program.exe cin

你只需要运行

program.exe

而不是

program.exe myfile.txt

你会跑

program.exe < myfile.txt

这适用于* nix和Windows。

答案 2 :(得分:0)

您也可以在没有指针的情况下执行此操作:

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