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:
"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*)
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.
@ 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(charconst* fmt,...) __attribute__ ((format(printf,2,3)));charconst* what()constthrow(){return msg_;}char msg_[0x800];};
exception_fmt::exception_fmt(charconst* 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 1Aborted(core dumped)
+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
printf digunakan untuk melakukan output pada layar.
sintaks = printf("control string ", argument );
Itu tidak terkait dengan input / output File
fprintf
Fprintf yang digunakannya untuk melakukan operasi tulis pada file yang ditunjuk oleh FILE handle.
Sintaksnya adalah fprintf (filename, "control string ", argument );
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.
Jawaban:
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
FILE
Tipe berisi informasi tentang sungai. Biasanya, Anda tidak mengacaukan kontenFILE
objek secara langsung, Anda hanya meneruskan sebuah pointer ke berbagai I / O rutinitas.Ada tiga stream standar:
stdin
adalah pointer ke aliran input standar,stdout
adalah pointer ke aliran output standar, danstderr
merupakan 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:Dalam contoh ini,
stdin
sekarang menunjuk keinputfile.dat
,stdout
menunjuk keoutput.txt
, danstderr
menunjuk keerrors.txt
.fprintf
menulis teks yang diformat ke aliran output yang Anda tentukan.printf
setara dengan menulisfprintf(stdout, ...)
dan menulis teks berformat ke mana pun aliran output standar saat ini menunjuk.sprintf
menulis teks yang diformat ke arraychar
, sebagai lawan aliran.sumber
printf
output ke aliran output standar (stdout
)fprintf
pergi ke pegangan file (FILE*
)sprintf
pergi ke buffer yang Anda alokasikan. (char*
)sumber
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.
sumber
printf(...)
setara denganfprintf(stdout,...)
.fprintf
digunakan untuk output untuk streaming.sprintf(buffer,...)
digunakan untuk memformat string ke buffer.Perhatikan ada juga
vsprintf
,vfprintf
danvprintf
sumber
v
rasa tidak standarv
rasa sangat jelas dalam standar C.Anda juga dapat melakukan hal-hal yang sangat berguna dengan fungsi vsnprintf ():
sumber
vsnprintf
ini adalah fungsi yang tidak standar. Sebagian besar implementasi yang saya lihat menerapkan ini atau sesuatu seperti itu, tetapi implementasi khusus.printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sumber
fprintf
Ini terkait dengan stream dimanaprintf
pernyataan serupa denganfprintf
tetapi tidak terkait dengan stream, yaitufprintf
terkait filesumber
sprintf: Menulis data yang diformat ke string karakter dalam memori, bukan stdout
Sintaks sprintf adalah:
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:
Satu-satunya perbedaan antara sprintf () dan printf () adalah sprintf () menulis data ke dalam array karakter, sedangkan printf () menulis data ke stdout, perangkat output standar.
sumber