Em C, imprimir em stdout é fácil, com printffrom stdio.h.
No entanto, como imprimir em stderr? Podemos usar fprintfpara alcançá-lo aparentemente, mas sua sintaxe parece estranha. Talvez possamos usar printfpara imprimir em stderr?
#include<stdio.h>int main (){
printf("hello ");
fprintf( stderr,"HELP!");
printf(" world\n");return0;}
$ ./a.exe
HELP!hello world
$ ./a.exe 2> tmp1
hello world
$ ./a.exe 1> tmp1
HELP!$
stderr é geralmente sem buffer e stdout geralmente é. Isso pode levar a uma saída de aparência estranha como esta, o que sugere que o código está sendo executado na ordem errada. Não é, só que o buffer stdout ainda não foi limpo. Streams redirecionados ou canalizados, é claro, não veriam essa intercalação, pois normalmente veriam apenas a saída de stdout apenas ou apenas de stderr.
Embora inicialmente tanto stdout quanto stderr venham para o console, ambos são separados e podem ser redirecionados individualmente.
Você sabe sprintf? É basicamente a mesma coisa com fprintf. O primeiro argumento é o destino (o arquivo no caso de fprintfie stderr), o segundo argumento é a string de formato e os demais são os argumentos, como de costume.
fprintf
.Respostas:
A sintaxe é quase a mesma que
printf
. Comprintf
você fornece o formato da string e seu conteúdo, ou seja:Com
fprintf
ele é o mesmo, só que agora você também está especificando o local para imprimir:Ou no seu caso:
fonte
Exemplos:
fonte
stderr é geralmente sem buffer e stdout geralmente é. Isso pode levar a uma saída de aparência estranha como esta, o que sugere que o código está sendo executado na ordem errada. Não é, só que o buffer stdout ainda não foi limpo. Streams redirecionados ou canalizados, é claro, não veriam essa intercalação, pois normalmente veriam apenas a saída de stdout apenas ou apenas de stderr.
Embora inicialmente tanto stdout quanto stderr venham para o console, ambos são separados e podem ser redirecionados individualmente.
fonte
Você sabe
sprintf
? É basicamente a mesma coisa comfprintf
. O primeiro argumento é o destino (o arquivo no caso defprintf
iestderr
), o segundo argumento é a string de formato e os demais são os argumentos, como de costume.Eu também recomendo esta referência
printf
(e família) .fonte
Se você não deseja modificar os códigos atuais e apenas para uso de depuração.
Adicione esta macro:
Altere
stderr
parastdout
se quiser reverter.É útil para depurar, mas não é uma boa prática.
fonte
Para imprimir seu contexto, você pode escrever um código como este:
fonte