Как я могу печатать на stderr в C?
В C печатать на stdout легко, с printf
от stdio.h
.
Однако, как можно печатать на stderr? Мы можем использовать fprintf
для его достижения, но его синтаксис кажется странным. Может быть, мы можем использовать printf
для печати в stderr?
Ответы
Ответ 1
Синтаксис почти такой же, как printf
. С printf
вы даете строковый формат и его содержимое, то есть:
printf("my %s has %d chars\n", "string format", 30);
С fprintf
это одно и то же, за исключением того, что теперь вы также указываете место для печати:
File *myFile;
...
fprintf( myFile, "my %s has %d chars\n", "string format", 30);
Или в вашем случае:
fprintf( stderr, "my %s has %d chars\n", "string format", 30);
Ответ 2
Примеры:
printf("%s", "Hello world\n"); // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n"); // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)
Ответ 3
Вы знаете sprintf
? Это в основном то же самое с fprintf
. Первый аргумент - это назначение (файл в случае fprintf
ie stderr
), второй аргумент - строка формата, а остальные - как обычно.
Я также рекомендую эту ссылку printf
(и family).
Ответ 4
#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 небуферируется и обычно является стандартным. Это может привести к нечетному выглядящему выводу, подобному этому, что предполагает, что код выполняется в неправильном порядке. Дело не в том, что буфер stdout еще не очищен. Конечно, перенаправленные или потоковые потоки не будут видеть этот чередование, поскольку они обычно видят только вывод только stdout или только stderr.
-
Хотя изначально оба stdout и stderr выходят на консоль, оба являются отдельными и могут быть индивидуально перенаправлены.
Ответ 5
Если вы не хотите изменять текущие коды и просто для использования отладки.
Добавьте этот макрос:
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
Измените stderr
на stdout
если вы хотите откат.
Это полезно для отладки, но это не очень хорошая практика.
Ответ 6
Чтобы распечатать свой контекст, вы можете написать такой код:
FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");