【问题标题】:Is there a portable way to redirect stdin to string in C++?是否有一种可移植的方式将标准输入重定向到 C++ 中的字符串?
【发布时间】:2013-05-02 20:56:56
【问题描述】:

在 C++ 中是否可以将标准输入重定向到 C++ 中的字符串?

使用 freopen 我可以将标准输入重定向到文件,因此 scanf 和 cin 都将使用该文件的内容。 使用 stringstream 和 cin.rdbuf() 进行操作,我可以将 cin 重定向到该字符串,因此对 cin 的任何调用都可以使用我的字符串。但是 scanf 将继续使用以前的输入流。 我想这可能与 Unix 的管道有关,但它在 Windows 下不可用。

是否有可能以便携的方式解决这个问题?

【问题讨论】:

  • 管道也可以在 Windows 中工作,但您需要运行辅助可执行文件。
  • 使用文件有什么问题?将您的字符串写入临时文件并将stdin 重定向到它。
  • 好吧,这对我来说不是一种方式。我需要在应用程序工作期间进行临时重定向,可能多次。
  • @user315052,希望在内存中预取数据。
  • @flashnik:也许你应该考虑改用sscanf()。无论如何,您应该考虑使用sscanf() 而不是scanf()

标签: c++ file-io io stdin


【解决方案1】:

假设 C 和 C++ 标准流是同步的,以下应该可以工作:

class save_buffer
{
public:
    save_buffer(std::ios& str) :
        my_str(str),
        m_sbuf(str.rdbuf())
    { }

    ~save_buffer()
    {
        m_str.rdbuf(m_sbuf);
    }
private:
    std::ios& m_str;
    std::streambuf* m_sbuf;
};

int main()
{
    std::istringstream buf;

    save_buffer sb(std::cin);
    std::cin.rdbuf(buf.rdbuf());
}

【讨论】:

    【解决方案2】:

    这不是最好的方法,但您可以通过以下方式使其工作:

    // warning - has side effects (sets noskipws) but we don't care (its an example)
    ostream& operator<< (ostream& out, istream& in)
    {
        in >> noskipws;
        char c;
        in >> c;
    
        while (in)
        {
            out << c;
            in >> c;
        }
    
        return out;
    }
    
    int main()
    {
        ostringstream inputstr;
        inputstr << cin;
    
        inputstr.str(); // contains all data from stdin
        return;
    }
    

    【讨论】:

    • 我也知道一次一个字符从流中提取数据也可能不是最理想的。由于多种原因,此解决方案未完善。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多