1

我正在研究 boost::iostreams,我正在尝试编写自己的源设备。我写了两个版本的 boost::source。在第一个版本中,我只是简单地将时间字符串复制到 s 中,它就起作用了。但是在第二个版本中,我复制了一个特定的字符串,它就不行了,当我在这里下断点的时候,我发现它是一个圆圈。

struct mysource{
    typedef char                char_type;
    typedef io::source_tag      category;
    mysource(const char * echo):m_echo(echo){}
    std::streamsize read(char_type * s, std::streamsize n)
    {
        time_t tm;
        ::time(&tm);
        //return strlen(strncpy(s,ctime(&tm),n-1));  version 1  make a breakpoint here
        //return strlen(strncpy(s, m_echo, n-1));    version 2
    }
private:
    const char * m_echo;
};

这是测试。

int main(int argc, char * argv[])
{
    string s;
    const char * echo = "Hello world";
    io::stream<mysource> in(echo);
    getline(in, s);
    cout << s << endl;
}

版本 1:输出正确,版本 2:死循环。

所以我真的很困惑,“读取”调用中的工作流程是什么?

我浏览了 boost::iostreams 的手册。我发现的例子有点复杂,在我看来,这些例子所做的就是将几个成员添加到设备类中。它似乎不需要基本功能,因为我的版本 1 正在正确运行。

4

1 回答 1

0

在对 boost::iostreams 和上面提到的循环进行了一些研究之后,我发现我应该为“读取”功能实现一个计数器。计数器会告诉系统何时停止,因为“读取”函数将被多次调用。

struct mysource{
    typedef char                char_type;
    typedef io::source_tag      category;
    mysource(const char * echo):m_echo(echo), pos_(0){}
    std::streamsize read(char_type * s, std::streamsize n)
    {
        int left = strlen(m_echo) - pos_;
        int len = std::min((int)n, left);
        if(len != 0){
            int ret = strlen(strncpy(s, m_echo + pos_, len));
            pos_ += ret;
            return ret;
        }
        else{
            return -1; //EOF
        }

    }
private:
    const char * m_echo;

private:
    std::streamsize pos_;
};

现在它正在工作。

于 2014-03-08T03:20:27.517 回答