出于教育原因,我正在尝试创建一个 c++ ostream。我的测试将创建一个 ostream,它的行为类似于 ofstream,除了写入文件而不是写入双端队列或向量容器之外。
user34537
问问题
15088 次
4 回答
13
正如您所说,对于教育而言,我将向您展示我将如何做这样的事情。否则,stringstream
真的是要走的路。
听起来您想创建一个 streambuf 实现,然后写入向量/双端队列。像这样的东西(从我的另一个针对 /dev/null 流的答案复制):
template<typename Ch, typename Traits = std::char_traits<Ch>,
typename Sequence = std::vector<Ch> >
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> {
typedef std::basic_streambuf<Ch, Traits> base_type;
typedef typename base_type::int_type int_type;
typedef typename base_type::traits_type traits_type;
virtual int_type overflow(int_type ch) {
if(traits_type::eq_int_type(ch, traits_type::eof()))
return traits_type::eof();
c.push_back(traits_type::to_char_type(ch));
return ch;
}
Sequence const& get_sequence() const {
return c;
}
protected:
Sequence c;
};
// convenient typedefs
typedef basic_seqbuf<char> seqbuf;
typedef basic_seqbuf<wchar_t> wseqbuf;
你可以像这样使用它:
seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();
如果你想有一个双端队列作为序列,你可以这样做:
typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;
或类似的东西......好吧,我还没有测试过。但也许这也是一件好事 - 所以如果它仍然包含错误,您可以尝试修复它们。
于 2009-02-07T21:09:26.330 回答
4
使用 std::stringstream
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s;
s << "Plop" << 5;
std::cout << s.str();
}
于 2009-02-07T20:42:25.590 回答
2
我只想说,您不必为此编写类似 ostream 的类。您可以使用适配器来实现您的目标。
例如,此代码从 istream 读取并将每个元素插入到向量中:
vector<string> V;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(V));
于 2009-02-07T21:06:37.337 回答
1
如果没有更多关于您想要做什么的详细信息,很难过于具体,但您不想创建新的 ostream。您要做的是创建一个新类型的 streambuf,并使用现有的 ostream。
最简单的做法是从 std::basic_filebuf<> 继承,并重载 sync() 和 overflow() 方法以将元素添加到数据结构中。
于 2009-02-07T20:47:43.567 回答