Pergunta

Para fins educacionais eu quero criar um buffer ostream e fluxo para fazer:

  1. endians correção ao fazer << myVar;
  2. armazenar em um recipiente deque em vez de usar std: cout ou escrever para um arquivo
  3. registrar dados extras, como vezes quantas vezes eu fiz <<, quantas vezes eu fiz .write, a quantidade de bytes I escritas e quantos eu flush (). Mas eu não preciso de todas as informações.

Eu tentei sobrecarga, mas falhou terrivelmente. Eu tentei sobrecarga de gravação, fazendo

ostream& write( const char* s, streamsize n ) 

na minha classe basic_stringstream2 (Copiei colar basic_stringstream em meu arquivo cpp e modificado) mas o código mantido usando basic_ostream. Eu olhei através de código e parece que eu preciso xsputn sobrecarga (que não é mencionar desta página http : //www.cplusplus.com/reference/iostream/ostream ) mas o que mais eu preciso sobrecarga? e como faço para construir minha classe (o que ele precisa herdar, etc)?

Foi útil?

Solução

A abordagem canônica consiste em definir o seu próprio streambuf. Você deve ter um olhar em:

Outras dicas

Para A + C) Eu acho que você deve olhar para facetas, eles modificar como os objetos são escritos como personagens. Você poderia armazenar estatísticas aqui, bem como sobre quantas vezes você transmitido seus objetos. Confira Como formatar meus próprios objetos ao usar STL streams? para um exemplo.

Para B) Você precisa criar seu próprio streambuf e conectar seu ostream para esse buffer (argumento do construtor). Consulte de Luc ligações + Derivando novas classes streambuf . Em suma, você precisa implementar isso para um ostream (mínimo):

  • transbordo (colocar um único caractere ou tampão nivelado) ( ligação )
  • xsputn (colocar uma matriz de caracteres para o buffer) ( ligação )
  • sync ( ligação )

Eu não tenho certeza que o que você quer fazer é possível. Os operadores << não são virtuais. Assim, você poderá definir yourstream &operator << (yourstream &strm, int i) para fazer o que quiser com a conversão endian e contagem, e funciona quando o código chama-lo diretamente. Mas se você passar um objeto yourstream em uma função que espera um ostream, a qualquer hora que a função chama <<, ele irá para a versão original ostream invés do seu.

Pelo que entendi, as instalações córregos foram criados de modo que você pode "facilmente" definir um novo tipo de fluxo que usa um tipo diferente de tampão (como, digamos, um deque de caracteres), e você pode muito facilmente adicionar suporte para produzir suas próprias classes via <<. Eu não acho que você está destinado a ser capaz de redefinir a camada intermediária entre aqueles.

E, particularmente, o ponto inteiro da interface << é fornecer saída de texto bem formatado, enquanto parece que você realmente quer saída binária. (Caso contrário, a referência a "endian" não faz sentido.) Mesmo supondo que há alguma maneira de fazer isso eu não sei, que irá produzir saída binária estranho no melhor. Por exemplo, considere a sobrecarga utilizador final para a saída de um ponto no espaço 3D. A versão de usuário final de << provavelmente irá fazer algo como << '(' << x << ", " << y << ", " << z << ')'. Que vai olhar agradável em um fluxo de texto, mas é um monte de personagens perdidos e completamente inúteis em um fluxo binário, que, idealmente, apenas usam << x << y << z. (E quantas chamadas para << deve aqueles contam como?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top