Apakah ada alasan (selain yang sintaksis) yang ingin Anda gunakan
FILE *fdopen(int fd, const char *mode);
atau
FILE *fopen(const char *path, const char *mode);
dari pada
int open(const char *pathname, int flags, mode_t mode);
saat menggunakan C di lingkungan Linux?
fdopen
danopen
ataufopen
danopen
?fopen
adalah bagian dari pustaka C standar,open
bukan. Gunakanfopen
saat menulis kode portabel.open
adalah fungsi POSIX.Jawaban:
Pertama, tidak ada alasan yang sangat baik untuk digunakan
fdopen
jikafopen
merupakan opsi danopen
merupakan pilihan lain yang memungkinkan. Anda seharusnya tidak terbiasaopen
membuka file di tempat pertama jika Anda menginginkanFILE *
. Jadi termasukfdopen
dalam daftar itu tidak benar dan membingungkan karena tidak banyak seperti yang lain. Saya sekarang akan melanjutkan untuk mengabaikannya karena perbedaan penting di sini adalah antara standar CFILE *
dan deskriptor file khusus-OS.Ada empat alasan utama untuk menggunakan
fopen
bukanopen
.fopen
memberi Anda IO buffering yang ternyata jauh lebih cepat dari apa yang Anda lakukanopen
.fopen
tidak terjemahan akhir baris jika file tidak dibuka dalam mode biner, yang dapat sangat membantu jika program Anda pernah porting ke lingkungan non-Unix (meskipun dunia tampaknya konvergen pada LF-only (kecuali jaringan berbasis teks IETF protokol seperti SMTP dan HTTP dan semacamnya)).FILE *
memberi Anda kemampuan untuk menggunakanfscanf
dan fungsi stdio lainnya.open
fungsinya.Menurut pendapat saya, terjemahan akhir baris lebih sering menghalangi Anda daripada membantu Anda, dan penguraiannya
fscanf
sangat lemah sehingga Anda akhirnya terpaksa membuangnya demi sesuatu yang lebih berguna.Dan sebagian besar platform yang mendukung C memiliki
open
fungsi.Itu meninggalkan pertanyaan buffering. Di tempat-tempat di mana Anda membaca atau menulis file secara berurutan, dukungan buffer sangat membantu dan peningkatan kecepatan yang besar. Tapi itu bisa menyebabkan beberapa masalah menarik di mana data tidak berakhir di file ketika Anda mengharapkannya ada di sana. Anda harus mengingat
fclose
ataufflush
pada waktu yang tepat.Jika Anda melakukan pencarian (alias
fsetpos
ataufseek
yang sedikit lebih sulit untuk digunakan dengan cara yang sesuai standar), kegunaan buffering dengan cepat turun.Tentu saja, bias saya adalah bahwa saya cenderung bekerja dengan soket banyak, dan ada fakta bahwa Anda benar-benar ingin melakukan IO non-blocking (yang
FILE *
benar-benar gagal mendukung dengan cara yang masuk akal) tanpa buffering sama sekali dan sering memiliki persyaratan parsing yang kompleks benar-benar mewarnai persepsi saya.sumber
fgets
,fgetc
,fscanf
,fread
), akan selalu membaca seluruh ukuran buffer (4K, 8K atau apa pun yang Anda tetapkan). Dengan menggunakan I / O langsung, Anda dapat menghindarinya. Dalam hal ini lebih baik menggunakanpread
daripada mencari / membaca pasangan (1 syscall, bukan 2).read()
danwrite()
merupakan alasan kelima yang nyaman untuk menggunakan keluarga fungsi libc.ioctl
juga mendukungfileno
panggilan yang mengambilFILE *
dan mengembalikan nomor yang dapat digunakan dalamioctl
panggilan. Berhati-hatilah.FILE *
panggilan terkait dapat berinteraksi secara mengejutkan dengan menggunakanioctl
untuk mengubah sesuatu tentang deskriptor file yang mendasarinya.open()
adalah panggilan os tingkat rendah.fdopen()
mengkonversi deskriptor file os-level ke abstraksi FILE tingkat tinggi dari bahasa C.fopen()
panggilanopen()
di latar belakang dan memberi Anda FILE-pointer secara langsung.Ada beberapa keuntungan menggunakan FILE-objek, bukan deskriptor file mentah, yang mencakup kemudahan penggunaan yang lebih besar tetapi juga keuntungan teknis lainnya seperti buffering bawaan. Terutama buffering umumnya menghasilkan keuntungan kinerja yang cukup besar.
sumber
fopen()
tidak memberikan tingkat kontrol yang sama saat membuka file, misalnya membuat izin, mode berbagi, dan banyak lagi. biasanyaopen()
dan varian memberikan lebih banyak kontrol, dekat dengan apa sistem operasi benar-benar menyediakanmmap
file dan melakukan perubahan dengan I / O normal (luar biasa seperti kedengarannya kita lakukan sebenarnya dalam proyek kami dan untuk alasan yang sangat baik), buffering akan menghalangi.fopen vs terbuka di C
1)
fopen
adalah fungsi perpustakaan sementaraopen
adalah panggilan sistem .2)
fopen
menyediakan IO buffered yang lebih cepat dibandingkanopen
yang non buffered .3)
fopen
adalah portable sementaraopen
tidak portabel ( terbuka adalah spesifik lingkungan ).4)
fopen
mengembalikan pointer ke struktur FILE (FILE *) ;open
mengembalikan bilangan bulat yang mengidentifikasi file.5) A
FILE *
memberi Anda kemampuan untuk menggunakan fscanf dan fungsi stdio lainnya.sumber
open
adalah standar POSIX, jadi ini cukup portabelKecuali Anda bagian dari 0,1% aplikasi yang menggunakan
open
manfaat kinerja sebenarnya, tidak ada alasan kuat untuk tidak menggunakannyafopen
. Sejauhfdopen
menyangkut, jika Anda tidak bermain dengan deskriptor file, Anda tidak perlu panggilan itu.Tongkat dengan
fopen
dan keluarganya metode (fwrite
,fread
,fprintf
, et al) dan Anda akan sangat puas. Sama pentingnya, programmer lain akan puas dengan kode Anda.sumber
Jika Anda memiliki
FILE *
, Anda dapat menggunakan fungsi sepertifscanf
,fprintf
danfgets
lain - lain. Jika Anda baru saja mendeskripsikan file, Anda telah membatasi (tetapi kemungkinan lebih cepat) rutinitas input dan outputread
,write
dll.sumber
Menggunakan open, read, write berarti Anda harus khawatir tentang interaksi sinyal.
Jika panggilan terputus oleh pengendali sinyal, fungsi akan mengembalikan -1 dan mengatur errno ke EINTR.
Jadi cara yang tepat untuk menutup file adalah
sumber
close
, ini tergantung pada sistem operasi. Tidak benar untuk melakukan loop pada Linux, AIX dan beberapa sistem operasi lainnya.open()
adalah panggilan sistem dan khusus untuk sistem berbasis Unix dan mengembalikan deskriptor file. Anda dapat menulis ke deskriptor file menggunakanwrite()
yang merupakan panggilan sistem lain.fopen()
adalah panggilan fungsi ANSI C yang mengembalikan penunjuk file dan portabel untuk OS lainnya. Kita bisa menulis ke penunjuk file menggunakanfprintf
.Di Unix:
Anda bisa mendapatkan pointer file dari deskriptor file menggunakan:
Anda bisa mendapatkan deskriptor file dari penunjuk file menggunakan:
sumber
open () akan dipanggil di akhir setiap fungsi keluarga fopen () . open () adalah panggilan sistem dan fopen () disediakan oleh perpustakaan sebagai fungsi pembungkus agar pengguna mudah digunakan
sumber
Saya berubah menjadi open () dari fopen () untuk aplikasi saya, karena fopen menyebabkan pembacaan ganda setiap kali saya menjalankan fopen fgetc. Bacaan ganda mengganggu apa yang saya coba capai. open () sepertinya melakukan apa yang Anda minta.
sumber
Tergantung juga pada bendera apa yang harus dibuka. Sehubungan dengan penggunaan untuk menulis dan membaca (dan portabilitas) f * harus digunakan, sebagaimana didalilkan di atas.
Tetapi jika pada dasarnya ingin menentukan lebih dari flag standar (seperti bendera rw dan append), Anda harus menggunakan API khusus platform (seperti POSIX terbuka) atau perpustakaan yang mengabstraksi detail ini. Standar-C tidak memiliki flag semacam itu.
Misalnya Anda mungkin ingin membuka file, hanya jika itu keluar. Jika Anda tidak menentukan flag buat, file tersebut harus ada. Jika Anda menambahkan eksklusif untuk dibuat, itu hanya akan membuat file jika tidak ada. Masih banyak lagi.
Sebagai contoh pada sistem Linux ada antarmuka LED yang diekspos melalui sysfs. Itu memperlihatkan kecerahan led melalui file. Menulis atau membaca angka sebagai string mulai dari 0-255. Tentu saja Anda tidak ingin membuat file itu dan hanya menulis kepadanya jika ada. Yang keren sekarang: Gunakan fdopen untuk membaca / menulis file ini menggunakan panggilan standar.
sumber
membuka file menggunakan fopen
sebelum kita dapat membaca (atau menulis) informasi dari (ke) file pada disk kita harus membuka file. untuk membuka file, kami telah memanggil fungsi fopen.
ini cara perilaku fungsi fopen
ada beberapa penyebab saat proses buffering, mungkin waktu habis. jadi sambil membandingkan fopen (tingkat tinggi i / o) untuk membuka (tingkat rendah i / o) panggilan sistem, dan itu lebih cepat lebih tepat daripada fopen .
sumber