ใน C, การพิมพ์ที่ stdout เป็นเรื่องง่ายด้วยจากprintf
stdio.h
อย่างไรก็ตามสามารถพิมพ์ไปยัง stderr ได้อย่างไร? เราสามารถใช้fprintf
เพื่อให้บรรลุได้อย่างชัดเจน แต่ไวยากรณ์ของมันดูแปลก ๆ บางทีเราอาจใช้printf
พิมพ์ลง stderr?
fprintf
.
ใน C, การพิมพ์ที่ stdout เป็นเรื่องง่ายด้วยจากprintf
stdio.h
อย่างไรก็ตามสามารถพิมพ์ไปยัง stderr ได้อย่างไร? เราสามารถใช้fprintf
เพื่อให้บรรลุได้อย่างชัดเจน แต่ไวยากรณ์ของมันดูแปลก ๆ บางทีเราอาจใช้printf
พิมพ์ลง stderr?
fprintf
.
คำตอบ:
ไวยากรณ์เกือบจะเหมือนกับ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)
#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 ที่ยังไม่ถูกล้าง สตรีมที่เปลี่ยนเส้นทางหรือไปป์จะไม่เห็นการแทรกสอดนี้เนื่องจากโดยปกติจะเห็นเฉพาะเอาต์พุตของ stdout เท่านั้นหรือ stderr เท่านั้น
แม้ว่าในตอนแรกทั้ง stdout และ stderr จะมาที่คอนโซล แต่ทั้งสองอย่างจะแยกกันและสามารถเปลี่ยนเส้นทางทีละรายการได้
คุณรู้sprintf
หรือไม่? โดยพื้นฐานแล้วมันเป็นสิ่งเดียวกันกับfprintf
. อาร์กิวเมนต์แรกคือปลายทาง (ไฟล์ในกรณีfprintf
ie stderr
) อาร์กิวเมนต์ที่สองคือสตริงรูปแบบและส่วนที่เหลือเป็นอาร์กิวเมนต์ตามปกติ
ฉันขอแนะนำข้อมูลอ้างอิงนี้printf
(และครอบครัว)ด้วย
หากคุณไม่ต้องการแก้ไขรหัสปัจจุบันและเพียงเพื่อแก้จุดบกพร่องการใช้งาน
เพิ่มมาโครนี้:
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
เปลี่ยนstderr
เป็นstdout
ถ้าคุณต้องการย้อนกลับ
เป็นประโยชน์สำหรับการดีบัก แต่ไม่ใช่แนวทางปฏิบัติที่ดี
eprintf
หรือบางอย่างก็ได้ (: O นี่คือตัวอย่างมาโครตัวแปรของ GCC (3.2): gcc.gnu.org/onlinedocs/gcc-3.2/cpp/Variadic-Macros.html )
ในการพิมพ์บริบทของคุณคุณสามารถเขียนโค้ดดังนี้:
FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");