Làm cách nào tôi có thể in sang stderr trong C?


120

Trong C, dễ dàng in sang giấy in với printftừ stdio.h.

Tuy nhiên, làm thế nào có thể in sang stderr? 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 sang stderr?


5
Cú pháp của nó có gì "lạ"? Nó in ở đâu , như thế nàocái gì .
Eugene Sh.

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

@Eugene. Tôi đồng ý với bạn. Tôi nghĩ rằng điều đó thật kỳ lạ vì tôi không nhận ra stderr là một FILE :)
wad

Câu trả lời:


179

Cú pháp gần giống như printf. Với việc printfbạn cung cấp đị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 fprintfnó cũng vậy, ngoại trừ bây giờ bạn cũng đang chỉ định nơi để in:

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

34

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 (using fprintf)

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

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



5

Nếu bạn không muốn sửa đổi mã hiện tại và chỉ để gỡ lỗi sử dụng.

Thêm macro này:

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

Thay đổi stderrthành stdoutnếu bạn muốn quay trở lại.

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


0

Để in ngữ cảnh của bạn, bạn có thể viết mã như sau:

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

Điều này không thêm bất cứ điều gì vào các câu trả lời trước đó và không thực sự trả lời câu hỏi.
Fantastic Mr Fox,

Câu lệnh sprintf () đó gây ra hỏng bộ nhớ! ... Tôi thực sự khuyên bạn nên đọc về cách con trỏ, mảng và chuỗi hoạt động.
BlueChip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.