ทุกคนสามารถอธิบายในภาษาอังกฤษง่าย ๆ เกี่ยวกับความแตกต่างระหว่าง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และจุดที่จะต้อง  stderrerrors.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 ซึ่งเป็นอุปกรณ์เอาต์พุตมาตรฐาน