Pergunta

Atualmente, estou tentando implementar uma subclasse de stringbuf para permitir que o buffer seja tokenizado para caracteres específicos ('\ n' no meu caso) e realizar uma ação se esse caractere ocorrer (despejar a mensagem em um logger e limpar o buffer depois no meu caso). Para atingir esse objetivo, eu substituí sputc (para implementar o cuidado com o '\ n') e xsputn (para usar sputc de fato, já que a implementação do GCC não parece fazer isso por padrão). Para fins de depuração, deixo o sputc escrever cada caractere que é passado a ele para o stdout.

Agora, esta é a minha pergunta: se eu usar algo como

mystream << "Some text" << std::endl;

sputc recebe cada caractere exceto o '\ n' que deve ser induzido por std :: endl, então a ação esperada não é realizada porque o '\ n' não é passado adiante. Se eu usar algo como

mystream << "Some text" << '\n';

ou mesmo

mystream << "Some text" << "\n" << std::flush;

tudo funciona conforme o esperado e minha implementação de sputc recebe o caractere '\ n'.

Portanto, minha pergunta é: as duas linhas de código não deveriam fazer exatamente o mesmo em relação ao stringbuf por trás, e se não, quais outros métodos eu tenho que substituir para obter o '\ n'?

Foi útil?

Solução

Você não pode substituir sputc porque sputc não é virtual.Você precisa sobrecarregar overflow e sync e examinar toda a sequência pendente para ocorrências de \n.

Você não deve realmente precisar sobrecarregar xsputn, a menos que possa fazer algo ideal, porque você sabe algo especial sobre o dispositivo que suporta seu tipo de stream.

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