我需要编写一个从ifstream或cin读入的程序,具体取决于在运行时传入程序的参数。
我打算做以下事情:
istream in;
if(argv[1] == "cin")
{
in = cin;
}
else
{
ifStream inFile;
inFile.open(argv[1].c_str());
in = inFile;
}
然而,istream受保护,我无法声明istream in。有没有办法在流中声明这样的泛型?
答案 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]));