我正在研究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正确运行。
答案 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_;
};
现在它正在运作。