paulo1205
(usa Ubuntu)
Enviado em 08/11/2016 - 18:26h
Caro Gokernel,
Com todo respeito, isso é um exemplo de como NÃO se deve programar.
O programa que você mostrou por último simplesmente reinventa
snprintf(), só que de modo piorado.
Ainda por cima, é ERRADO mexer com buffers de um
stream ativo, como você fez no final do seu programa. Veja o que diz a documentação do Linux.
The setvbuf() function may be used only after opening a stream and before any other operations have been performed on it.
A documentação do POSIX diz a mesma coisa, mas com outra linguagem.
The setvbuf() function may be used after the stream pointed to by stream is associated with an open file but before any other operation (other than an unsuccessful call to setvbuf()) is performed on the stream.
EDIT: Inicialmente eu tinha enxergado o erro apenas no final do programa, quando você chama
setbuf() (que é uma macro em torno de
setvbuf()), mas a coisa é errada desde o início. Quando você usa
stdout, o aquivo já chega para você aberto e com uma chamada
bem-sucedida a
setvbuf(), que associa a ele um
buffer orientado a linhas. Logo você viola de cara uma cláusula explícita na documentação do POSIX, presente também na documentação do Linux, embora menos claramente, quando fala em “antes que qualquer outra operação tenha sido realizada”.
----
Se você realmente precisar de redirecionamento da saída padrão, uma forma muito mais segura de trabalhar é redirecionando realmente o descritor associado à saída padrão, seja para um arquivo, para um
pipe ou para um
socket, num processo separado, e então fazer as operações de saída desse processo normalmente.
Do contrário, existem soluções padronizadas e que não recorrem a gambiarras e práticas questionáveis para preencher devidamente uma
string com texto formatado. Sugiro que você use uma delas.