2010-02-07 60 views
3

我需要编写一个从ifstream或cin中读取的程序,具体取决于运行时传递给程序的参数。在C++中声明泛型istream

我打算做好以下工作:

istream in; 

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

然而,在的IStream保护,我不能宣布在istream对象是否有申报在流,通用的方式?

回答

3

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

istream* in; 
ifStream inFile; 

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

(还要注意的字符串处理的修改,我修改了他们作为一个例子。)

+0

好吧,我试过了,但是下面的代码产生以下错误: CODE: 而(* in.good()){ 弦线; getline(* in,line); cout << line; } 错误: 对'in'中的成员'good'的请求,它是非类类型的'std :: istream *' – finiteloop 2010-02-07 23:15:09

+1

使用'(* in).good'或'in-> good'。只需坐下来熟悉C++语法即可。你会节省很多时间:) – 2010-02-07 23:17:46

+0

哦,好的。谢谢您的帮助。我只是没有想好。 – finiteloop 2010-02-07 23:19:15

1

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

例如,而不是

program.exe cin 

你会运行的

program.exe myfile.txt 

program.exe 

,而是你可以运行

program.exe < myfile.txt 

这适用于* nix和Windows。

0

你也可以做到这一点没有指针:

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