c++中是否有一种可移植的方法将stdin重定向为string ?

Is there a portable way to redirect stdin to string in C++?

本文关键字:方法 stdin 重定向 string 可移植 一种 是否 c++      更新时间:2023-10-16

是否有可能在c++中将stdin重定向到c++中的字符串?

使用freopen可以将stdin重定向到file,因此scanf和cin都将使用该文件的内容。通过对stringstream和cin.rdbuf()的操作,我可以将cin重定向到该字符串,因此对cin的任何调用都可以处理我的字符串。但是scanf将继续处理先前的输入流。我想可以用Unix的管道来做,但在Windows下是不可用的。

是否有可能以一种可移植的方式解决这个问题?

假设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());
}

这不是最好的方法,但是您可以这样做:

// 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;
}