Não, não é um comportamento POSIX, é um comportamento ISO (bem, é um comportamento POSIX, mas apenas na medida em que estejam em conformidade com a ISO).
A saída padrão é buffer de linha se puder ser detectada para se referir a um dispositivo interativo, caso contrário, é totalmente buffer. Portanto, há situações em printf
que a descarga não ocorre , mesmo que receba uma nova linha para enviar, como:
myprog >myfile.txt
Isso faz sentido para a eficiência, pois, se você está interagindo com um usuário, ele provavelmente deseja ver todas as linhas. Se você estiver enviando a saída para um arquivo, é mais provável que não haja um usuário na outra extremidade (embora não seja impossível, eles podem estar seguindo o arquivo). Agora você pode argumentar que o usuário deseja ver todos os personagens, mas há dois problemas com isso.
A primeira é que não é muito eficiente. A segunda é que o mandato original da ANSI C era principalmente codificar o comportamento existente , em vez de inventar um novo comportamento, e essas decisões de design foram tomadas muito antes do início da ANSI. Atualmente, até a ISO caminha com muito cuidado ao alterar as regras existentes nos padrões.
Quanto a como lidar com isso, se você fflush (stdout)
após cada chamada de saída que deseja ver imediatamente, isso resolverá o problema.
Como alternativa, você pode usar setvbuf
antes de operar stdout
para defini-lo como sem buffer e não precisará se preocupar em adicionar todas essas fflush
linhas ao seu código:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Lembre-se de que isso pode afetar bastante o desempenho se você estiver enviando a saída para um arquivo. Lembre-se também de que o suporte a isso é definido pela implementação, não garantido pelo padrão.
A seção ISO C99 7.19.3/3
é o bit relevante:
Quando um fluxo não é armazenado em buffer , os caracteres devem aparecer da origem ou do destino o mais rápido possível. Caso contrário, os caracteres podem ser acumulados e transmitidos para ou do ambiente host como um bloco.
Quando um fluxo é totalmente armazenado em buffer , os caracteres devem ser transmitidos para ou a partir do ambiente host como um bloco quando um buffer é preenchido.
Quando um fluxo é buffer de linha , os caracteres devem ser transmitidos para ou do ambiente host como um bloco quando um caractere de nova linha é encontrado.
Além disso, os caracteres devem ser transmitidos como um bloco para o ambiente host quando um buffer é preenchido, quando a entrada é solicitada em um fluxo sem buffer ou quando a entrada é solicitada em um fluxo com buffer de linha que requer a transmissão de caracteres do ambiente host. .
O suporte para essas características é definido pela implementação e pode ser afetado pelas funções setbuf
e setvbuf
.