2016-08-17 39 views
28

Trong C, In ấn để xuất dữ liệu thật dễ dàng, với printf từ stdio.h.Làm thế nào tôi có thể in để stderr trong C?

Tuy nhiên, làm cách nào để in ra được tiêu chuẩn? Chúng ta có thể sử dụng fprintf để đạt được nó rõ ràng, nhưng cú pháp của nó có vẻ lạ. Có lẽ chúng ta có thể sử dụng printf để in để stderr?

+4

Có gì "lạ" về cú pháp của nó? Đó là bản in * trong đó *, * cách * và * cái gì *. –

+4

Tôi đang tập trung vào nó. Vấn đề duy nhất phát sinh từ câu hỏi, rằng bạn tìm ra giải pháp "lạ". Nếu không thì không có câu hỏi. Sử dụng 'fprintf'. –

+0

@Eugene. Tôi đồng ý với bạn. Tôi nghĩ rằng nó là lạ như tôi đã không nhận ra stderr là một FILE :) – wad

Trả lời

59

Cú pháp là gần như giống nhau như printf. Với printf bạn cung cấp cho các định dạng chuỗi và nội dung của nó tức là:

printf("my %s has %d chars\n", "string format", 30); 

với fprintf nó là như nhau, ngoại trừ bây giờ bạn cũng được xác định là nơi để in ra:

File *myFile; 
... 
fprintf(myFile, "my %s has %d chars\n", "string format", 30); 

Hoặc trong trường hợp của bạn:

fprintf(stderr, "my %s has %d chars\n", "string format", 30); 
+0

Rất rõ ràng. Cảm ơn bạn đã làm rõ điều này. – wad

5

Bạn có biết sprintf không? Về cơ bản nó giống với fprintf. Đối số đầu tiên là đích đến (tệp trong trường hợp là fprintf tức là stderr), đối số thứ hai là chuỗi định dạng và phần còn lại là đối số như bình thường.

Tôi cũng khuyên bạn nên this printf (and family) reference.

10

Ví dụ:

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 thường không bị chặn và thường là stdout. Điều này có thể dẫn đến kết quả tìm kiếm kỳ lạ như thế này, điều này cho thấy mã đang thực thi theo thứ tự sai. Nó không phải là, nó chỉ là bộ đệm stdout vẫn chưa được flushed. Các luồng được chuyển hướng hoặc đường ống dĩ nhiên sẽ không thấy sự xen kẽ này vì chúng thường chỉ nhìn thấy đầu ra của giá trị stdout hoặc chỉ stderr.

  2. Mặc dù ban đầu cả hai stdout và stderr đến bàn điều khiển, cả hai đều riêng biệt và có thể được chuyển hướng riêng lẻ.

0

Để in nội dung của bạn, bạn có thể viết mã như thế này:

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

Nếu bạn không muốn thay đổi mã hiện tại và chỉ dành riêng cho việc sử dụng debug.

Thêm macro này:

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

Thay đổi stderr để stdout nếu bạn muốn quay trở lại.

Rất hữu ích cho việc gỡ lỗi, nhưng đó không phải là phương pháp hay.

Các vấn đề liên quan