Как я могу печатать на 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!$
  1. Обычно stderr небуферируется и обычно является стандартным. Это может привести к нечетному выглядящему выводу, подобному этому, что предполагает, что код выполняется в неправильном порядке. Дело не в том, что буфер stdout еще не очищен. Конечно, перенаправленные или потоковые потоки не будут видеть этот чередование, поскольку они обычно видят только вывод только stdout или только stderr.

  2. Хотя изначально оба 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");