3

我需要编写一个从 ifstream 或 cin 读取的程序,具体取决于在运行时传递给程序的参数。

我打算做以下事情:

 istream in;

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

但是,istream 在受保护,我不能在其中声明 istream。有没有办法在流中声明这样的泛型?

4

3 回答 3

3

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

 istream* in;
 ifStream inFile;

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

(还要注意字符串处理中的修改。我以修改它们为例。)

于 2010-02-07T23:08:04.483 回答
1

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

例如,而不是

program.exe cin

你会跑

program.exe

而不是

program.exe myfile.txt

你会跑

program.exe < myfile.txt

这适用于 *nix 和 Windows。

于 2010-02-08T00:26:17.897 回答
0

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

ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));
于 2018-02-12T00:31:43.853 回答