Siapa pun dapat menjelaskan secara sederhana bahasa Inggris tentang perbedaan antara printf
, fprintf
dan sprintf
dengan contoh-contoh?
Aliran apa ini?
Saya benar-benar bingung antara ketiganya saat membaca tentang "Penanganan File di C".
Siapa pun dapat menjelaskan secara sederhana bahasa Inggris tentang perbedaan antara printf
, fprintf
dan sprintf
dengan contoh-contoh?
Aliran apa ini?
Saya benar-benar bingung antara ketiganya saat membaca tentang "Penanganan File di C".
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 konten FILE
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, dan stderr
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:
$ myprog < inputfile.dat > output.txt 2> errors.txt
Dalam contoh ini, stdin
sekarang menunjuk ke inputfile.dat
, stdout
menunjuk ke output.txt
, dan stderr
menunjuk ke errors.txt
.
fprintf
menulis teks yang diformat ke aliran output yang Anda tentukan.
printf
setara dengan menulis fprintf(stdout, ...)
dan menulis teks berformat ke mana pun aliran output standar saat ini menunjuk.
sprintf
menulis teks yang diformat ke array char
, sebagai lawan aliran.
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.
printf(...)
setara dengan fprintf(stdout,...)
.
fprintf
digunakan untuk output untuk streaming.
sprintf(buffer,...)
digunakan untuk memformat string ke buffer.
Perhatikan ada juga vsprintf
, vfprintf
danvprintf
v
rasa tidak standar
v
rasa sangat jelas dalam standar C.
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)
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 );
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.