boost :: iostreams :: source中的read函数如何实际工作?

时间:2014-03-08 02:45:30

标签: c++ boost boost-iostreams

我正在研究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正确运行。

1 个答案:

答案 0 :(得分:0)

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

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

现在它正在运作。