Как я могу печатать на stderr в C?

В C, печатать к stdout легок, с printf с stdio.h.

однако, как можно печатать в stderr? Мы можем использовать fprintf достичь этого, по-видимому, но его синтаксис кажется странным. Может быть, мы сможем использовать printf печатать в stderr?

6 ответов


синтаксис почти такой же, как printf. С printf вы даете формат строки и ее содержимое ie:

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);

примеры:

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)

вы знаете sprintf? Это в основном то же самое с fprintf. Первым аргументом является пункт назначения (файл в случае fprintf то есть stderr), вторым параметром является строка формата, а остальные аргументы, как обычно.

и этой printf (и семейные) ссылка.


#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 обычно unbuffered и stdout обычно. Это может привести к нечетному виду вывода, Как это, что предполагает, что код выполняется в неправильном порядке. Это не так, просто буфер stdout еще не сброшен. Перенаправленные или конвейерные потоки, конечно, не будут видеть этот перемежение, поскольку они обычно видят только выход только stdout или только stderr.

  2. хотя первоначально оба stdout и stderr приходят к консоли, оба отдельные и могут быть индивидуально перенаправлены.


Если вы не хотите изменять текущие коды и просто для использования отладки.

добавить этот макрос:

#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC

изменить stderr to stdout Если вы хотите откатить.

Это полезно для отладки, но это не хорошая практика.


чтобы распечатать контекст, вы можете написать код следующим образом:

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");