2016-08-17 4 views
28

В C, печатать на стандартный вывод, с printf от stdio.h.Как я могу печатать на stderr в C?

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

+4

Что такого «странного» в его синтаксисе? Это print * где *, * how * и * what *. –

+4

Я сосредоточен на этом. Единственная проблема, возникающая из вопроса, что вы находите решение «странным». В противном случае нет никаких сомнений. Используйте 'fprintf'. –

+0

@ Юджин. Я с тобой согласен. Я думал, что это странно, поскольку я не знал, что stderr - ФАЙЛ :) – wad

ответ

59

Синтаксис почти такой же, как 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); 
+0

Очень ясно. Спасибо за это разъяснение. – wad

5

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

Я также рекомендую this printf (and family) reference.

10

Примеры:

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 (usign fprintf) 
3
#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 приходят на консоль, оба являются отдельными и могут быть индивидуально перенаправлены.

0

Чтобы напечатать контекст, вы можете написать код так:

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^