如何在C ++中写入输入流cin

时间:2014-10-31 09:10:21

标签: c++ input io

所以我有一个程序(一个游戏),旨在通过键盘从人类获取输入。然而,希望在某些点上我控制远离用户并为他们做出某些决定。虽然可以编写特殊情况代码,以便在事件强制模拟用户输入的效果时使用,但我更倾向于覆盖输入流(在本例中为cin),以便程序实际上响应没有区别强迫决定,而不是用户自愿做出这样的决定。

我尝试过编写它就像输出流(例如cin<<'z')但是&lt;&lt; operator没有为cin定义,我不知道如何定义它。

写入键盘缓冲区会更好吗?如果是这样,我将如何以系统无关的方式做到这一点?

3 个答案:

答案 0 :(得分:7)

写入输入是一个非常黑客。在实际输入(如cin)和作用于该输入的游戏之间放置一个抽象层将是很多更清洁的设计。然后,您可以重新配置此抽象层以响应程序生成的命令,而不是在必要时响应cin

答案 1 :(得分:2)

您可以在std::cin中插入streambuf,例如:

class InjectedData : public std::streambuf
{
    std::istream* myOwner;
    std::streambuf* mySavedStreambuf;
    std::string myData;
public:
    InjectedData( std::istream& stream, std::string const& data )
        : myOwner( &stream )
        , mySavedStreambuf( stream.rdbuf() )
        , myData( data )
    {
        setg( myData.data(), myData.data(), myData.data() + myData.size() );
    }
    ~InjectedData()
    {
        myOwner->rdbuf(mySavedStreambuf);
    }
    int underflow() override
    {
        myOwner->rdbuf(mySavedStreambuf);
        return mySavedStreambuf->sgetc();
    }
};

(我没有对此进行测试,因此可能存在错误。但基本的 原则应该有效。)

使用std::cin作为参数构造此实例 将从data返回字符,直到实例为止 被破坏,或者所有角色都被消耗掉了。

答案 2 :(得分:0)

我认为写cin是一个设计糟糕的程序的症状。

你可能实际上想要一些event loop当然是特定于操作系统的。在Posix和Linux上,您可以在poll(2)系统调用之上构建它,并且您可能希望从您自己的进程中为自己设置pipe(7)

有几个库提供了一些事件循环:libeventlibev以及QtGtkPOCOlibsdl等框架...(其中一些被移植到几个操作系统,所以给你一个高于操作系统的抽象......)

相关问题