Perbedaan antara fprintf, printf dan sprintf?

233

Siapa pun dapat menjelaskan secara sederhana bahasa Inggris tentang perbedaan antara printf, fprintfdan sprintfdengan contoh-contoh?

Aliran apa ini?

Saya benar-benar bingung antara ketiganya saat membaca tentang "Penanganan File di C".

Vishwanath Dalvi
sumber
4
Percobaan dengan mereka dengan menulis beberapa kode sampel. Itu cara yang sangat mudah untuk memahami dengan jelas perbedaan di antara mereka.
Nawaz
14
Lebih suka snprintf () ke sprintf () untuk menghindari luapan buffer konyol.
Maxim Egorushkin
3
Lebih suka stream atau Boost formatters untuk menghindari luapan buffer konyol dan bug jenis tidak aman yang jahat
John Dibling
7
@ Maxim, sementara Anda menaikkan poin yang valid saya akan mengambil keselamatan dalam pengetahuan bahwa buffer saya tidak akan meluap dan meledak aplikasi saya berkeping-keping. Saya hanya akan melihat fungsi-fungsi ini jika stream / boost formatters terbukti menyebabkan kemacetan yang nyata. :)
Moo-Juice
1
@ Maxim: Intinya, tidak perlu. Kode saya bukan hambatan. 5m / detik adalah berapa banyak pesan yang dikirimkan pertukaran, bukan berapa banyak yang dapat kami proses. Jadi mengapa mengoptimalkan secara prematur?
John Dibling

Jawaban:

238

Dalam C, "aliran" adalah abstraksi; dari perspektif program, ini hanyalah produsen (input stream) atau konsumen (output stream) byte. Ini dapat berhubungan dengan file pada disk, ke pipa, ke terminal Anda, atau ke beberapa perangkat lain seperti printer atau tty. The FILETipe berisi informasi tentang sungai. Biasanya, Anda tidak mengacaukan konten FILEobjek secara langsung, Anda hanya meneruskan sebuah pointer ke berbagai I / O rutinitas.

Ada tiga stream standar: stdinadalah pointer ke aliran input standar, stdoutadalah pointer ke aliran output standar, dan stderrmerupakan pointer ke aliran output kesalahan standar. Dalam sesi interaktif, ketiganya biasanya merujuk ke konsol Anda, meskipun Anda dapat mengarahkan mereka untuk menunjuk ke file atau perangkat lain:

$ myprog < inputfile.dat > output.txt 2> errors.txt

Dalam contoh ini, stdinsekarang menunjuk ke inputfile.dat, stdoutmenunjuk ke output.txt, dan stderrmenunjuk ke errors.txt.

fprintf menulis teks yang diformat ke aliran output yang Anda tentukan.

printfsetara dengan menulis fprintf(stdout, ...)dan menulis teks berformat ke mana pun aliran output standar saat ini menunjuk.

sprintfmenulis teks yang diformat ke array char, sebagai lawan aliran.

John Bode
sumber
4
"Ini hanyalah penghasil (aliran input) atau konsumen (aliran keluaran) dari byte." Apakah ini mundur? Tidakkah seorang produser menciptakan (menghasilkan) sesuatu? Bertanya karena saya benar-benar tidak tahu.
Dave Voyles
6
@DaveVoyles: Ini dari perspektif program Anda. Aliran input menghasilkan byte untuk dibaca oleh program Anda; aliran output mengkonsumsi byte yang dihasilkan dari program Anda.
John Bode
153

printfoutput ke aliran output standar ( stdout)

fprintfpergi ke pegangan file ( FILE*)

sprintfpergi ke buffer yang Anda alokasikan. ( char*)

Jus Moo
sumber
40

printf ("format", args) digunakan untuk mencetak data ke output standar yang sering merupakan monitor komputer.

sprintf (char *, "format", args) seperti printf. Alih-alih menampilkan string yang diformat pada output standar yaitu monitor, ia menyimpan data yang diformat dalam string yang ditunjukkan oleh pointer char (parameter pertama). Lokasi string adalah satu-satunya perbedaan antara sintaks printf dan sprint.

fprintf (FILE * fp, "format", args) seperti printf lagi. Di sini, alih-alih menampilkan data pada monitor, atau menyimpannya dalam beberapa string, data yang diformat disimpan pada file yang ditunjuk oleh penunjuk file yang digunakan sebagai parameter pertama untuk fprintf. Penunjuk file adalah satu-satunya tambahan untuk sintaks printf.

Jika file stdout digunakan sebagai parameter pertama di fprintf, maka kerjanya dianggap setara dengan file printf.

Rubal
sumber
24

printf(...)setara dengan fprintf(stdout,...).

fprintf digunakan untuk output untuk streaming.

sprintf(buffer,...) digunakan untuk memformat string ke buffer.

Perhatikan ada juga vsprintf, vfprintfdanvprintf

VGE
sumber
Saya vrasa tidak standar
John Dibling
8
The vrasa sangat jelas dalam standar C.
Fred Foo
@ Larsmans: ah, oke. terima kasih atas koreksinya. Pertanyaan ini pernah ditandai [c ++]
John Dibling
2

Anda juga dapat melakukan hal-hal yang sangat berguna dengan fungsi 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)
Maxim Egorushkin
sumber
+1 memang bermanfaat, tetapi perlu diketahui bahwa vsnprintfini adalah fungsi yang tidak standar. Sebagian besar implementasi yang saya lihat menerapkan ini atau sesuatu seperti itu, tetapi implementasi khusus.
John Dibling
1
@ Larsmans menyebutkan di atas bahwa ini, pada kenyataannya, adalah bagian dari standar C, jadi saya mengambil kembali
John Dibling
2
Apa hubungannya ini dengan C?
onemasse
2

printf

  1. printf digunakan untuk melakukan output pada layar.
  2. sintaks = printf("control string ", argument );
  3. Itu tidak terkait dengan input / output File

fprintf

  1. Fprintf yang digunakannya untuk melakukan operasi tulis pada file yang ditunjuk oleh FILE handle.
  2. Sintaksnya adalah fprintf (filename, "control string ", argument );
  3. Ini terkait dengan input / output file
Amit Vasava
sumber
Jika ini dikutip dari tempat lain, yang terbaik adalah mengutip sumber dengan tautan, tetapi tetap menyimpan teks yang Anda kutip di sini.
SuperBiasedMan
0

fprintfIni terkait dengan stream dimana printfpernyataan serupa dengan fprintftetapi tidak terkait dengan stream, yaitu fprintfterkait file

kavamsi12
sumber
0

sprintf: Menulis data yang diformat ke string karakter dalam memori, bukan stdout

Sintaks sprintf adalah:

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

Sini,

String merujuk ke penunjuk ke buffer di memori tempat data akan ditulis.

Format mengacu pada penunjuk ke string karakter yang mendefinisikan format.

Setiap item adalah variabel atau ekspresi yang menentukan data untuk ditulis.

Nilai yang dikembalikan oleh sprintf lebih besar dari atau sama dengan nol jika operasi berhasil atau dengan kata lain jumlah karakter yang ditulis, tidak termasuk karakter nol terminating dikembalikan dan mengembalikan nilai kurang dari nol jika terjadi kesalahan.

printf: Mencetak ke stdout

Sintaks untuk printf adalah:

printf format [argument]…

Satu-satunya perbedaan antara sprintf () dan printf () adalah sprintf () menulis data ke dalam array karakter, sedangkan printf () menulis data ke stdout, perangkat output standar.

Fahad Ali
sumber