C++ C++;:是否将cin分配给ifstream变量?
您知道一个常见的stdio习惯用法,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,但如果您可以使
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可能会有所帮助
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()));