3

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

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

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

4

2 回答 2

1

Assuming both the C and C++ standard streams are synchronized, the following should work:

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());
}
于 2014-02-12T00:54:17.780 回答
0

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

// 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;
}
于 2013-05-08T15:51:27.597 回答