ทุกคนสามารถอธิบายในภาษาอังกฤษง่าย ๆ เกี่ยวกับความแตกต่างระหว่างprintf
, fprintf
และsprintf
มีตัวอย่าง?
กระแสข้อมูลคืออะไร
ฉันสับสนระหว่างสามสิ่งนี้ในขณะที่อ่านเกี่ยวกับ "การจัดการไฟล์ใน C"
ทุกคนสามารถอธิบายในภาษาอังกฤษง่าย ๆ เกี่ยวกับความแตกต่างระหว่างprintf
, fprintf
และsprintf
มีตัวอย่าง?
กระแสข้อมูลคืออะไร
ฉันสับสนระหว่างสามสิ่งนี้ในขณะที่อ่านเกี่ยวกับ "การจัดการไฟล์ใน C"
คำตอบ:
ใน C หมายถึง "กระแส" เป็นนามธรรม จากมุมมองของโปรแกรมมันเป็นเพียงผู้ผลิต (อินพุตสตรีม) หรือผู้บริโภค (เอาต์พุตสตรีม) ของไบต์ สามารถตรงกับไฟล์บนดิสก์ไปป์ไปยังเทอร์มินัลของคุณหรือกับอุปกรณ์อื่นเช่นเครื่องพิมพ์หรือ tty FILE
ประเภทมีข้อมูลเกี่ยวกับกระแส โดยปกติแล้วคุณจะไม่ยุ่งกับFILE
เนื้อหาของวัตถุโดยตรงคุณเพียงส่งตัวชี้ไปยังรูทีน I / O ที่หลากหลาย
มีสามสตรีมมาตรฐานstdin
คือตัวชี้ไปยังสตรีมอินพุตมาตรฐานstdout
เป็นตัวชี้ไปยังสตรีมเอาต์พุตมาตรฐานและstderr
เป็นตัวชี้ไปยังสตรีมเอาต์พุตข้อผิดพลาดมาตรฐาน ในเซสชันแบบโต้ตอบทั้งสามคนมักจะอ้างถึงคอนโซลของคุณแม้ว่าคุณจะสามารถเปลี่ยนเส้นทางให้ชี้ไปที่ไฟล์หรืออุปกรณ์อื่น ๆ ได้:
$ myprog < inputfile.dat > output.txt 2> errors.txt
ในตัวอย่างนี้stdin
ในขณะนี้ชี้ไปinputfile.dat
, stdout
คะแนนไปoutput.txt
และจุดที่จะต้อง stderr
errors.txt
fprintf
เขียนข้อความที่จัดรูปแบบลงในเอาต์พุตสตรีมที่คุณระบุ
printf
เทียบเท่ากับการเขียนfprintf(stdout, ...)
และเขียนข้อความที่จัดรูปแบบไปทุกที่ที่กระแสข้อมูลขาออกมาตรฐานชี้ไปในขณะนี้
sprintf
เขียนข้อความที่จัดรูปแบบลงในอาร์เรย์char
ซึ่งตรงข้ามกับสตรีม
printf
ออกไปยังกระแสออกมาตรฐาน ( stdout
)
fprintf
ไปที่ตัวจัดการไฟล์ ( FILE*
)
sprintf
ไปที่บัฟเฟอร์ที่คุณจัดสรร ( char*
)
printf ("format", args) ใช้เพื่อพิมพ์ข้อมูลลงในเอาต์พุตมาตรฐานซึ่งมักจะเป็นจอคอมพิวเตอร์
sprintf (อักขระ *, "รูปแบบ", args) เหมือนกับ printf แทนที่จะแสดงสตริงที่จัดรูปแบบบนเอาต์พุตมาตรฐานเช่นมอนิเตอร์มันเก็บข้อมูลที่จัดรูปแบบไว้ในสตริงที่ชี้โดยตัวชี้ถ่าน (พารามิเตอร์ตัวแรก) แทน ตำแหน่งสตริงเป็นความแตกต่างเพียงอย่างเดียวระหว่างไวยากรณ์ printf และ sprint
fprintf (FILE * fp, "format", args) ก็เหมือน printf อีกครั้ง ที่นี่แทนการแสดงข้อมูลบนจอภาพหรือบันทึกในสตริงบางส่วนข้อมูลที่จัดรูปแบบจะถูกบันทึกไว้ในไฟล์ที่ชี้โดยตัวชี้ไฟล์ซึ่งใช้เป็นพารามิเตอร์แรกของ fprintf ตัวชี้ไฟล์เป็นส่วนเพิ่มเติมเฉพาะกับไวยากรณ์ของ printf
หากใช้ไฟล์stdoutเป็นพารามิเตอร์ตัวแรกใน fprintf การทำงานนั้นจะถือว่าเทียบเท่ากับของ printf
printf(...)
fprintf(stdout,...)
เทียบเท่ากับ
fprintf
จะใช้ในการส่งออกไปยังกระแส
sprintf(buffer,...)
ใช้เพื่อจัดรูปแบบสตริงไปยังบัฟเฟอร์
หมายเหตุนอกจากนี้ยังมีvsprintf
, vfprintf
และvprintf
v
รสชาติที่ไม่ได้มาตรฐานผมเชื่อ
v
รสชาติที่มีความแน่นอนในมาตรฐานซี
คุณยังสามารถทำสิ่งที่มีประโยชน์มากด้วยฟังก์ชั่น vsnprintf ():
$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>
struct exception_fmt : std::exception
{
exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
char const* what() const throw() { return msg_; }
char msg_[0x800];
};
exception_fmt::exception_fmt(char const* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(msg_, sizeof msg_, fmt, ap);
va_end(ap);
}
int main(int ac, char** av)
{
throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}
$ g++ -Wall -o test test.cc
$ ./test
terminate called after throwing an instance of 'exception_fmt'
what(): ./test: bad number of arguments 1
Aborted (core dumped)
vsnprintf
เป็นฟังก์ชั่นที่ไม่ได้มาตรฐาน การใช้งานส่วนใหญ่ที่ฉันเคยเห็นการใช้งานนี้หรือสิ่งที่ชอบ แต่ก็เฉพาะการใช้งาน
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
fprintf
สิ่งนี้เกี่ยวข้องกับสตรีมโดยที่เป็นprintf
คำสั่งที่คล้ายกับfprintf
แต่ไม่เกี่ยวข้องกับสตรีมนั่นfprintf
คือไฟล์ที่เกี่ยวข้อง
sprintf: เขียนข้อมูลที่จัดรูปแบบลงในสตริงอักขระในหน่วยความจำแทน stdout
ไวยากรณ์ของ sprintf คือ:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
ที่นี่
String หมายถึงตัวชี้ไปยังบัฟเฟอร์ในหน่วยความจำที่จะทำการเขียนข้อมูล
Format หมายถึงตัวชี้ไปยังสตริงอักขระที่กำหนดรูปแบบ
แต่ละรายการเป็นตัวแปรหรือนิพจน์ที่ระบุข้อมูลที่จะเขียน
ค่าที่ส่งคืนโดย sprintf มีค่ามากกว่าหรือเท่ากับศูนย์หากการดำเนินการสำเร็จหรือกล่าวอีกนัยหนึ่งว่าจำนวนอักขระที่เขียนไม่นับการสิ้นสุดอักขระ null ที่ถูกยกเลิกและส่งคืนค่าน้อยกว่าศูนย์หากเกิดข้อผิดพลาด
printf: พิมพ์ไปยัง stdout
ไวยากรณ์สำหรับ printf คือ:
printf format [argument]…
ข้อแตกต่างระหว่าง sprintf () และ printf () คือ sprintf () เขียนข้อมูลลงในอาร์เรย์อักขระขณะที่ printf () เขียนข้อมูลไปยัง stdout ซึ่งเป็นอุปกรณ์เอาต์พุตมาตรฐาน