Pregunta
Estoy tratando de crear un ostream ++ c por razones educativas. Mi prueba será la creación de un ostream que actúa como un ofstream sería menos que en vez de escribir en un archivo que escribiría a un contenedor deque o vector.
Solución
Como lo es para la educación, como usted dice, yo le muestro cómo lo haría una cosita tales. De lo contrario, stringstream
es realmente el camino a seguir.
Parece que usted quiere crear una aplicación streambuf que escribe entonces a un vector / deque. Algo como esto (copiar de otra respuesta de mí que rel="noreferrer"> corriente nula):
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;
Puede utilizar de esta manera:
seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();
Si usted quiere tener un deque como secuencia, puede hacerlo:
typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;
o algo similar ... Bueno, yo no lo he probado. Pero tal vez eso es también una buena cosa - por lo que si contiene errores todavía, puede intentar corregirlos.
Otros consejos
El uso std :: stringstream
#include <iostream>
#include <sstream>
int main()
{
std::stringstream s;
s << "Plop" << 5;
std::cout << s.str();
}
Voy a comentar que no tiene que escribir una clase ostream como para eso. Se puede utilizar un adaptador para lograr su objetivo.
Por ejemplo, este código lee desde istream e inserta cada elemento en un vector:
vector<string> V;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(V));
Sin más detalles sobre lo que quiere hacer, es difícil ser demasiado específico, pero no desea crear un nuevo ostream. Lo que se quiere hacer es crear un nuevo tipo de streambuf, y utilizar un ostream existente.
Lo easyist que hacer es heredar de std :: basic_filebuf <>, y la sobrecarga de la sincronización () y desbordamiento () para añadir elementos a sus estructuras de datos.