C++ C++;:是否将cin分配给ifstream变量?

C++ C++;:是否将cin分配给ifstream变量?,c++,iostream,ifstream,C++,Iostream,Ifstream,您知道一个常见的stdio习惯用法,stdin由 文件名为“-”,例如 使用ifstream实例执行此操作的最佳方法是什么?我收到了 一段代码,它有一个ifstream作为类的一部分,我 喜欢添加代码来执行等效操作,例如: if ( filename == "-") logstream = cin; // **how do I do this*?* else logstream.open( filename.c_str() ); cin不是一个ifstream,但如果您可以使

您知道一个常见的stdio习惯用法,
stdin
由 文件名为“-”,例如

使用
ifstream
实例执行此操作的最佳方法是什么?我收到了 一段代码,它有一个
ifstream
作为类的一部分,我 喜欢添加代码来执行等效操作,例如:

if ( filename == "-")
    logstream = cin;  // **how do I do this*?*
else
    logstream.open( filename.c_str() );

cin
不是一个
ifstream
,但如果您可以使用
istream
,那么您将获胜。否则,如果您准备不可移植,只需打开
/dev/stdin
/dev/fd/0
或其他任何内容即可。:-)


如果您确实希望具有可移植性,并且可以让您的程序使用
istream
,那么有一种方法可以做到这一点:

struct noop {
    void operator()(...) const {}
};

// ...

shared_ptr<istream> input;
if (filename == "-")
    input.reset(&cin, noop());
else
    input.reset(new ifstream(filename.c_str()));
struct noop{
void运算符()(…)常量{}
};
// ...
共享ptr输入;
如果(文件名=“-”)
input.reset(&cin,noop());
其他的
重置(新的ifstream(filename.c_str());
noop
用于指定在
cin
情况下不执行任何操作的删除程序,因为
cin
并不意味着要删除。

  • 将初始值保存到变量中
  • 将更改为
  • 做你需要做的事
  • 在关闭文件之前不要忘记恢复cin streambuf——RAII可能会有所帮助

我在一小时前写了一个非常类似的答案,但在重读了问题的这一部分后将其删除:“我收到了一段代码,其中有一个ifstream作为类的一部分”。这个问题的标题有误导性,因为它可能被解读为“如何重定向cin以从文件读取”,但事实恰恰相反:OP已经有了一个ifstream,并且希望将其重定向到cin。我们不能像那样更改ifstream的streambuf。在ChrisJester Young的解决方案中,使用的流的确切类型需要更改。谢谢。。。这只需要移植到linux和osx,所以/dev/stdin就是这样!(叹息)这说明了没有人坐过,并做出了一套中庸的C++ LIBS集。(如果没有那么多版本问题,我会说boost)FWIW,使用C++11,而不是将
noop()
传递到
reset
(并定义结构),一个简单(而且看起来有趣)的
[](…){}
就可以了。@akim Yep。去兰巴斯!
struct noop {
    void operator()(...) const {}
};

// ...

shared_ptr<istream> input;
if (filename == "-")
    input.reset(&cin, noop());
else
    input.reset(new ifstream(filename.c_str()));