17

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

if ((strcmp(fname, "-"))
    fp = fopen(fname);
else
    fp = stdin;

ifstream使用实例执行此操作的最佳方法是什么?我收到了一些ifstream作为类的一部分的代码,我想添加代码来做同样的事情,比如:

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

2 回答 2

24

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()));

noop就是指定一个在这种情况下什么都不做的删除器,cin因为,好吧,cin并不意味着要被删除。

于 2010-01-29T02:16:11.503 回答
0
  • 将cin的初始streambuf保存到变量中
  • 将 cin的streambuf更改为文件中的那个
  • 做你需要做的事
  • 并且不要忘记在关闭文件之前恢复 cin streambuf —— RAII 可能会有所帮助。
于 2010-01-29T15:52:18.097 回答