Em C, imprimir em stdout é fácil, com printf
from stdio.h
.
No entanto, como imprimir em stderr? Podemos usar fprintf
para alcançá-lo aparentemente, mas sua sintaxe parece estranha. Talvez possamos usar printf
para imprimir em stderr?
fprintf
.
Em C, imprimir em stdout é fácil, com printf
from stdio.h
.
No entanto, como imprimir em stderr? Podemos usar fprintf
para alcançá-lo aparentemente, mas sua sintaxe parece estranha. Talvez possamos usar printf
para imprimir em stderr?
fprintf
.
Respostas:
A sintaxe é quase a mesma que printf
. Com printf
você fornece o formato da string e seu conteúdo, ou seja:
printf("my %s has %d chars\n", "string format", 30);
Com fprintf
ele é o mesmo, só que agora você também está especificando o local para imprimir:
File *myFile;
...
fprintf( myFile, "my %s has %d chars\n", "string format", 30);
Ou no seu caso:
fprintf( stderr, "my %s has %d chars\n", "string format", 30);
#include<stdio.h>
int main ( ) {
printf( "hello " );
fprintf( stderr, "HELP!" );
printf( " world\n" );
return 0;
}
$ ./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 fprintf
ie stderr
), 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) .
Se você não deseja modificar os códigos atuais e apenas para uso de depuração.
Adicione esta macro:
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
Altere stderr
para stdout
se quiser reverter.
É útil para depurar, mas não é uma boa prática.
Para imprimir seu contexto, você pode escrever um código como este:
FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");