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