В C печатать на stdout легко, с printf от stdio.h.
Однако, как можно печатать на stderr? Мы можем использовать fprintf для его достижения, но его синтаксис кажется странным. Может быть, мы можем использовать printf для печати в stderr?
В C печатать на stdout легко, с printf от stdio.h.
Однако, как можно печатать на stderr? Мы можем использовать fprintf для его достижения, но его синтаксис кажется странным. Может быть, мы можем использовать printf для печати в stderr?
Синтаксис почти такой же, как 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);
Примеры:
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 ie stderr), второй аргумент - строка формата, а остальные - как обычно.
Я также рекомендую эту ссылку printf (и family).
#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 выходят на консоль, оба являются отдельными и могут быть индивидуально перенаправлены.
Если вы не хотите изменять текущие коды и просто для использования отладки.
Добавьте этот макрос:
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
Измените stderr на stdout если вы хотите откат.
Это полезно для отладки, но это не очень хорошая практика.
Чтобы распечатать свой контекст, вы можете написать такой код:
FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");