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