【问题标题】:C++: assign cin to an ifstream variable?C++:将 cin 分配给 ifstream 变量?
【发布时间】:2011-01-10 16:40:13
【问题描述】:

您知道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() );

【问题讨论】:

    标签: c++ iostream ifstream


    【解决方案1】:

    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 并不意味着被删除。

    【讨论】:

    • 谢谢...这只需要移植到 linux 和 osx,所以 /dev/stdin 就可以了! (叹气)
    • 这说明了没有人坐下来制作了一套中规中矩的 c++ 库。 (如果没有那么多版本问题,我会说提升)
    • FWIW,使用 C++11 而不是将noop() 传递给reset(并定义结构),一个简单(且看起来很有趣)[](...){} 就可以了。
    • @akim 是的。去 lambdas!
    【解决方案2】:

    【讨论】:

    • 我在一小时前写了一个非常相似的答案,但在重新阅读了这部分问题后将其删除:“我收到了一些将 ifstream 作为类的一部分的代码”。问题的标题具有误导性,因为它可能被解读为“我如何重定向 cin 以从文件中读取”,但 IIUC 恰恰相反:OP 已经有一个 ifstream 并希望将其重定向到 cin。
    • 确实如此。我们不能像那样改变 ifstream 的 streambuf。与 Chris Jester-Young 的解决方案一样,需要更改使用的流的确切类型。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2018-02-14
    • 2014-04-23
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多